보안정보
전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.
MySQL Remote Root Code Execution 취약점(CVE-2016-6662) 분석
2016.11.02
21,451
보안관제사업부 보안분석팀 이권혁
1. 개요
대중적으로 많이 사용되고 있는 데이터베이스인 MySQL에서 원격에서 루트 권한으로 코드를 실행할 수 있는 취약점(CVE-2016-6662)이 발견되었다. CVE-2016-6662은 MySQL 기본 설치로 사용하는 로깅 기능을 악용해 MySQL 설정 파일(my.cnf)에 악의적인 설정을 주입하여 원격 및 권한 상승(루트 권한) 공격이 가능한 취약점이며, SQL Injection 취약점과 함께 사용할 경우 MySQL 서버를 손상시킬 수 있다. 해당 취약점의 공격코드는 일부분만 공개되었지만 공격에 따른 영향도가 높다고 판단됨에 따라 이번 호에서는 CVE-2016-6662 취약점에 대해서 분석해 보았다.
2. 영향 받는 소프트웨어
CVE |
영향 받는 버전 |
보안패치 버전 |
CVE-2016-6662 |
MySQL 5.5.51 및 이전 버전 |
MySQL 5.5.52 이상 |
MySQL 5.6.32 및 이전 버전 |
MySQL 5.6.33 이상 |
|
MySQL 5.7.14 및 이전 버전 |
MySQL 5.7.15 이상 |
3. 공격 원리
CVE-2016-6662 취약점 공격 원리를 설명하기 앞서 MySQL 3.23.55 이전 버전에는 MySQL 설정 파일인 my.cnf를 아래와 같은 간단한 문구를 이용해 덮어쓸 수 있는 취약점이 존재하였다.
이 취약점은 MySQL 3.23.55 이후 버전에서 패치되어 기존 구성 파일을 OUTFILE/DUMPFILE 구문을 이용하여 덮어쓰거나 로드하지 못하도록 보호 기능이 구현되었으나, CVE-2016-6662 취약점을 이용해 이러한 보호 기능을 우회 할 수 있음이 확인되었다.
CVE-2016-6662 취약점은 SELECT나 FILE 권한만을 가진 일반 사용자 계정으로도 기본 설정으로 설치된 MySQL 로깅 기능에 접근할 수 있으면 MySQL 설정 파일을 원격에서 악의적인 설정을 주입할 수 있다.
취약한 버전인 MySQL 5.6.32환경에서 아래와 같은 방법으로 로깅 기능을 사용하여 SQL Query를 입력하면 정상적으로 실행할 수 있는 것을 확인할 수 있다.

[그림 1] SQL Query 입력 가능
만약 공격자가 로깅 설정에 접근하기 위한 관리자 권한을 가지지 못하고 FILE 권한을 추가할 수 있는 일반 사용자 권한만을 가졌다 해도 아래와 같은 방법으로 악의적인 Trigger payload를 작성할 수 있다.
작성된 Trigger payload는 활성화되어 사용 중인 테이블의 Trigger 파일을 아래와 같은 구문을 사용할 수 있고 이 같은 Trigger는 테이블이 정리될 때 로드 된다. 이 Trigger 코드는 “…DEFINER=`root`@`localhost`…” 구문으로 인해 관리자 권한으로 실행되기 때문에 일반 사용자 계정임에도 불구하고 general_log를 설정하도록 수정할 수 있다.

