***** 레시피 6-8 : PDF 파일을 공격하는 취약점 확인 *****
PDF 파일에서 JavaScript를 추출해 복호화 했다면, 어떤 취약점을 위한 것인지 알고 싶을 것이다. 이는 위협 평가에 유용하다. 왜냐하면, 만약 PDF가 특정 시스템에 접근할 수 있다면, Adobe Reader의 Version을 제공할 수 있기 때문이다. 표 6-1은 가장 널리 확산된 PDF Exploit을 보여주고 있다. 표 가로 부분의 취약한 위치 ( Vulnerable Condition )는 의심 파일을 분석할 때 확인할 수 있다.
< 표 6-1 : PDF 취약점 >
===================================================================================================
CVE 취약한 위치 설명
---------------------------------------------------------------------------------------------------
CVE-2007-5659 Collab.CollectEmailInfo( ) Collab.EmailInfo( ) 함수의 Parameter Parsing 과정에서 발생하는 JavaScript
Engine내의 Stack 버퍼 오버플로우
---------------------------------------------------------------------------------------------------
CVE-2008-2992 util.printf( ) JavaScript 함수 util.printf( )내의 Stack 버퍼
오버 플로우
---------------------------------------------------------------------------------------------------
CVE-2009-0927 Collab.getIcon( ) Collab.getIcon( ) 함수의 Parameter Parsing
과정에서 발생하는 JavaScript Engine내의
버퍼 오버플로우
---------------------------------------------------------------------------------------------------
CVE-2009-1492 getAnnots( ) getAnnots( ) 함수에서 Parameter Parsing
과정에서 발생하는 JavaScript Engine내의
버퍼 오버 플로우
---------------------------------------------------------------------------------------------------
CVE-2009-0658 JBIG2 JBIG2 Image 문자열 Parsing 과정에서 발생
하는 버퍼 오버 플로우
---------------------------------------------------------------------------------------------------
CVE-2009-1862 Adobe Flash authplay.dll 의 메모리 문제로 인한 취약점
CVE-2010-1297
---------------------------------------------------------------------------------------------------
CVE-2009-2990 U3D U3DCLODProgressiveMeshContinuation
Blocks을 Parsing 할 때 잘못된 Index 참조
로 인해 발생하는 문제
---------------------------------------------------------------------------------------------------
CVE-2009-3459 Colors FlateDecode Colors Parameter를 Parsing
하는 과정에서 발생하는 Integer 오버플로우
---------------------------------------------------------------------------------------------------
CVE-2009-4324 media.newPlayer( ) JavaScript media.newPlayer( ) 함수에서
발생하는 Stack 버퍼 오버플로우
---------------------------------------------------------------------------------------------------
CVE-2010-0188 libTiff AdobeReader의 libTiff 라이브러리내에서 발생
하는 Stack 버퍼 오버 플오우
---------------------------------------------------------------------------------------------------
PDF Launch ( NO CVE ) PDF Launch Action 내부 실행 파일을 실행시키기 위해 사용자에게
질의하는 형태의 사회 공학적 기법
====================================================================================================
이 부분에서 타겟 취약점이 무엇인지 판단할 때 기억해야 할 점이 있다.
* 대부분, 취약한 부분 또는 함수는 복호화된 JavaScript에서 볼수 있는 함수의 이름이거나 문자열이다. 그러나
복호화하더라도, 취약한 함수가 변수로 정의되거나 선택 방식 ( Alternative Methods )에 의해 실행될 경우 확
인할 수 없을 수도 있다. 예를 들어, 공격자가 동일한 함수를 호출하기 위해 다음과 같은 방법을 사용할 수 있
다.
Collab.getIcon(.....);
Collab["\x67\x68\x74\x49\x63\x6f\x6e"] (.....);
var a = Collab; a.getIcon(.....);
* 많은 악성 PDF 파일은 하나 이상의 취약점을 공격한다. 공격자는 (AdobeReader Version을 포함하고 있는)
app.viewerVersion 를 확인한다. 만약 취약하지 않는 Version일 경우, 공격자는 다른 취약점을 공격할 수 있
다.
[ CVE-2007-5659 :: Collab.collectEmailInfo( ) ]
Collab.collectEmailInfo( )는 널리 확산된 가장 일반적인 취약점 중 하나다. 2008년 2월 초, 신규 취약점을 발견한 iDefense의 연구 그룹은 Zonebak Trojan을 설치하기 위해 배너 광고를 통해 공격했다. 해당 취약점을 공격하는 악성 JavaScript Code 일부를 발췌했다.
< JavaScript Code >
해당 취약점은 Adobe 제품이 사용하는 JavaScript Engine을 이용한 최초의 악성 파일이다. iDefense는 Adobe에 의해 Patch가 이뤄지기 전 약 2주동안 취약점이 공격에 이용되었다는 것을 알았다. 이는 악성 코드를 설치하기 위해 JavaScript 취약점을 이용하기 시작했음을 의미한다.
[ CVE-2008-2992 :: util.printf( ) ]
util.printf( ) 함수의 취약점을 Target으로 하는 공격은 취약점을 동작시키기 위해 Heap-Spray 방법을 사용한다.취약점을 공격하기 위해, 공격자는 아래의 코드와 유사한 형태의 Argument를 통해 취약한 함수를 호출한다. 비록 util.printf( )가 정상 PDF 파일에 의해 실행되더라고, 악성 여부를 판단하는 두번째 Parameter를 주의깊게 확인해야 한다. 취약점은 Stack 버퍼 오버플로우이기 때문에 두번째 Parameter가 악성의 경우 비정상적으로 길다.
< 샘플 코드 >
[ CVE-2009-0927 :: Collab.getIcon( ) ]
해당 취약점은 Collab.getIcon( )에 전달되는 긴 문자열에 의해 취약점을 공격하는 PDF 파일임을 식별할 수 있다. 그 코드는 다음과 같다.
< 샘플 코드 >
Adobe는 2009년 3월 해당 취약점은 Patch되었고 Patch 후 몇주가 지난 2009년 4월에 널리 확산되었다. 그리고특정 일자에 공격하도록 설계된 가장 일반적인 형태가 남아있다. 몇몇 보안 연구가들은 공격자들은 특정 취약점을 공격하기 위해 Patch를 Reverse-Engineer 했다고 추정한다. ZDI에 의해 출판된 취약점에 따르면, Tenable Network Security는 2008년 7월에 발견되었다.
[ CVE-2009-1492 :: getAnnots( ) ]
해당 취약점을 공격하는 PDF 파일을 탐지하기 위해, 메모리 Corruption을 일으키는 4개의 Parameter를 전달받는 getAnnots( ) 함수를 확인한다.
this.getAnnots( -1023212797, -1023212797, -1023212797, -1023212797);
getAnnots( ) 함수 호출시 위와 같은 Parameter가 없다면 의심스럽다. 왜냐하면, PDF 파일의 다른 섹션으로 부터 Content를 로드하기 위해 사용되는 값이기 때문이다. 즉, JavaScript가 Annot의 Content를 Decode / Decrypt 하면, JavaScript는 eval( )과 같은 함수를 이용해 그것 ( JavaScript )을 실행 시킨다.
[ CVE-2009-0658 :: JBIG2 ]
이 공격 코드가 동작하려면, JBIG2Decode Filter를 사용하는 Object를 찾는다.
<</BitsPerComponent 1/ColorSpace /DeviceGray /Filter /JBIG2Decode /Height 600/Length 4945 /Name
/X/Subtype/Image/Type/XObject/Width 800 >>
JBIG2 취약점을 Target으로 하는 PDF파일은 Heap-Spray 기법을 사용한다. 그러나, JBIG2 취약점은 혀율성을 위해 JavaScript를 사용하는 것은 아니다. 그림 6-3은 악성 JBIG2 PDF 문서의 예를 보여준다. Object 3는 /OpenAction 태크를 포함하고 있는데 이는 Victim이 PDF 파일을 실행하면 Object 2의 Content를 Object 3가 실행시킨다는 것을 의미한다. Object 2는 8진수로 되어 있는 JavaScript로 되어 있고 Object 7이 로드되기 이전에 프로세스 메모리의 큰 섹션을 채우기 위해 Heap Spray를 이용한다.
< 그림 6-3 :: JBIG2 취약점을 공격하는 악성 PDF 문서 >
Object 7은 기형의 JBIG2 Image Stream을 갖고 있다. 이 Image Stream은 Heap Spray로 채워진 메모리의 EIP를 나타낸다. 즉, EIP가 ShellCode에 도착하면, Object 7의 나머지를 XOR를 통해 Decode 후 Windows PE 파일을 실행한다.
[ CVE-2009-1862 and CVE-2010-1297 :: Adobe Flash ]
공격자는 PDF내부에 악성 Flash movie ( SWF )를 내장시키기 위해 /EmbeddedFile 이나 /RichMediaActiveation 태그를 사용한다. 이런 경우, 비록 PDF를 통해 전파되지만 Target Application은 Adobe Reader가 아닌 Flash Player다. 다음은 내장된 Flash Movie의 예이다.
< Flash Play 예 >
내장된 Flash Movie를 추출하기 위해, 모든 PDF Filter로 압축을 해제하고, PDF Object의 시작부터 SWF 파일 헤더인 CWS ( 압축된 경우 ) 또는 FWS ( 압축이 해제된 경우 )를 찾는다. 여러분은 이 작업을 위해 Didier Stevens의 pdf-parser.py를 사용하면 된다.
[ NOTE ]
우리는 이책에서 SWF ( Flash ) 파일 분석을 수행하진 않는다. 그러나, 아래의 리소스를 통해 필요한 기술과 툴을 익힐 수 있다.
* Action Script를 Decompile하고 SWF 파일을 압축 해제하기 위한 툴 :: swfdump , Nemo440 , Action Script
Viewer
* SecurityTube에서 Flash Malware Video 분석
* Sebastian Porst 와 Frank Boldewin 이 발견한 CVE-2010-1297 의 깊은 분석 정보
* CSI 에피소드 4 : Sergrei Schevchenko 의 인터넷 ( Killer 비디오의 공격 )
[ CVE-2009-2990 :: U3D ]
Universal 3D의 약자인 U3D는 애니메이션에서 사용된다. 악성 PDF 파일내의 U3D Data 문자열 Parsing과정에서의 Exploit을 탐지하기 위해, 아래와 같은 content를 찾으면 된다.
45 0 obj<< /Subtype/U3D/Length 172417/Filter/FlateDecode/VA[]/DV/F/AV
<</Subtype/Linear/PC -1>>>>stream
일반적으로 U3D를 Exploit하는 악성 파일은 172000 ~ 172500Bytes 사이의 길이값을 사용한다. (이전 Object에서)길이 172417 는 이 범위내에 포함된다. 또한 이 Exploit은 Matasploit 모듈에서 확인할 수 있는 것처럼 JavaScript Heap Spraying 를 사용한다.
[ CVE-2009-3459 :: Colors ]
Exploit의 핵심 구성요소는 /Colors의 Argument로 제공되는 큰 Integer 값이다. Didier Stevens의 pdfid.py 툴은 /Colors 값이 2^24 보다 큰 값인지 확인하는 방식으로 Exploit을 탐지한다. 다음 예를 참고한다.
/Predictor 02 /Colors 1073741828 /BitsPerComponent 1 >>
[ CVE-2009-4324 :: media.newPlayer ]
해당 취약점( CVE-2009-4324 ) Exploit은 다음의 코드에서 보는 것과 같이,
media.newPlayer를 호출한다. 이 취약점을 Exploit하기 이전에, Attacker는 JavaScript Heap Spraying을 사용한다.
try {
this.media.newPlayer ( NULL );
} catch(e) { }
util.printd( p@1111111111111111111111111 : yyyy111 , new Date() );
[ PDF Launch ( no CVE ) ]
/Launch 태그의 동작은 선택 메시지를 출력하는 형태이기 때문에 해당 태그를 갖는 파일을 위해 no CVE를 할당했다. Adobe Reader의 경우 Command와 함께 /Launch 태그를 포함하고 있으면, "Open" 또는 "Do not open" 의 선택을 사용자에게 보여주며 경고를 한다. CVE-2009-0836은 Foxit에서 동일한 기법을 사용한다. Attacker는 직접적으로 PDF내에부서 실행할 수 있도록 다음과 같이 태그를 사용한다.
/Type /Action /S /Launch /Win << /F (cmd.exe)
PDF 파일내에 ( /Launch가) 포함되어 있고 사용자가 Open을 선택하면, cmd.exe가 실행된다. 더욱 세부적인 설명과 /Launch 태그를 이용해 Command를 실행하는 PoC 파일은 Didier Stevens 블로그에서 확인할 수 있다.
(
http://blog.didierstevens.com/2010/03/29/escape-from-pdf )
[ Detecting CVEs with Jsunpack-n ]
Jsunpack-n을 사용해 PDF나 JavaScript를 분석할 때, detection.py는 특정 Signature Set으로 Encoded / Decoded Data를 Scan하기 위해 YARA를 사용한다. 예를 들어 다음의 룰은 CVE-2008-2992를 탐지한다.
rule Utilprintf : decodedPDF
{
meta :
ref = "CVE-2008-2992"
strings :
$cve20082992 = "util.printf" nocase fullword
condition :
1 of them
}
다음의 룰은 CVE-2009-4324 를 탐지한다.
rule mediaNewplayer : decodedPDF
{
meta :
ref = "CVE-2009-4324"
strings :
$cve20094324 = "media.newPlayer" nocase fullword
condition :
1 of them
}
Jsunpack-n은 가장 최신의 YARA 룰을 사용하며 이는 Jsunpack-n 소스 코드의 "rules" 파일을 통해 확인할 수 있다.
(
http://jsunpack.jeek.org/dec/current_rules )