취약점분석보고서 = CVE-2012-0754 = - 서준석연구원 - 2012-08-02 보안프로젝트와한국정보보호교육센터에서공동연구한것입니다. 상업적으로사용하여법적인문제가생기는경우는사용자자신에게책임이 있음을경고합니다.
목 차 1. 개요... 1 1.1. 취약점분석추진배경... 1 1.2. CVE-2012-0754 취약점요약... 1 2. CVE-2012-0754 분석... 2 2.1. CVE-2012-0754 취약점개요... 2 2.2. CVE-2012-0754 대상시스템목록... 2 2.3. CVE-2012-0754 취약점원리... 2 3. 분석... 3 3.1. 공격기법및기본개념... 3 3.1.1 Heap Spray...3 3.1.2 Return Oriented Programming...4 3.2. 공격코드... 8 3.2.1 공격코드분석...8 3.2.2 공격코드실행... 10 3.3. 공격기법분석... 12 3.3.1 동적분석을통해분석대상파일추출... 12 3.3.2 미디어파일분석 (swf / mp4)... 14 3.3.3 Ollydbg 분석... 16 4. 결론... 25 5. 대응방안... 26 5.1. 보안업데이트설치... 26 6. 참고자료... 27 6.1. 참고문헌... 27 6.2. 참고웹문서... 27
그림목차 그림 1. CVE-2012-0754 취약점원리... 2 그림 2. 간단한 Heap Spray 공격전개도... 3 그림 3. 가젯구성... 5 그림 4. 메모리상에서수행되는가젯들... 5 그림 5. CVE-2012-0754 공격코드구조... 8 그림 6. 취약한파일생성부분... 8 그림 7. 공격코드생성부분 (Heap Spray)... 9 그림 8. Heap Spray 공격개요... 10 그림 9. Adobe Flash Player 버전확인... 10 그림 10. 공격실행후리버스커넥션대기... 10 그림 11. 공격자서버에접속한화면... 11 그림 12. 피해자의접속으로리버스커넥션이성립... 11 그림 13. http 필터링으로필요정보만추출... 12 그림 14. Java Script 소스내부... 12 그림 15. 힙스프레이수행부분... 13 그림 16. swf 실행부분... 13 그림 17. wireshark 로분석대상파일추출... 14 그림 18. 취약한 swf 파일내부구조... 14 그림 19. 취약한 mp4 파일헤더부분... 15 그림 20. 취약한 mp4 파일전체구조... 15 그림 21. 정상적인 mp4 파일구조... 16 그림 22. crash 발생을위해응답값변조... 16 그림 23. Just-In-Time debugging 옵션선택... 16 그림 24. Just-In-Time debugging 기능활성화... 17 그림 25. Crash 발생후디버거화면... 17 그림 26. 충돌 (EIP 에러 ) 메세지... 17 그림 27. 두가지소스의 '0C0C0C0C'... 18 그림 28. EAX 가가리키는부분을확인... 18 그림 29. mp4 파일생성부분수정... 19 그림 30. 수정한부분이프로그램흐름에반영된모습... 19 그림 31. crash 원인을찾기위해스택역추적... 19 그림 32. 에러발생전마지막으로실행된부분... 20 그림 33. 메모리에서 Flash11e 영역검색... 20
그림 34. 문제의원인으로추정되는코드발견... 21 그림 35. 원인코드가포함된함수의시작부분에 Memory B.P 설정... 21 그림 36. swf 내부의함수를담고있는부분... 21 그림 37. flash player 버전과관련된부분... 22 그림 38. mp4 파일을읽어오는 ReadFile API... 22 그림 39. mp4 파일이로딩되어저장된부분... 22 그림 40. 상세분석으로발견한 Crash 발생메커니즘... 23 그림 41. opcode 분석을위해시작부분에 B.P 설정... 23 그림 42. 취약점발생원리... 24 그림 43. REP 가수행하는세부명령... 24 그림 44. Adobe 공식사이트의취약점관련정보... 26 표목차 표 1. 기계어조각으로활용가능한기계어코드... 7 표 2. 기계어조작을통해 ret 를가지는명령어조각추출... 7
1. 개요 1.1. 취약점분석추진배경 스마트폰, 클라우드서비스등의보급으로인해이제인터넷과보안은우리의생활에큰 영향력을미치게되었다. 또한최근몇차례의대형보안사고로인해인터넷상에존재하는 악성코드와시스템내부취약점에대한관심이높아지고있는추세이다. 특히최근에는불특정다수를대상으로하는공격을넘어, 구체적인목적을가진공격자들이특정대상을공격하는유형이다수발견되고있다. 이에더해공격의유형이단순히외부에서내부로감행하는공격이아닌, 사용자가간과할수있는부분을노린공격도성행하고있다. 그예로, 신뢰를전제로한원격데스크톱연결취약점공격이나, 일반사용자들이업데이트를크게중요시하지않는멀티미디어취약점들이빈번히악용되고있다. 이번문서에서는온라인게임, 개인정보유출등다양한방식으로응용되어공격에쓰이는 CVE-2012-0754 를분석해볼예정이다. 1.2. CVE-2012-0754 취약점요약 CVE-2012-0754 는 Adobe Flash Player.mp4 cprt overflow 란이름으로 2012 년 2 월 15 일에공개된취약점이다. 해당취약버전을사용하는모든사용자에게피해를줄수있다. 이것은플레시플에이어에서 mp4 파일을파싱하는과정에서발생한오류로인해원격코드를수행할수있게하는취약점이다. 온라인게임해킹, 추가적인행위를하는악성코드다운로드등여러가지변종형태가많이나왔지만, Adobe 사에서제공하는패치를통해간단히예방할수있다. 1
2. CVE-2012-0754 분석 2.1. CVE-2012-0754 취약점개요 취약점이름 Adove Flash Player.mp4 cprt overflow (CVE-2012-0754) 최초발표일 2012 년 2 월 15 일 문서작성일 2012 년 5 월 25 일 위험등급 긴급 ( 위험 ) 벤더 Adobe 취약점영향 원격코드실행및악성코드다운로드 현재상태 패치됨 2.2. CVE-2012-0754 대상시스템목록 아래의버전이설치된리눅스, 윈도우및안드로이드기반환경에서취약점이발생할수있다. Windows, Mac OS X, Linux, and Solaris : Adobe Flash Player before 10.3.183.15 and 11.x before 11.1.102.62 Android 2.x and 3.x : before 11.1.111.6 Android 4.x : before 11.1.115.6 2.3. CVE-2012-0754 취약점원리 Adobe Flash Player.mp4 cprt overflow 는 flash player 에서 mp4 파일을파싱하는과정중발생한오류로인한코드실행취약점으로, 이를이용해원격코드를수행할수있게만드는취약점이다. 또한, metasploit 에내장된모듈에서는 Heap Spray 기법을이용해원하는공격코드를메모리에주입함으로써공격의다양성을강화시켰다. 해당취약점을악용한최근사례를찾아보면단순한리버스커넥션성립뿐만아니라, 키로거, 백도어등다양한방법으로응용되고있다. 그림 1. CVE-2012-0754 취약점원리 2
3. 분석 3.1. 공격기법및기본개념 3.1.1 Heap Spray 힙스프레이기술은 Blazde 와 Skynined 에의해개발되었고, 2004 년부터대부분의브라우저기반 exploit 와함께사용되어왔다. 힙스프레이는임의의코드를수행하기위해메모리상에임의의코드를뿌리는공격기법이다. 간단히말하자면, 원하는코드를실행하는부분과 NOP 값을하나의 ' 블럭 ' 으로생성해원하는주소에접근할때까지메모리의힙영역에임의로할당을시킨다음, 원하는목적행위를수행하는기법이다. 이기술의핵심은메모리의특정영역 (in Heap) 에특정목적을가지는코드를뿌린 ( 반복적으로주입시킨다는뜻으로, 뒤에서자세히설명할예정 ) 뒤여러취약점들에의해비정상적인메모리주소 (heap spray 된부분 ) 로 JMP 또는 CALL 하여해당시스템이공격자에의해흐름이제어되게되는것이다. 이러한기술을실질적으로사용하기위해다음과같은두가지제한사항이뒤따른다. 첫째, 공격자가원하는내용을주입할수있는부분이 Heap 영역으로한정되어있다. 게다가, Heap 영역중에서도윈도우가사용하는 DLL, PEB, TEB 등과 0x7fffffff( 커널공간 ) 이상의주소는사용할수없다.) 둘째, 어플리케이션의 Heap 을통제할수있는권한을가져야한다. 여러어플리케이션 중효과적인것이바로웹브라우저이다. 웹브라우저상에서는자바스크립트를이용해 Heap 을통제할수있다. 그림 2. 간단한 Heap Spray 공격전개도 3
그림 1 에서는 Heap Spray 공격이어떠한과정을통해수행되는지간단히보여주는그림이다. IE 상에서 JavaScript 를이용해힙스프레이공격을수행한다고가정할때, 우선취약점이발생하기이전에메모리의 Heap 영역에 'nop+code' 형식의쉘코드가뿌려지게된다. 그다음해당취약점이발생하게되고, 이미 Spray 된영역으로프로그램제어가이동하게된다. 결론적으로공격자가원하는코드가수행되고, 공격은성공한다. 유의해야할점은앞서제시한공격백터대로항상공격이이루어지는것이아니며, 이해를돕기위해구체적인과정을생략한것임을유의하길바란다. 실질적으로공격이 성공하기위해서는자세한메커니즘에대한이해가선행되어야한다. 3.1.2 Return Oriented Programming 1. ROP 란 리턴지향프로그래밍은공격자가현재수행중인프로그램코드안에존재하는서브루틴이리턴명령어에닿기전에선별된기계명령어또는기계명령어덩어리를간접적으로실행시키기위해콜스택의제어를통제하는기술을말한다. 실행되는모든명령어들이원래프로그램안에존재하는실행가능한메모리영역에서추출한것들이기때문에, 이러한기술은사용자제어메모리공간에서명령어수행을방지하는기술들을우회하는코드인젝션과같은기술들을사용하지않아도우회를가능하게해준다. 2. ROP 접근법 1) 전체함수를사용하는대신에명령어의연속된작은덩어리들을이용 2) 명령어조각은 2 개에서 5 개정도의크기 3) 모든명령어조각은 ret 명령으로끝나야함 4) 명령어조각들은 'gadget' 으로서로연결되어명령어덩어리를형성 5) gadget 은의도된특정행동을수행 ( load, store, xor, or branch ) 6) 공격자는여러개의 gadget 을조합해공격의정교함을더할수있음 3. 가젯여러명령조각들로구성되어있는명령어집합으로써공격자가의도한특정행동을수행하는역할을하게된다. 여기서는특정변수를로드해덧셈을수행하는예시를들어보겠다. 1) 우선공격자가다음과같은가젯을찾아내었다고가정해보자. ( 여기서 ' 찾았다 ' 라는말이쓰인이유는뒤에서설명할예정 ) 4
그림 3. 가젯구성만약 Load 명령을수행하기위한기계어가 8 개가있고, 필요한인자가하나가있다고가정하면, Load 기능을수행하기위한가젯은그림 2 의왼쪽가젯과같이구성되어야한다. 물론각각의기계어들은현재수행되고있는, 공격자가접근가능한프로그램내부에존재하는기계어조각들중에서추출한것이다. ( 이러한추출작업을도와주는도구들을이용하면비교적간단하게 (?) 기계어들을추출가능하다.) ADD 명령또한 Load 가젯과같은방법으로추출한것이다. 추출과정을통해구성된가젯들을수행하게되면별도의코드삽입이나, 내장함수를이용하지 않아도공격자가원하는행동들을수행할수있게된다. 2) 그렇다면위에서생성한가젯들이실제로메모리에서어떻게작동하는지살펴보도록하자. 그림 4. 메모리상에서수행되는가젯들 그림 3 에서보듯이공격자가작성한가젯들은메모리스택에차곡차곡쌓인후, 하나씩수행되게된다. 여기서중요한점은 ( 가장어려운부분이기도하다.) 공격자가선택한기계어조각들이스택의형태를망가뜨려선안된다는점이다. 예를들어 ret 1-2-3-4 순서로스택에쌓여야만원하는행동을수행할수있다고가정할때, 만약 1 번기계어덩어리에스택의모양을 5
변형시키는기계어가포함된다면스택은우리가원하는모습이아닌 ret 1-4-2-3 나 ret 1-2- 쓰레기값-3-4 형태로변형될수있다. 이렇게되면공격은무용지물이되거나에러가발생하게된다. 그만큼원하는명령을수행하기위해필요한기계어조각들을찾아가젯을구성하는것은시간적인노력뿐만아니라, 메모리와기계어와의상호관계에대한깊은이해가선행되어야만가능한일이다. 6
5. 기계어조각찾기 특정명령어조각이 ret 로끝나게되는것은프로그래머들이결코원하지않는코드이다. 그렇기때문에공격자가기존에존재하는기계어흐름에서원하는명령어조각을찾는것은매우어려운일이다. ret 를가지는기계어조각은 jmp 명령을포함하는기계어근처에서찾을수있다. 이러한명령을적절히이용하면 ret 를가지는기계어조각을생성할수있다. 다음의예제를보자. opcode assembler comment b8 13 00 00 00 mov $0x13, %eax eax 레지스터의내용을 0x13 으로이동 e9 c3 f8 ff ff jmp 3aae9 상대주소 3aee9 로점프 표 1. 기계어조각으로활용가능한기계어코드 여기에서기계어해석을 b8 부터하는대신에 00 부터하게되면다음과같이프로그래머가 의도하지않은새로운명령을생성할수있다. opcode assembler comment 00 00 add %al, (%eax) al 값을 eax 포인터가가리키고있는값과더함 00 09 add ch 와 cl 레지스터를더함 c3 ret 리턴명령 표 2. 기계어조작을통해 ret 를가지는명령어조각추출 이렇게함으로써완전히새로운기계어조각이만들어진다. 결론적으로, 공격자는자신이원하는행동을수행할수있는가젯의큰그림을그리고, 가젯의부품 ( 기계어조각 ) 들을모아가젯을완성후, 필요하다면여러기능을하는가젯들을모아피해시스템의방어메커니즘을우회하여공격을성공시킬수있는것이다. 자세한내용은아래참고문서를확인하면더깊은지식을습득할수있을것이다. 7
3.2. 공격코드 [ MS12-020 & CVE-2012-0754 취약점분석보고서 ] 3.2.1 공격코드분석 공격코드는크게선언, 대상운영체제별페이로드구성, 취약한파일전송및실행, 공격코드생성, 취약한파일생성등의 5 가지부분으로나눌수있다. 공격코드의개략적인흐름은다음과같다. 그림 5. CVE-2012-0754 공격코드구조 그중에서핵심부분인취약한파일생성과공격코드구성부분을중점적으로분석해본다. 1. 취약한파일생성 그림 6. 취약한파일생성부분 취약한 mp4 파일을실행하는역할을하는 swf 를생성하기위해 metasploit 에내장된 swf 내부 정보를불러온다. 여기서생성된 swf 에서실행될취약점을가지는 mp4 파일은임의의바이너리를 직접입력해서생성하는데, 자세한내용은분석파트에서밝힐예정이다. 8
2. 공격코드생성 p = get_payload(my_target, cli) // 피해자의윈도우와 IE 버전에맞는페이로드를생성해 'p' 에저장한다. ( RET / ROP ) js_code = Rex::Text.to_unescape(p, Rex::Arch.endian(my_target.arch)) // 위에서생성한페이로드를피해자의시스템에서실행가능하도록변환한다. js_nops = Rex::Text.to_unescape("\x0c"*4, Rex::Arch.endian(my_target.arch)) // 0c0c0c0c 문자를피해자의시스템에서실행가능하도록변환한다. js_pivot = << -JS // 자바스크립트하단에삽입되는부분 var heap_obj = new heaplib.ie(0x20000); // 새로운힙라이브러리를생성 (heallib.ie : 자바스크립트에포함된함수 ) var code = unescape("#{js_code}"); // code 생성 var nops = unescape("#{js_nops}"); // nop 생성 while (nops.length < 0x80000) nops += nops; // nop 의길이가 0x80000 이될때까지스스로를복제 var offset = nops.substring(0, #{my_target['offset']}); // 오프셋설정 ( nop 를 0~Offset 만큼잘라 offset 에저장 ) var shellcode = offset + code + nops.substring(0, 0x800-code.length-offset.length); // 쉘코드생성 ( 오프셋 + 코드 + nop 연산결과 ) while (shellcode.length < 0x40000) shellcode += shellcode; // 쉘코드의길이가 0x40000 이될때까지스스로를복제 var block = shellcode.substring(0, (0x80000-6)/2); // 힙에할당할메모리블럭을생성 ( 쉘코드를 substring 처리한결과 ) heap_obj.gc(); // 힙의불필요한부분을처리해주는함수 ( 자바스크립트에포함된함수 ) heap_obj.debug(true); for (var i=1; i < 0x1C2; i++) { heap_obj.alloc(block); // 1~0x1C2 만큼의블록을힙공간에할당 } heap_obj.debug(true); JS escape() 함수는알파벳과숫자및 *, @, -, _, +,., / 를제외한문자를모두 16 진수문자로바꾸어준다. 이렇게 16 진수문자열로변환된문자열은 unescape() 함수로다시되돌려줄수있다. 그림 7. 공격코드생성부분 (Heap Spray) 공격코드는힙스프레이기법을이용해생성이되는데, 이를통해공격자가원하는코드를담은 소스를상대방메모리에삽입해공격을수행하게되는원리이다. 위소스를간단한그림으로 나타내면다음과같다. 9
그림 8. Heap Spray 공격개요 3.2.2 공격코드실행 1. 피해자시스템에는패치가되지않아취약점을가지고있는 flash player 가설치되어 있다. 그림 9. Adobe Flash Player 버전확인 2. 공격자는모듈 (flash player.mp4 cprt overflow) 을로드하고, 피해자의접속을기다릴 주소를설정후, 공격코드를실행한다. ( 리버스커넥션을통해공격이이루어지므로 상대방의접속을기다려야한다.) 그림 10. 공격실행후리버스커넥션대기 10
3. 피해자가공격자컴퓨터에접속 ( 실제상황에서는정교한공격을위해피싱사이트로피해자를꾀어올것이다.) 을하게되면스크립트가피해자컴퓨터에서실행되고, 감염이된다. 그림 11. 공격자서버에접속한화면 4. 피해자의화면에는아무런결과가나오지않지만, 공격자는피해자접속의결과로 공격코드의최종목적인리버스쉘을따내게되어피해자컴퓨터를장악하게된다. 그림 12. 피해자의접속으로리버스커넥션이성립 11
3.3. 공격기법분석 [ MS12-020 & CVE-2012-0754 취약점분석보고서 ] 3.3.1 동적분석을통해분석대상파일추출 1) 해당취약점공격이웹상에서행해지므로 wireshark 를이용해 http 관련패킷만필터링한 다음, 어떤메커니즘으로공격이수행되는지확인한다. 그림 13. http 필터링으로필요정보만추출 패킷확인결과피해자가웹페이지에대한요청을하면공격자가이에대한응답페이지를클라이언트에전송한다. 이웹페이지내부소스에서취약점을가진 mp4 파일을실행시키는 swf 파일을피해자로전송하게되고, 마지막으로 mp4 파일을보내서웹상에서실행되는구조를가진다고추측할수있다. 2) 피해자가웹페이지에대한최초요청시공격자의응답내용을살펴보면소스를확인할수 있다. 실제로그림.. 의 25 번패킷내용을확인했더니, IE 상에서 Heap Spray 를실행하는 코드를가지는 java script 소스가발견되었다. 그림 14. Java Script 소스내부 해당소스는.mp4 취약점에서예외가발생해프로그램흐름이감염된힙영역으로이동해 원하는공격코드를실행할수있도록, 우선 Heap Spray 를통해메모리를감염시킨다음 mp4 파일을로딩시켜주는 swf 파일을웹상에서실행하는구조를가지고있다. 12
그림 15. 힙스프레이수행부분 이부분은웹페이지제일아랫부분에위치하는실질적인공격코드생성부분이다. 이 부분은앞서그림 42 의내용을 javascript 소스마지막에삽입한것이다. 그림 16. swf 실행부분 그림 43 에서힙스프레이공격이수행되고, 현재프로그램의제어흐름을힙스프레이를 통해감염된영역으로이동시키기위해취약한바이너리를포함하는 swf 파일을실행시킨다. 13
3) 상세한분석을위해공격자가피해자측에전송하는 swf 파일과 mp4 파일을 wireshark 를 이용해추출한다. 그림 17. wireshark 로분석대상파일추출 4) 동적분석을통해다음과같이분석이요구되는 3 개의파일을추출했다. (1) heap 을감염시키는자바스크립트를포함한 html 소스 (2) 취약한 mp4 파일을실행시키는 swf 플래시파일 (3) 취약한정보를담고있는 mp4 파일 3.3.2 미디어파일분석 (swf / mp4) 1) LGJHrd.swf 분석 (swf decompiler) 그림 18. 취약한 swf 파일내부구조 14
swf 는단순히 mp4 파일을가져와실행하는기능만가지고있다. flash player 에서 mp4 를바로실행할수없으므로, flash player 에서 swf 를실행하고, 내부함수를이용해 mp4 를불러오는메커니즘을가지고있음을위그림에서확인할수있다 ( 피해자브라우저상에서 swf 가실행 ). 2) test.mp4 분석 (AtomboxStudio) (1) mp4 파일내부구조를확인할수있는도구인 AtomboxStudio 에서 test.mp4 파일을 불러온다. 그림 19. 취약한 mp4 파일헤더부분 위그림에서보듯이헤더부분에 cprt( 문제가있을것으로예상되는부분 ) 가존재하고, 그 뒤에 0c0c 로계속채워져있음을확인할수있다. cprt 는저작권정보를담고있는 mp4 의헤더요소중하나 (2) 전체파일이어떠한형태를가지는지확인한다. 그림 20. 취약한 mp4 파일전체구조 15
(3) 정상적인 mp4 파일은어떠한형태를가지고있는지확인한다. 그림 21. 정상적인 mp4 파일구조 정상 mp4 파일에는위그림과같이다양한헤더정보가포함되어있음을확인할수있다. 3.3.3 Ollydbg 분석 1) Ollydbg 의 Just-in-time-debugging 기능을사용하면현재수행중인프로세스에서 Crash 가발생할때를포착하여디버깅작업을할수있다. Crash 발생을위해, Paros 로수신한자바스크립트부분을수정한다. %ubbbb%ubbbb 그림 22. crash 발생을위해응답값변조 2) Ollydbg - Options - Just-in-time-debugging 선택 그림 23. Just-In-Time debugging 옵션선택 16
3) Make OllyDbg just-in-time debugger 버튼과 Attach without confirmation 버튼을눌러 활성화시켜준다. 이렇게되면 Crash 발생시해당프로세스에디버거가 attach 되어 디버깅을수행할수있게된다. 그림 24. Just-In-Time debugging 기능활성화 4) Crash 가발생하고 Ollydbg 가 iexplorer 에 attach 되어다음과같이디버깅화면이나타난다. ( assembler 부분의코드는나타나지않았다. ) 그림 25. Crash 발생후디버거화면 5) 어디가문제인지확인하기위해 F7 을눌러보았더니, EIP. 즉다음수행할주소가읽을수 없는주소라는메시지를확인할수있다. 그림 26. 충돌 (EIP 에러 ) 메세지 17
6) 그런데 EAX 에익숙한주소가보인다. 바로 0C0C0C0C 이다. 0C0C0C0C 는취약한 mp4 안에도삽입된주소이고, 또한변경전 NOP 에기록된주소이다. EAX 에기입된 '0C0C' 가정확히어떤메커니즘에의해처리된것인지확인할필요가있다. 그림 27. 두가지소스의 '0C0C0C0C' 7) 우선 EAX 가가리키는내용을따라가본다. (Follow-in-dump 이용 ) EAX 가가리키는곳에는 Crash 를위해임의로변경한문자인 'BBBB' 가채워져있다. 그림 28. EAX 가가리키는부분을확인 8) 앞에서 '0C0C' 가두가지경로를통해지정된것을확인했다 (MP4 와 NOP). 하지만, NOP 값은우리가 'BBBB' 로변경했으므로, EAX 레지스터가가리키는 '0C0C0C0C' 는 test.mp4 에서나온것임을알수있다. 그렇다면취약한 MP4 생성부분에서 '0C0C' 를 '0D0D' 로바꿔 EAX 가변경이되는지확인해보자. 18
그림 29. mp4 파일생성부분수정 \x0d\x0d\x0d\x0d 9) mp4 내용을 '0d0d' 로바꾸고, nop 에 crash(bbbb) 를걸었더니, EAX 가 '0D0D0D0D' 로바뀌고, 그안에마찬가지로 BBBB 가삽입된것을확인할수있다 그림 30. 수정한부분이프로그램흐름에반영된모습 10) 정확한오류발생메커니즘을밝혀보자. 우선 Crash 가발생하는부분이어떤명령인지 알아본다. 이를위해 NOP 에임의로 BBBB 를주입하고, crash 를발생시킨다. crash 발생후 디버거의스택상태창확인을통해, 마지막으로수행된코드를추적할수있다 그림 31. crash 원인을찾기위해스택역추적 19
11) 코드창에 Flass11e(flash player) 의코드가나온다. 아래에표시된코드가마지막으로실행되었고, 다음명령을수행하는과정에서변조된 EIP 로인해 crash 가발생한것을확인할수있다. 그림 32. 에러발생전마지막으로실행된부분 12) Flash11e 의어떤부분에서취약점이발생했는지확인하기위해, 새롭게인터넷창을켜고, 이번에는 ollydbg 로 iexplorer.exe 에 attach 를수행해실시간으로디버깅을해보겠다. 13) attach 후, 인터넷브라우저에서 mp4 를실행하기바로전, 즉 swf 를실행하는시점에서디버거의메모리맵을보면 Flash11e 이미지가올라와있는것을확인할수있다. 취약한 mp4 파일을받아와서실행하기전에미리 break 를걸어두고, 코드를하나씩실행해가며문제점을찾아본다. 그림 33. 메모리에서 Flash11e 영역검색 14) 그림 59 에서문제가되었던코드부분을찾아냈다. 정확히어디서부터문제가발생했는지 알수없으므로해당코드가포함된곳에서어느정도떨어진부분을찾아 ( 새로운흐름이 시작되는부분이좋다 ) Memory Break 를걸어둔다. 20
그림 34. 문제의원인으로추정되는코드발견 그림 35. 원인코드가포함된함수의시작부분에 Memory B.P 설정 15) 브레이크된부분부터 F8 을눌러가며취약점과관련된코드를찾아내는과정에서, 다음과 같은정보를얻을수있었다. (1) swf 파일내부의함수부분을발견 (151D8B24) 그림 36. swf 내부의함수를담고있는부분 21
(2) flash 버전과관련된내용을담고있는부분 (154AB160) 그림 37. flash player 버전과관련된부분 (3) kernel32.readfile API 를이용해 mp4 파일을읽어들인다음버퍼 (15A7E028) 에저장 그림 38. mp4 파일을읽어오는 ReadFile API mp4 가저장된버퍼주소를따라가보면공격코드에서생성한 test.mp4 의바이너리가 위치해있는것을확인할수있다. 그림 39. mp4 파일이로딩되어저장된부분 16) 계속해서프로그램흐름을따라가다보면다음과같이예외가발생하는부분을만나게 된다. ESI+514 위치에 '0c0c0c0c' 가담겨있는데, 해당주소가가리키는내용을 ESI 에다시 22
덮어쓴다. 그뒤에 ESI 내용 (0C0C0C0C) 을 EAX 로복사하면아래그림과같이 EAX 에도 '0C0C0C0C' 가주입되게된다. 아래그림의블록중마지막코드인 CALL DWORD PTR DS:[EAX+8] 을실행하게되면 Crash 발생을위해주입했던무더기의 'BBBB' 를만나게되고, EIP 가 BBBB 를찾을수없어결국 Crash 가발생하게된다. 그림 40. 상세분석으로발견한 Crash 발생메커니즘 17) ESI+514(=154AB160) 은앞에서보았듯이원래버전에대한정보를담고있는부분인데, 특정 opcode 로인하여 '0C0C' 로덮어씌어진것이라고추측할수있다. 해당부분이 어떻게변경이된것인지가이번취약점의핵심메커니즘이될것이다. 18) 문제가되는부분 (154AB160) 에 BreakPoint 를설정해추적한결과, 다음 opcode 의내부 메커니즘에의해값이임의로변경된것을확인했다. 더자세한분석을위해 opcode 가 포함된함수의첫시작부분에 Breakpoint 를걸어분석을수행한다. 그림 41. opcode 분석을위해시작부분에 B.P 설정 23
19) 세부분석결과, 앞에서제시한 opcode(call flash11e.15138b50) 가취약점을유발하는 핵심기능을하는것으로밝혀졌다. 자세한발생메커니즘은다음과같다. 그림 42. 취약점발생원리 1 mp4 파일에서모든내용을다읽어오기전까지반복적으로실행된다. 2 flash11e.1518b50 호출후에사용할값들을스택에저장한다. 3 mp4 파일내용을차례대로특정비트 (CALL 이전, 2번에서설정 ) 만큼가져온다. 4 mp4 내부바이너리를가져올때, 최대 8 비트만큼가져오도록소스가구성되어있다. 만일한꺼번에가져오려는부분이 8 비트를초과할경우, JB 명령에서점프를수행하지않고아래의 REP 명령을실행하게된다. 해당프로그램에서발생한오류로인해 ECX 가 8 을훨씬뛰어넘는값 (2586) 을가지게되었고, 이로인해흐름이 REP 로이동하게된다. 20) REP 는 Repeat Following String Instruction 의약자로, 주어진조건에만족할때까지계속특정명령을실행하겠다는의미이다. ECX ( 카운터레지스터 ) 가 0 이될때까지차례로값을 decrease 하면서 ESI(mp4 내용을담고있는부분 ) 의내용을 EDI( 덮어씌어지는부분 ) 로복사하는명령을수행한다. 그림 43. REP 가수행하는세부명령 21) 위그림에서 '2586' 이라는숫자를주의깊게볼필요가있다. 공격코드작성시취약한 mp4 파일에들어갈항목들을직접기입했음을기억할것이다. 특히마지막부분에 '\x0c\x0c\x0c\x0c" * 2586 를입력했다. 취약한 flash player 버전에서는 mp4 파일을 parsing 할때, 비슷한항목을가지는부분을한꺼번에묶어서처리하는메커니즘을가지고있다. 2586 개의 '0c0c0c0c' 는한꺼번에처리되어야할부분으로인식이되었지만프로그램자체의처리능력은한번에 8 비트밖에되지않아 parsing 오류가발생하게된것이다. 24
4. 결론 CVE-2012-0754 는최근유행하고있는멀티미디어취약점의대표적사례라고할수있다. 불과한달전에는해당취약점을악용한게임핵으로인해많은피해가발생했다. 많은사용자들은 Adobe Flash player, Acrobat reader 와같은멀티미디어지원및문서프로그램의보안상결함을간과하는경향이있다. 상대적으로 MS 취약점들에의해그중요성과심각성이크게부각되고있지않은탓이다. 멀티미디어프로그램에대한정기또는비정기적인보안업데이트를소홀히하면그위협은 MS 취약점이상이될수있다. 운영체제의기본정책으로방지할수없는부분들이많기때문이다. 앞에서도강조했지만, 무엇보다중요한것은새로운취약점과잠재적인보안위협에대한 지속적인관심과업데이트라고할수있다. 이는단순히백신프로그램으로해결할수있는 부분이아니므로사용자의각별한주의가요구된다. 25
5. 대응방안 [ MS12-020 & CVE-2012-0754 취약점분석보고서 ] 5.1. 보안업데이트설치 1. Adobe 공식사이트를방문해보안패치가된새로운버전을받거나, Flash player 업데이트를통해취약점에대한공격을예방할수있다. 그림 44. Adobe 공식사이트의취약점관련정보 26
6. 참고자료 [ MS12-020 & CVE-2012-0754 취약점분석보고서 ] 6.1. 참고문헌 - Exploit_writing_tutorial part 10 by Peter Van Eeckhoutte - Runtime Attacks: Buffer Overflow and Return-Oriented Programming by Prof. Dr.-Ing. Ahmad-Reza Sadeghi and M.Sc. Lucas Davi 6.2. 참고웹문서 - http://contagiodump.blogspot.com/2012/03/mar-2-cve-2012-0754-irans-oil-and.html - http://www.adobe.com/support/security/bulletins/apsb12-03.html 27