악의적인 Trigger 코드가 실행되면 아래 그림과 같이 MySQL 설정 파일에 “malloc_lib=[경로]”가 주입되며 MySQL default Package인 mysqld_safe 데몬이 재실행될 때 주입된 경로는 malloc_lib 변수로 라이브러리 경로를 참조하게 된다.
[그림 2] my.cnf 설정 파일에 malloc_lib 경로 주입
mysqld_safe의 다양한 기능 중 하나는 MySQL 서버가 시작하기 전에 공유한 라이브러리를 사전에 불러올 수 있기 때문에 이 라이브러리는 malloc_lib 과 같이 라이브러리 위치를 매개 변수를 이용하여 설정할 수 있다.
이와 같이 MySQL 설정 파일에 악의적인 설정을 주입하여 mysqld_safe 데몬이 실행될 때 설정 파일에 주입된 경로를 불러오기에 임의의 코드를 실행할 수 있다.
[그림 3] mysqld_safe 스크립트의 malloc_lib 기능
4. 취약점 공격방법
일부 공개된 CVE-2016-6662공격코드를 이용하면 MySQL에 연결하지 않고 원격에서 루트 권한으로 Shell을 획득 할 수 있다.
공격에 앞서 MySQL 설정 파일을 /var/lib/mysql/에 복사한 후, 소유자를 MYSQL로 설정한 후 다음과 같이 데이터베이스를 생성하고 일반 사용자 계정에 SELECT, INSERT, CREATE 권한을 부여한다.
또한 MySQL 서버에서 공격자 PC와 리버스 커넥션이 이루어지기 위해 mysql_hookandroot_lib.c 파일의 “#define ATTACKERS_IP”의 값을 공격자 IP로 수정한다.
[그림 4] mysql_hookandroot_lib.c 소스 코드 수정
모든 설정이 끝났다면 공격자는 일부 권한만 존재하는 일반 계정으로 접근하여 MySQL 설정 파일에 악의적인 설정을 주입하는 Trigger payload를 작성한 뒤, DUMPFILE을 이용하여 Trigger 파일을 생성할 수 있다.
[그림 5] 악의적인 설정을 주입하는 Trigger 파일 생성
또한 공격자와 데이터베이스 서버 간 리버스 커넥션이 이루어지기 위한 payload를 작성한 뒤, 위와 동일한 방식으로 DUMPFILE을 이용하여 mysql_hookandroot_lib.so 파일을 생성 한다.
[그림 6] 리버스 커넥션이 이루어지기 위한 파일 생성
공격자가 생성한 Trigger 파일이 로드될 수 있도록 테이블을 생성한 뒤, INSERT 구문을 사용하여 생성한 테이블에 호출하게 되면 Trigger 파일에 입력된 악의적인 설정이 MySQL 설정 파일인 my.cnf에 주입하게 된다.
[그림 7] my.cnf 설정 파일에 악의적인 설정 주입 확인
이후 MySQL 서비스가 재시작 할 때, mysqld_safe 데몬은 MySQL 설정 파일인 my.cnf에 주입된 malloc_lib 경로를 불러오게 되며 mysql_hookandroot_lib.so 파일이 실행하여 공격자는 데이터베이스 서버의 루트 권한을 획득하게 된다.
[그림 8] mysqld_safe 스크립트 실행 시 mysql_hookandroot_lib.so 호출
[그림 9] 관리자 권한 획득 성공
위와 같은 방식으로 직접 공격 코드를 생성 및 주입하는 공격 방법 이 외에 공개된 공격코드를 이용하여 공격이 가능하다. 아래와 같이 명령어를 입력하여 데이터베이스 서버에 악의적인 설정 주입 및 리버스 커넥션이 이루어지기 위한 mysql_hookandroot_lib.so 파일 생성이 가능하다.
[그림 10] CVE-2016-6662 POC 중 일부
[그림 11] CVE-2016-6662 POC 실행 모습
5. 취약점 탐지방법
CVE-2016-6662 취약점 공격여부를 시스템상에서 탐지하기 위해서는 MySQL의 general_log를 확인하면 알 수 있다. 취약점이 존재하는 MySQL 5.6.32에서 공격코드를 실행하는 경우 [그림 5-12]와 같이 general_log_file에서 공격코드를 인지할 수가 있다.
[그림 12] MySQL 5.6.32 버전에서 general_log 확인
6. 대응방안
CVE-2016-6662 취약점을 조치하기 위해서는 아래와 같은 방법이 존재한다.
1) MySQL Update
- MySQL 5.5.52 이상, MySQL 5.6.33 이상, MySQL 5.7.15 이상으로 업데이트
2) IDS(snort)에서 탐지
- IDS 탐지 Rule을 이용하여 경보 설정을 하고 경보 발생 시 확인 후 IP 차단

[그림 4-13] IDS(Snort) 탐지 이벤트 확인
7. 참고자료
[1] MySQL-Exploit-Remote-Root-Code-Execution-Privesc-CVE-2016-6662
[2] CVE-2016-6662 Exploit
http://legalhackers.com/exploits/0ldSQL_MySQL_RCE_exploit.py
http://legalhackers.com/exploits/mysql_hookandroot_lib.c
[3] MySQL远程代码执行/提取的分析与实践(CVE-2016-6662)
https://www.yunweidashi.com/view-92754834056b4f03b8e9785073eec2ee-0aa857ef6dd142f988ef0e27623 41e9a.html
[4] CVE-2016-6662