[Anti-Exploit] 파워포인트 제로데이 공격 해부
Windows OLE 원격 코드 실행 취약점 CVE-2014-4114
이메일 첨부 파일로 발송된 악의적인 파워포인트를 이용한 제로데이 공격이 발생했다. 이 취약점은 사용자가 특수하게 조작된 윈도(Windows) OLE 개체를 포함하는 파일을 열 경우 원격 코드가 실행되도록 하는 취약점(CVE-2014-4114)이다. OLE(Object Linking & Embedding)란 응용 프로그램이 복합 데이터를 작성 및 편집할 수 있는 기능 등 데이터와 기능을 공유할 수 있게 하는 기술. 이 취약점을 악용하면 공격자는 사용자와 동일한 권한을 획득하게 된다. 마이크로소프트는 지난 10월 정기 업데이트를 통해 이 취약점에 대한 보안 업데이트(MS14-060)를 제공했다. 이 글에서는 이 취약점(CVE-2014-4114)의 상세 분석을 통해 동작 원리를 소개하고자 한다.
미국의 보안 업체 아이사이트 파트너즈(iSight Partners)는 2014년 10월 14일 러시아의 사이버 스파이 조직이 북대서양조약기구(NATO), 유럽연합(EU), 유럽 통신 회사, 에너지 업체 등을 대상으로 공격하는데 사용했다는 취약점을 공개했다. 이 취약점은 윈도 오브젝트 패키저(Windows Object Packager)에 원격 코드를 실행할 수 있는 디자인 상의 결함으로 발생한다. 또한 디자인 상의 결함으로 발생하는 취약점이기 때문에 대부분의 악성코드에 존재하는 쉘코드나 ROP(Return-Oriented Programming) 체인, 힙스프레이(Heap splay) 등과 같은 것이 존재하지 않더라도 공격이 이루어질 수 있고, 단순한 방법으로 악성코드를 제작할 수 있다.
CVE 참고문서
CVE-2014-4114
Ref1. http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-4114
취약점 발생 모듈
모듈명: packager.dll
개요: OLE(Object linking and embedding) 포맷 처리 관련 모듈
취약점이 발생할 수 있는 프로그램
• Microsoft Windows Vista
• Microsoft Windows 7
• Microsoft Windows 8
• Microsoft Windows 8.1
• Microsoft Windows RT
• Microsoft Windows RT 8.1
• Microsoft Windows Server 2008
• Microsoft Windows Server 2008 R2
• Microsoft Windows Server 2012
• Microsoft Windows Server 2012 R2
취약점 발생 원인
윈도 OLE 패키지 매니저(Windows OLE package Manager) 역할을 하는 packager.dll가 파일에 내장되어 있는 OLE 개체 내의 INF 파일을 사용자의 인지 없이 원격에서 다운로드하고 실행하도록 되어 있다. 버퍼오버플로우나 Use After Free(할당된 메모리 해제 후 사용) 공격은 의도되지 않은 동작을 하도록 프로그램의 흐름을 변조시키는 방법이지만, 이 취약점은 단순히 디자인 상의 오류로 개발 시에 설계가 잘못된 것이다.
익스플로이트(Exploit) 동작 원리 상세 분석
분석 대상 샘플 파일
분석을 위하여 다음과 같이 POC (Proof of Concept) 파일을 제작하였다.
poc.ppsx (취약점 파일)
poc.gif : 취약점을 통해 배포되는 악성코드 → notepad.exe 로 대체함
poc.inf : 취약점을 통해 다운로드한 악성코드를 실행하기 위한 inf 파일
참고로 실제 러시아 사이버 스파이 조직이 APT 공격에 사용한 악성 파일의 MD5는 330e8d23ab82e8a0ca6d166755408eb1이다. 하지만 이 악성 파일은 inf, gif 파일을 받아오는 네트워크 주소가 유효하지 않아서 악성 행위가 동작하지 않는다. 따라서 본 문서 작성을 위해, 유효한 네트워크 주소로 변경하여 악성 행위가 동작하도록 수정한 POC를 분석한다. APT 공격에 사용된 악성 파일과 이 POC는 단지 네트워크 주소와 파일 이름만 다르고 나머지는 모두 동일하다는 점을 밝혀둔다.
분석 환경
OS: Windows 7
Packager.dll (version 6.1.7600.16385)
[그림 1] 취약점이 존재하는 Packager.dll
취약점 상세 분석
1. poc.ppsx 파일 분석 분석
poc.ppsx 파일은 ZIP으로 압축된 OpenXML 파일 형식을 이용하고 있다. 따라서 압축을 해제하면 [그림 2]와 같이 여러 개의 폴더의 트리 구조와 xml 파일, 내장된 OLE 형식의 파일들을 확인할 수 있다.
[그림 2] ZIP 압축 해제한 OpenXML 형식의 poc.ppsx 파일
이 중 ppt\slides 폴더 내에 슬라이드에 대한 정보가 저장되어 있고, [그림 3],[그림 4]와 같이 구성된다.
[그림 3] ppt\slides 폴더
[그림 4] ppt\slides\_rels 폴더
해당 샘플은 1장의 슬라이드로 구성되어 있고, 이에 대한 정보는 slide1.xml과 slide1.xml.rels에 저장되어 있다. 여러 장의 슬라이드로 구성되어 있다면, 매 슬라이드마다 슬라이드 번호 N이 붙은 slideN.xml, slideN.xml.rels 파일이 존재하게 된다.
1번 슬라이드와의 연관 정보를 표현하고 있는 slide1.xml.rels 의 내용은 [그림 5]와 같다.
[그림 5] Slide1.xml.rels의 내용
1번 슬라이드에는 두 개의 OLE 개체가 포함되어 있고, ID는 “rId3”, “rId5”이며, 그 OLE 개체는 embeddings 폴더에 oleObject1.bin, oleObject2.bin이라는 이름으로 존재한다는 것을 확인할 수 있다.
slide1.xml 에는 슬라이드에 대한 세부 정보가 기술되어 있는데, 그 중 내장된 OLE 개체에 대한 부분은 [그림 6]과 같다.
[그림 6] slide1.xml에 내장된 OLE 개체(rId3, rId5) 정보
[그림 7] 내장된 OLE 개체(rId3, rId5) 에 대한 동작 정의
두 개의 OLE 개체 중 rId3 개체에 대해서는 “Verb”가 “-3”으로 정의 되어 있고, rId5 개체에 대해서는 “Verb”가 “3”으로 정의되어 있다. “Verb” “-3”은 OLE 개체에 대해서 아무 동작도 하지 않는다는 것을 의미하고, “3”은 개체에 대한 적절한 핸들러를 찾아서 실행하는 것을 의미한다.
2. 내장된 OLE 파일 분석
OLE 파일의 분석은 Microsoft에서 OLE 형식의 구조를 살펴 볼 수 있도록 개발한 OffVis 라는 툴을 이용한다.
A. oleObject1.bin (rId3)
아래 [그림 8]과 같이 “OLE10Native”라는 이름을 가진 OLE 디렉터리 엔트리를 확인해보면 poc.jpg의 경로가 지정되어 있다. 앞서 언급한 것과 같이 poc.jpg라는 이름과 poc.jpg가 위치해 있는 SMB 주소는 직접 수정한 것이다.
[그림 8] oleObject1.bin 내의 악성파일 경로 확인
B. oleObject2.bin (rId5)
위와 동일하게 “OLE10Native”라는 이름의 OLE 디렉터리 엔트리 내에 [그림 9]과 같이 poc.inf의 경로가 지정되어 있다.
[그림 9] oleObject2.bin 내의 악성파일 경로 확인
3. packager.dll 내부 동작 분석
A. CPackage:: OLE2MPlayerReadFromStream( ) 함수
Packager.dll에서는 OLE 파일 내의 SMB 서버 주소의 파일을 미디어 파일 타입으로 처리하면서, CPackage:: OLE2MPlayerReadFromStream( )를 통해 해당 파일을 로드 한다. 내부적으로 CopyFileW( ) 함수를 통해 임시 폴더에 다운로드한다.
[그림 10] CopyFileW( ) 함수를 이용하여 SMB 서버에서 poc.jpg 다운로드
[그림 11] CopyFileW( ) 함수를 이용하여 SMB 서버에서 poc.inf 다운로드
[그림 12] poc.inf, poc.jpg 파일 다운로드
B. CPackage::DoVerb( ) 함수
CPackage::DoVerb( ) 함수는 Verb 값에 따라 OLE 파일의 동작 여부를 수행하는 함수이다. 이미 앞에서 rId3 개체에 대해서는 “Verb”가 “-3”으로 정의되어 아무 동작도 수행하지 않고, rId5 개체에 대해서는 “Verb”가 “3”으로 정의되어 적절한 핸들러를 찾아서 실행한다고 언급하였다. 곧 SMB 서버에서 CopyFileW( ) 함수를 통해 다운받은 poc.jpg에 대해서는 아무 동작도 수행하지 않고, poc.inf에 대해서는 적절한 핸들러를 찾아서 실행하게 된다.
[그림 13]은 poc.jpg에 대한 처리 과정이다. 오른쪽 아래 스택을 보면, 첫 번째 인자가 0xFFFFFFFD인 것을 확인할 수 있는데, 이 값이 “Verb”로 “-3”이다. 코드를 확인하면 “-2”보다 작은 경우에 바로 함수가 종료된다.
[그림 13] poc.jpg 에 대한 “Verb” “-3” 처리 과정
[그림 14]는 poc.inf에 대한 처리 과정이다. 이 경우에는 첫 번째 인자 “Verb”가 “3”인 것을 확인할 수 있다.
[그림 14] poc.inf 에 대한 “Verb” “3” 처리 과정
이 후 [그림 15]와 같이 CreateProcessW( ) 함수를 통해 poc.inf를 InfDefaultInstall.exe로 실행하는 것을 확인할 수 있다.
[그림 15] poc.inf 가 실행되는 과정
4. poc.inf 분석 및 실행
[그림 16] poc.inf 파일 내용
poc.inf 의 내용으로 보아 InfDefaultInstall.exe로 poc.inf 가 실행되면,
① poc.jpg.exe 파일 삭제(해당 공격이 두 번 이상 발생한 경우, 이전에 받아져 있던 poc.jpg.exe를 삭제하기 위함)
② poc.jpg를 poc.jpg.exe로 이름 변경
[그림 17] poc.jpg.exe 이름 변경
③ HKLM 아래 RunOnce 키 생성하고 poc.jpg.exe 등록
[그림 18] HKLM 아래 poc.jpg.exe 등록
④ infDefaultInstall.exe에 의해 runOnce.exe 실행
[그림 19] runOnce.exe 실행
⑤ poc.jpg.exe 실행
[그림 20] poc.jpg.exe 실행
⑥ infDefaultInstall.exe에 의해 최종적으로 poc.jpg.exe 실행 완료 후, RunOnce 레지스트리 삭제
[그림 21] RunOnce 레지스트리 삭제
지금까지 CVE-2014-4114 상세 분석을 통해 익스플로잇 동작 원리를 살펴보았다. 안랩의 지능형 위협 대응 솔루션인 AhnLab MDS는 고도화된 익스플로잇 탐지 기술을 적용한 DICA(Dynamic Intelligent Content Analysis)를 통해 해당 취약점 탐지가 가능하다. @
- AhnLab네트워크 개발실 김희승 선임 연구원