스리랑카 보안전문가 오산다 말리스(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 프로세스가 종료된다.
뿐만 아니라 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 참조
'(주)이글루시큐리티'는 (이하 '회사'는) 고객의 개인정보를 중요시하며, "정보통신망 이용촉진 및 정보보호 등에 관한 법률"을 준수하고 있습니다.
회사는 개인정보취급방침을 통하여 고객이 제공하는 개인정보가 어떠한 용도와 방식으로 이용되고 있으며, 개인정보보호를 위해 어떠한 조치가 취해지고 있는지 알려드립니다.
본 방침은 2016년 9월 23일부터 시행됩니다.
수집항목 : 이름, 회사명, 이메일, 연락처
개인정보의 수집 및 이용목적
회사는 수집한 개인정보를 다음의 목적을 위해 활용합니다.
- DEMO 요청 : 사용자와의 신원확인 및 처리사항 전달
개인정보의 보유 및 이용기간
회사는 개인정보 수집 및 이용목적이 달성된 후에는 예외 없이 해당 정보를 바로 파기합니다.
개인정보의 파기
회사는 원칙적으로 개인정보 수집 및 이용목적이 달성된 후에는 해당 정보를 바로 파기합니다. 방법은 다음과 같습니다.
- 파기방법 : 전자적 파일형태로 저장된 개인정보는 기록을 재생할 수 없는 기술적 방법을 사용하여 삭제합니다.
개인정보 제공
회사는 이용자의 개인정보를 원칙적으로 외부에 제공하지 않습니다. 다만, 아래의 경우에는 예외로 합니다.
- 고객이 사전에 동의한 경우
- 법령의 규정에 따르거나, 수사 목적으로 법령에 정해진 절차와 방법에 따라 수사기관의 요구가 있는 경우
수집한 개인정보의 위탁
회사는 고객님의 동의없이 고객님의 정보를 외부 업체에 위탁하지 않습니다.
이용자 및 법정대리인의 권리와 그 행사방법
이용자 및 법정 대리인은 언제든지 등록된 자신 혹은 당해 만 14세 미만 아동의 개인정보를 조회하거나 수정할 수 있으며 가입 해지를 요청할 수도 있습니다. 이용자 혹은 만 14세 미만 아동의 개인정보 조회ㆍ수정을 위해서는 ‘개인정보변경’(또는 ‘회원정보수정’ 등)을 가입해 지(동의철회)를 위해서는 “회원탈퇴”를 클릭하여 본인 확인 절차를 거치신 후 직접 열람, 정정 또는 탈퇴할 수 있습니다. 혹은 개인정보관리책임자에게 서면, 전화 또는 이메일로 연락하시면 바로 조치하겠습니다. 귀하가 개인정보의 오류에 대한 정정을 요청하신 경우에는 정정을 완료하기 전까지 당해 개인정보를 이용 또는 제공하지 않습니다. 또한, 잘못된 개인정보를 제3자에게 이미 제공한 경우에는 정정 처리결과를 제3자에게 바로 통지하여 정정이 이루어지도록 하겠습니다. 이용자 혹은 법정 대리인의 요청으로 해지 또는 삭제된 개인정보는 “회사가 수집하는 개인정보의 보유 및 이용 기간”에 명시된 바에 따라 처리하고 그 외의 용도로 열람 또는 이용할 수 없도록 처리하고 있습니다.
개인정보 자동수집 장치의 설치, 운영 및 그 거부에 관한 사항
쿠키 등 인터넷 서비스 이용 시 자동 생성되는 개인정보를 수집하는 장치를 운영하지 않습니다.
개인정보에 관한 민원서비스
회사는 고객의 개인정보를 보호하고 개인정보와 관련한 불만을 처리하기 위하여 아래와 같이 관련 부서 및 개인정보보호책임자를 지정하고 있습니다.
고지의 의무
정부의 정책 또는 보안기술의 변경, 개인정보 위탁업체 등의 변경에 따라 내용의 추가ㆍ삭제 및 수정이 있을 시에는 개정 전에 홈페이지 “소식” 게시판을 통해 고지합니다.
재화나 서비스의 홍보 및 판매 권유, 기타 이와 관련된 목적으로 개인정보를 이용하여 정보주체에게 연락할 수 있습니다.
고객서비스 담당부서 : 마케팅기획팀
전화번호 : 02-6715-2372
이메일 : mkt@igloosec.com
개인정보보호책임자 성명 : 이정원 (마케팅기획팀 팀장)
전화번호 : 02-6715-2372
이메일 : mkt@igloosec.com
귀하께서는 회사의 서비스를 이용하시며 발생하는 모든 개인정보보호 관련 민원을 개인정보관리책임자 혹은 담당 부서로 신고하실 수 있습니다.
회사는 이용자들의 신고사항에 대해 신속하게 충분한 답변을 드릴 것입니다.
기타 개인정보침해에 대한 신고나 상담이 필요하신 경우에는 아래 기관에 문의하시기 바랍니다.
원하시는 계정으로 로그인 후 댓글을 남겨 주세요.