보안정보
전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.
MySQL DoS 취약점(CVE-2015-4870)분석
2016.07.04
12,580
보안관제사업부 보안분석팀 김미희
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 이상 버전 |
[표 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 공격을 수행할 수 있다.
[ 테스트 환경 ]
|
공격에 앞서 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; |
[표 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