취약점 분석 보고서 [ Adobe Flash Player 11.3 Kern Table Parsing Integer Overflow - CVE-2012-1535 ] 2012-08-23 RedAlert Team 안상환
목 차 1. 개 요... 1 1.1. 배경... 1 1.2. 요약... 1 1.3. 정보... 2 1.4. 대상시스템... 2 1.5. 원리... 2 2. 공격 기법 및 기본 개념... 3 2.1. Heap Spray... 3 2.2. Font... 4 3. 공 격... 5 3.1. 시나리오... 5 3.2. 대상 애플리케이션... 6 3.3. 공격 테스트... 6 4. 공격 코드 분석... 9 4.1. 패킷 추출... 9 4.2. e7zlm45yjdtof0.html... 9 4.3. pay.txt... 9 4.4. e7zlm45yjdtof0o0cfim1x0wk.swf... 10 5. 상세 분석... 14 5.1. Heap Spray... 14 5.2. Parsing 취약성 확인... 18 6. 결 론... 22 7. 대응 방안... 22 8. 참고... 23
1. 개 요 1.1. 배경 최근 농협 전산망 해킹, 현대 캐피탈 해킹에 의한 175 만 개인정보 유출, SK 컴즈 해킹에 의한 3,500 만 명의 개인정보 유출, 이란 원자력 발전 시설 해킹, 미국 국립 오크리지연구소 해킹에 의한 기술데이터 유출 등 매우 심각한 보안 사고들이 국내외에서 연이어 발생하고 있습니다. 국내외 대기업 외에도 대부분의 중소기업 또한 이러한 보안 위협에 그대로 노출된 실정입니다. 이러한 국내외의 보안사고들을 과거 보안사고와 비교하여볼 때, 개인의 실력 과시 목적이 아닌 정부 또는 특정 회사의 중요정보를 획득하기 위한 특수 조직에 의한 공격으로 특정 타깃에 대한 장기적이고 지속적인 공격 양상을 보이고 있습니다. 이와 같이 특수 목적을 가진 조직이 하나의 타깃에 대한 다양한 IT 기술을 이용하여 지속적으로 정보를 수집하고 취약점을 파악하여 이를 바탕으로 피해를 끼치는 공격인 APT(Advanced Persistent Threat) 공격이라고 합니다. 이러한 APT 공격 기본적으로 해당 취약점에 대한 패치가 이루어지기 전에 행해지는 0-day 공격 과 해당 취약점에 대한 패치는 이루어졌으나 사용자가 패치를 수행하지 않아 존재하는 취약점을 이용하는 1-day Attack 에 기초를 두고 있습니다. 그 예로, 원격 데스크탑 연결 취약점 공격이나 일반 사용자들이 업데이트를 크게 중요시 하지 않는 멀티미디어 취약점들이 악용되고 있습니다. 1.2. 요약 CVE-2012-1535 취약점은 Adobe Flash Player 11.3 Font Parsing Code Execution 혹은 Adobe Flash Player 11.3 Kern Table Parsing Integer Overflow 라는 이름으로 2012 년 8 월 14 일 공개된 취약점이며, 특수하게 제작된 SWF 파일을 통해 임의의 코드 실행 및 서비스 거부를 발생 시킬 수 있는 취약점 입니다. 취약한 버전을 사용하는 모든 사용자에게 공격이 유효하며 Adobe 사에서 제공하는 패치를 통해 해당 취약점을 제거할 수 있습니다. 1
1.3. 정보 취약점 이름 Adobe Flash Player 11.3 Kern Table Parsing Integer Overflow (CVE-2012-1535) 최초 발표일 2012 년 8 월 14 일 문서 작성일 2012 년 8 월 23 일 버전 11.3.300.270 이하 버전 현재 상태 패치됨 (2012.08.17) Vender Adobe Author Sinn3r 공격 범위 Remote 공격 유형 Integer Overflow 표 1. 취약점정보 1.4. 대상시스템 대상 애플리케이션은 Windows XP SP3 에서 테스트를 하였고, 아래는 표는 영향을 줄 수 있는 시스템 목록입니다. Flash Player 11.3.300.270 이전 버전 (Windows / Macintosh) Flash Player 11.3.300.270 이전 버전 (Network Distribution) Flash Player 11.2.202.236 이전 버전 (Linux) Flash Player 11.3.300.270 이전 버전 (Chrome User) 표 2. 취약 시스템 1.5. 원리 CVE-2012-1535 취약점은 Flash Player 에서 조작된 Font 파일을 파싱하는 과정에서 정상적이지 않은 주소를 참조하게 되어 발생한 오류로 임의의 코드 및 서비스 거부를 발생 시 킬 수 있는 취약점 입니다. 조작된 Font 의 Kern Table 의 데이터를 참조하는 과정에서 해당 취약점이 유발되는 것이라 추정되며 Heap Spraying 기법을 이용하여 임의의 코드를 예측 가능한 메모리 영역에 삽입한 다음 플래시 취약점을 유발시켜 임의의 코드를 실행 할 수 있습니다. [그림 1] 취약점 원리 개요도 2
2. 공격 기법 및 기본 개념 2.1. Heap Spray Heap Spray 기법은 전혀 새로운 기법이 아닙니다. 공격코드 전송 기술 중 하나입니다. Wikipedia 에 따르면 2001 년 (MS01-033)취약점에서 Heap Spray 가 거론된 적이 있었으며 이후 2004 년 Skylined 의 Internet Explorer ifame Tag 취약점에서 Heap Spray 기법이 사용되었습니다. 많은 Exploit Code 에서 Heap Spray 기법이 사용되지만 이 기법은 취약점을 유발할 수 있는 공격 기법은 아니며 단순히 공격코드를 전송하는 기술 중 하나일 뿐입니다. 오늘날, 많은 시간이 지났음에도 불구하고 여전히 Heap Spray 기법은 Browser Exploit 에서 공격코드를 전송할 때 가장 많이 사용되고 있습니다. 이러한 기법은 다음과 같은 특징을 이용합니다. 첫째, 공격자가 할당 할 수 있는 Heap 영역은 한정되어 있습니다. 둘째, 공격자는 스크립트 언어(Java Script, VB Script, Action Script)를 이용하여 Heap 영역을 할당할 수 있습니다. Heap Spray 기법은 Nop 과 임의의 코드로 구성된 Chunk 라는 블록을 Heap 영역에 여러 번 할당하여 예측 가능한 주소(0x0a0a0a0a, 0x0b0b0b0b, 0x0c0c0c0c)에 임의의 코드가 위치할 수 있도록 하는 기법입니다. [그림 2] Heap Spray 원리 3
2.2. Font 폰트(Font)는 컴퓨터를 통해 모니터나 프린터 등의 출력 장치에 출력 되는 글자의 모양, 혹은 미리 디자인된 여러 가지 스타일과 크기의 글자를 보관해 놓은 일종의 문자 라이브러리로 컴퓨터에서 사용되는 모든 문자의 모양과 크기에 대한 정보를 담고 있습니다. 운영체제에서 기본적으로 제공하는 폰트는 System Font 라고 불리고 애플리케이션에서 포함되어 컴파일 된 폰트는 Embedded Font 라고 불립니다. System Font 는 사용하기 편하지만 사용자의 사용환경에 따라 폰트가 설치되어 있지 않다면 글씨가 안 보이는 일이 발생할 수 있습니다. 대신 Embedded Font 는 애플리케이션에 포함되기 때문에 어떤 사용자가 애플리케이션을 사용하든지 항상 폰트를 사용한 글자를 볼 수 있습니다. 예를 들어 한글에 관련된 폰트를 애플리케이션에 포함시켜버리면 시스템에 한글 폰트가 전혀 없는 아랍국가에 있는 사용자도 애플리케이션 실행 시 문제없이 한글을 볼 수 있습니다. 또한 Embedded Font의 경우 System Font 에 비해 Anti-Aliasing, 회전 등 다양한 효과를 줄 수 있다는 장점을 가지고 있습니다. 하지만, Embedded Font 는 애플리케이션 자체에 포함하는 것이므로 애플리케이션이 무거워진다는 단점이 있습니다. 무거워진 애플리케이션은 결국 사용자들의 시간과 인내의 한계점에 도달하게 할지도 모릅니다. 이러한 문제점을 해결하기 위해서는 Embedded Font 를 애플리케이션 내부에 포함하지 않고 따로 폰트만을 담은 SWF 파일을 만들어 애플리케이션이 실행되는 중간에 필요한 폰트를 로드 할 수 있도록 설계하는 방법이 있습니다. Font은 다양한 종류(Digital Font, Screen Font, Print Font, Bitmap Font, Outline Font, PostScript Font, True Type Font, ATM Font, Open Type Font)의 포맷으로 존재합니다. 그 중 Open Type Font 는 최근 MS 와 Adobe 사에서 합작으로 개발한 Open Type 기술을 적용한 Font이며 윈도우와 매킨토시환경에서 ATM 이나 다른 Font 매니저 없이 사용할 수 있는 장점을 가지고 있습니다. [그림 3] OpenType Font(OTF) 개요도 4
3. 공 격 3.1. 시나리오 1 공격자는 피해자의 접속을 유도할 쇼핑몰의 Index페이지에 악성코드를 삽입합니다. 2 피해자는 쇼핑몰 사이트에 접속합니다. 3 공격자가 삽입한 악성코드가 피해자의 웹 브라우저상에서 동작하게 됩니다. 4 피해자는 자신이 의도하지 않은 웹 페이지(실제 공격용 웹 사이트)로 접속을 시도하게 됩니다. 5 웹 페이지 접속과 동시에 악성 플래시 파일이 실행됩니다. 6 CVE-2012-1535 취약점이 유발되고 공격자가 정의한 임의의 코드(리버스 커넥션)가 실행됩니다. 7 임의의 코드가 실행되고 피해자 시스템은 공격자 시스템으로의 접근 및 리버스 커넥션을 수립하게 되고 최고 관리자 권한을 탈취 당하게 됩니다 [그림 4] 공격 시나리오 5
3.2. 대상 애플리케이션 1 대상 애플리케이션은 Adobe Flash Player 11.3.300.257 버전에서 테스트하였습니다. [그림 5] 대상 애플리케이션 버전 3.3. 공격 테스트 1 Metasploit 에서 제공하는 CVE-2012-1535 취약점 모듈을 이용하여 악성 파일을 배포할 웹 서버를 구동시킵니다. [그림 6] 악성 SWF 파일 배포용 웹 서버 구동 6
2 공격자는 공격에 사용할 쇼핑몰 사이트에 접속합니다. [그림 7] 공격에 사용될 인터넷 쇼핑몰 3 공격자는 인터넷 쇼핑몰 Index 페이지에 악성코드를 삽입합니다. [그림 8] 쇼핑몰 Index 페이지 악성코드 삽입 7
4 피해자는 악성코드가 삽입된 인터넷 쇼핑몰에 접속합니다. [그림 9] 악성코드가 삽입된 인터넷 쇼핑몰 접속 5 피해자의 접속과 동시에 최고 관리자 권한이 탈취당하게 됩니다. [그림 10] 피해자 시스템 최고 관리자 권한 획득 8
4. 공격 코드 분석 4.1. 패킷 추출 1 http 필터링을 통해 필요 정보만 추출합니다. [그림 11] 패킷 추출 악성 웹 서버 Index 페이지인 e7zlm45yjdtof0.html 을 로드 합니다. 악성 플래시 파일인 e7zlm45yjdtof0o0cfim1x0wk.swf 을 실행합니다. Shell Code 파일인 pay.txt 불러옵니다. 4.2. e7zlm45yjdtof0.html 1 공격용 웹 서버의 Index 페이지는 아래와 같이 구성됩니다. [그림 12] 공격용 웹 서버 Index 페이지 해당 태그를 통해 악성 플래시 파일인 e7zlm45yjdtof0o0cfim1x0wk.swf 가 실행됩니다. 4.3. pay.txt 1 공격에 사용될 Shell Code 는 pay.txt 에 저장되어있습니다. [그림 13] Shell Code 파일 9
4.4. e7zlm45yjdtof0o0cfim1x0wk.swf 1 SWF 파일 내 Action Script 로 구성된 Exploit Code 는 아래와 같습니다. [그림 14] 공격 코드 분석 (1) Main( ) 함수는 최초 자신이 사용할 Main_FontClass 객체를 선언합니다. 이때 선언된 Main_FontClass 는 FontAsset Class 의 확장 클래스 입니다. FontAsset Class 는 Flash.text.font Class 의 SubClass 로 내장되어 있는 Flex Application 에 대한 Font 관련 동작을 수행하는 Class 입니다. Flex 와 관련된 Font 는 TrueType Font(TTF) 와 OpenType Font(OTF)가 10
있습니다. 만약 SWF File 내부에 System Font 나 제작된 별도의 Font 가 존재하는 경우 컴파일러에 의해 Extend Class 를 설정하게 되어 있습니다. 2 SWF 파일 내 Action Script 로 구성된 Exploit Code 는 아래와 같습니다. [그림 15] 공격 코드 분석 (2) _loc_1 변수에 웹 서버 동일 디렉터리 안에 존재하는 Shell Code 파일의 경로를 저장하며, 이후 가 Shell Code 파일을 요청하게 됩니다. 웹 서버에 요청한 Shell Code 파일인 pay.txt 파일을 다운받는 화면입니다. 11
3 SWF 파일 내 Action Script 로 구성된 Exploit Code 는 아래와 같습니다. [그림 16] 공격 코드 분석 (3) this.urlloader.addevetlistener( )함수가 호출되기 전에 인자 값으로 존재하는 this.urlloader_complete( )함수가 호출됩니다. urlloader_complete( )함수가 호출되고 finishexploit( )함수가 실행됩니다. finishexploit( )함수에 는 heapspray( )함수와 플래시 취약점을 유발하는 TextBlock_createTextLineExample( )가 정의되어 있습니다. finishexploit( )함수에 정의된 heapspray( )함수가 실행되고 예측 가능한 메모리 영역에 Nop 과 공격코드로 구성된 Chunk 가 삽입됩니다. 12
4 SWF 파일 내 Action Script 로 구성된 Exploit Code 는 아래와 같습니다. [그림 17] 공격 코드 분석 (4) heapspray( )함수 와 플래시 취약점 유발 함수인 TextBlock_createTextLineExample( )함수가 포함되어 있는 finishexploit( )함수가 호출됩니다. heapspray( )함수가 실행된 다음 플래시 취약점 유발 함수인 TextBlock_createTextLineExample( )함수가 실행됩니다. TextBlock_createTextLineExample( )함수에서는 처음 Main( )함수에서 선언한 Main_FontClass 에 데이터를 구성한 다음 이를 바탕으로 실행된 createlines( )함수에서 Font 출력을 위한 처리과정에서 에러가 발생합니다. 13
5. 상세 분석 5.1. Heap Spray 1 Heap Spray 는 아래와 같은 순서로 실행 됩니다. [그림 18] Heap Spray 지점 (1) MOVQ 명령을 통해 Nop 과 Shell Code 가 메모리 영역에 복사됩니다. 메모리 영역에 Nop 이 복사되는 것을 볼 수 있습니다. 14
2 Heap Spray 는 아래와 같은 순서로 실행 됩니다. [그림 19] Heap Spray 지점 (2) Nop 이 복사되고 Shell Code 도 복사되는 것을 볼 수 있습니다. 15
3 Heap Spray 는 아래와 같은 순서로 실행 됩니다.. [그림 20] Heap Spray 지점 (3) Heap Spray 가 진행되고 예측 가능한 주소 (0x0c0c0c0c)에 Nop 이 복사되게 됩니다. 16
4 Heap Spray 완료 후 메모리의 모습입니다. [그림 21] Heap Spray 지점 (4) 예측 가능한 주소(0x0c0c0c0C)에 Nop 이 채워지고 이후 Shell Code 도 채워져 있습니다.. 17
5.2. Parsing 취약성 확인 1 해당 취약성은 악성 SWF 파일 내 정의된 Action Script 코드에서 사용할 Embedded Font 인 PSpop 폰트를 파싱하는 과정에서부터 시작됩니다. [그림 22] PSpop 폰트 파일 2 PSpop Font 의 Font Table 에 대한 정보입니다. [그림 23] Font Table 정보 18
3 Heap Spray 가 동작하고 난 뒤 Kern Table 을 파싱하는 과정에서 Nop 과 Shell Code 가 존재하는 주소를 전달받게 됩니다. [그림 24] Kern Table 19
4 Kern Table 의 조작된 주소가 파싱되고 이후 잘못된 주소(0x0c0c0c0c)를 참조하게 됩니다. [그림 25] 잘못된 주소 참조 Call DWORD PTR DS: [EAX+8]을 통해 잘못된 주소를 참조하게 됩니다. 20
5 Heap Spray 에 의해 미리 삽입된 Nop 부분으로 이동하게 됩니다. [그림 26] 임의의 코드 실행 6 Nop 을 타고 이후 존재하는 Shell Code 가 실행됩니다. [그림 27] Shell Code 실행 21
6. 결 론 CVE-2012-1535 취약점은 조작된 폰트를 파싱하는 과정에서 미리 조작된 주소 값을 참조하여 정상적이지 않은 주소로 프로그램의 흐름을 변경할 수 있게 됩니다.. 7. 대응 방안 1 해당 취약점 패치가 된 최신 버전의 애플리케이션으로 업데이트하여 예방할 수 있습니다. [그림 28] 패치 버전 다운로드 페이지 2 Update 가 발생하면 자동으로 설치되도록 설정하여 패치 이후 1-day 공격을 예방 할 수 있습니다. [그림 29] 자동 업데이트 설정 22
8. 참고 1 최신 정보보호기술 동향: APT 및 그 대응 http://www.nipa.kr/know/periodicalview.it?identifier=02-001-110909-000010&menuno=28&code=b_ita_01 2 (ActionScript 3.0) 폰트를 동적으로 로드 및 등록을 위한 FontManager 클래스 http://ariman.tistory.com/202 3 A New Font Format for Macintosh and Windows http://www.sketchpad.net/opentype-fonts.htm 4 CVE-2012-1535 http://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1535 5 Adobe Security update available for Adobe Flash Player http://www.adobe.com/support/security/bulletins/apsb12-18.html 6 Metasploit Adobe Flash Player 11.3 Kern Table Parsing Integer Overflow http://www.metasploit.com/modules/exploit/windows/browser/adobe_flash_otf_font 7 Adobe Flash Old Version Download http://helpx.adobe.com/flash-player/kb/archived-flash-player-versions.html 23