취약점분석보고서 = MS12-037 = 2012-08-09
목 차 1. 개요... 1 1.1. 취약점분석추진배경... 1 1.2. MS12-037 취약점요약... 1 1.3. MS12-037 취약점개요... 1 1.4. MS12-037 대상시스템목록... 1 2. 분석... 2 2.1. 공격기법및기본개념... 2 2.1.1 DOM(Document Object Model)...2 2.2. MS12-037 공격코드... 3 2.2.1 공격코드분석...3 2.2.2 공격코드실행...7 2.3. 공격기법분석... 8 2.3.1 동적분석을통해공격흐름파악...8 2.3.2 정적분석으로취약점발생원리탐색... 10 3. 결론... 17 4. 대응방안... 18 5. 참고자료... 18
그림목차 [ 그림 1] DOM 의의미... 2 [ 그림 2] 공격코드구조... 3 [ 그림 3] 공격코드중 ROP 부분... 3 [ 그림 4] 공격코드중 HeapSpray 부분... 4 [ 그림 5] 취약점발생부분구조... 4 [ 그림 6] DIV 속성의자세한내용... 4 [ 그림 7] feng_shui_f 함수내용... 5 [ 그림 8] Crash_f 와 trigger_f 함수내용... 6 [ 그림 9] 옵션설정... 7 [ 그림 10] 모듈을실행후서버가동... 7 [ 그림 11] 공격이성공적으로수행된화면... 7 [ 그림 12] 공격성공후피해자측브라우저 ( 아무런증상이나타나지않음 )... 8 [ 그림 13] 공격성공후프로세스상태 (Process Explorer 이용 )... 8 [ 그림 14] Wireshark 로캡쳐한패킷... 9 [ 그림 15] Wireshark 를이용해 http 응답값을추출... 9 [ 그림 16] 취약점유발웹페이지내용... 9 [ 그림 17] 디버거를 JIT 모드로변경... 10 [ 그림 18] 요청값변조로충돌발생을유도... 10 [ 그림 19] 충돌발생후 attach 된디버거모습... 11 [ 그림 20] 1C1C1C 안에채워진내용을확인... 11 [ 그림 21] 쉘코드시작부분과이어져있는 NOP Slide... 12 [ 그림 22] 스택에마지막으로실행된부분... 12 [ 그림 23] 취약점유발코드를호출하는부분... 12 [ 그림 24] 모듈로드에변화가있을때마다브레이크되도록설정하는화면... 13 [ 그림 25] 분석을위해임의로 EP 를변조... 13 [ 그림 26] EP 부분을정상코드로재변환... 13 [ 그림 27] 함수의시작점을찾기위해어셈블리코드로해당지점검색... 14 [ 그림 28] 원하는부분을찾아브레이크포인트설정... 14 [ 그림 29] 웹페이지에서보았던 'id' 들을스택에서확인... 14 [ 그림 30] 스택에서순차적으로처리되는 id 속성... 15 [ 그림 31] Navigator 가실행된모습... 15 [ 그림 32] 취약점발생개요도... 16 [ 그림 33] 윈도우업데이트설정화면... 18
1. 개요 1.1. 취약점분석추진배경 최근유행하는악성코드들은대부분제로데이취약점을이용해시스템을공격한다. MS 관련취약점은 Java, flash player 와같이타벤더사에서발생하는멀티미디어취약점들에비해비교적패치가빨리이루어지는편이다. 하지만패치가되기전까지제로데이취약점들은악의적의도를품은공격자들에의해얼마든지악용될수있다. 비록해당취약점은이미패치되었지만, 분석을통해시스템에어떠한취약점이발생할수있는지, 그리고그취약점이어떤방식으로악용될수있는지자세히알아볼필요성이제기되어분석보고서를작성하게되었다. 1.2. MS12-037 취약점요약 MS12-037 은 2012 년 6 월 12 일에발표된취약점으로, Internet Explorer 8 상에서 ID 속성을처리할때발생하는결함을이용하는취약점이다. 해당취약점을이용해공격자는원격코드실행뿐만아니라, 시스템변조, 서비스파괴등치명적인공격을수행할수있다. 현재는 Microsoft 사에의해패치가완료된상태이다. 1.3. MS12-037 취약점개요 취약점이름 MS12-037 Internet Explorer Same ID Property Deleted Object Handling Memory Corruption 최초발표일 2012 년 6 월 12 일 문서작성일 2012 년 8 월 9 일 위험등급 높음 벤더 Microsoft 취약점영향 원격코드실행 현재상태 패치됨 [ 표 1] MS12-037 취약점개요 1.4. MS12-037 대상시스템목록 해당취약점 Internet Explorer 8 이설치된윈도우운영체제에서취약점이발생가능하다. Microsoft Windows 7 Microsoft Windows XP Microsoft Windows server 2003 Microsoft Windows server 2008 Microsoft vista 1
2. 분석 2.1. 공격기법및기본개념 2.1.1 DOM(Document Object Model) 가. 정의및장점 The World Wide Web Consortium(W3C) Document Object Model(DOM) 은플랫폼과언어인터페이스에영향을받지않고손쉽게문서에접근, 구조및컨텐츠업데이트를가능하게하는일종의 API 라고할수있다. W3C DOM 모델은 html 과 xml 문서를표현하는객체의세트를어떻게표준화할것인가에대한내용뿐만아니라, 문서들에접근하고그것들을조작할수있는인터페이스도포함한다. W3C DOM 의가장큰장점은수많은컨텐츠들을업데이트하기위해또는여러개의문서조각내에존재하는컨텐츠들을이용해작업하기위해문서의모든부분에접근가능하다는것이다. 나. Javasrcipt 를위한 DOM [ 그림 1] DOM 의의미 D : 사용자가웹페이지를생성하고그것을브라우저에로드하면, DOM 이본격적으로동작한다. DOM 은사용자가작성한문서를 ' 객체 ' 형태로변환한다. O : 자바스크립트의객체에는다음과같이세가지종류가존재한다. - 프로그래머가제작한사용자정의객체 - 배열, 수학연산, 날짜와같이자바스크립트내에구축된네이티브객체 - 브라우저에서제공되는호스트객체 M : DOM 에서 M 은모델을의미한다. 또다른의미로 ' 지도 ' 라고부를수도있다. 지도와같이모델은무언가를표현하는수단이다. 모형기차가실제기차를표현하고, 도시의지도가실제도시를표현하듯이, DOM 은현재브라우저에로드된웹페이지를표현한다. 브라우저가페이지에대한지도를제공하면, 사용자는이지도를읽기위해자바스크립트를사용할수있다. 2
2.2. MS12-037 공격코드 2.2.1 공격코드분석 공격코드는루비 (Ruby) 언어로작성되었으며, Metasploit Framework 구성되었다. 전체적인코드구성은다음과같다. 에서기능하도록 [ 그림 2] 공격코드구조 가. 모듈옵션조정 이부분은해당코드가 Metasploit 내에서모듈로쓰이기위해필수로들어가야할부분 이다. MS12-037 공격코드에는다음과같은내용이포함되어있다. 1) 모듈정보 ( 취약점요약, 저자, 라이센스, 레퍼런스등 ) 2) 페이로드오프셋조정 3) 대상시스템에따른 ROP 종류및오프셋구분 4) 기타추가되는모듈실행옵션항목에대한내용 ( 자바스크립트난독화기능제공 ) 나. ROP 설정이부분은공격코드가작동하는시스템에서메모리보호를위해실행되는 DEP 및 ASLR 기능을우회하기위해실행되는 ROP 부분을담고있다. 이 ROP 부분은 corelan.be 에서제공하는 'mona.py' 를통해제작되었다. 또한, OS 별로상이한 ROP 설정을위해두가지종류의 ROP(msvcrt, jre) 를제공한다. [ 그림 3] 공격코드중 ROP 부분 3
다. Heap Spray 부분 최근에 공개된 대다수의 취약점의 경우처럼, MS12-037 도 취약점 발생 후 프로그램의 흐름을 힙 스프레이 기법을 이용해 뿌려진 공격코드로 이동하도록 구성했다. 다음은 공격코드에 포함된 힙 스프레이 코드의 모습이다. [그림 4] 공격코드 중 HeapSpray 부분 라. 취약점 발생 부분 취약점 발생 부분은 크게 2 가지로 구분할 수 있다. 어떠한 부분으로 구성되어 있는지, 각 영역은 어떠한 특성을 가지고 있는지 알아보자. [그림 5] 취약점 발생 부분 구조 첫째, [그림 5]의 왼쪽에 보이는 속성 부분이다. 취약점 유발에 핵심 역할을 하는 부분으로써, 아래 그림에서 보는 것처럼 DIV 속성 아래 img 링크와 자식 div 로 이루어져 있다. 여기서 DIV 는 HTML 문서의 특정 섹션을 하나의 컨테이너로 묶어주는 역할을 하는 기능을 갖고 있다. [그림 6] DIV 속성의 자세한 내용 4
DIV 내부를자세히들여다보면, id 가 imgtest 인부분이두가지인것을확인할수있다. 첫째로, 이미지링크의 id 가사용된다. 이이미지에링크된함수는바로힙스프레이를 유발하는 feng_shui_f() 함수이다. 둘째로, 외곽 div 내부의또다른 div 에 imgtest 가 사용된다. 해당 div 에서는 DOM 이벤트객체인 OnMouseOver 와 OnMouseOut 을 crash_f() 함수로이어주도록선언되어있다. 둘째, [ 그림 5] 의오른쪽부분에있는자바스크립트함수부분이다. 여기서는 MS12-037 취약점발생과깊은관련이있는함수위주로설명하도록한다. a) feng_shui_f() 이함수는힙스프레이를담당하는함수이다. 취약점이유발되면이함수를통해프로그램흐름이힙스프레이된코드로이동하게된다. 후에 [ 그림 7] 에보이는 0x1c1c1c0c 부분을변조해충돌을발생시켜공격기법분석을수행하도록하겠다. [ 그림 7] feng_shui_f 함수내용 이함수에서특이한점은 [ 그림 7] 의박스 (1) 에표시된 div.push 부분과, classname 을지정하는두부분으로추려낼수있다. ㄱ. 'divs.push(document.createelement('div'))' 부분은현재 div 에자식노드를 128 개 생성해주는데, 각각의자식노드는앞서 html 속성부분에서정의한 'div' 의속성을 가지고있다. ㄴ. divs[0~4] 배열의 ClassName 을앞에서임의로정의한태그로지정하는부분이다. 원래 divs[0].classname = vtable1; 하나만있어도무방하나, 공격성공률을높이기위해 4 개로지정된것으로판단된다. (2,3 번을지워도공격이먹힌다.) 5
b) crash_f() 와 trigger_f() crash_f() 함수는충돌을발생시키는부분으로자세한내용은공격기법에서설명하겠다. 한가지생각해야할부분은 eval() 함수의인자로 danger_id 를이용한다는사실이다. trigger_f() 함수는 DOM 을사용한것으로, 웹문서에포함된요소들을가져와특정행동을수행하는기능을포함하고있다. DOM 객체의종류에따라두가지방법으로이벤트를실행한다. W3C 와 IE 로구분하고있을뿐목적은이벤트를발생시켜취약점을발생시킬수있도록하는것이다. 자세한실행흐름은뒤에서설명하도록한다. [ 그림 8] Crash_f 와 trigger_f 함수내용 c) main_f() 메인함수는앞에서구성한힙스프레이코드 ( 그림 4) 를가져와실행하고, settimeout 함수를이용해 1 초가지난후 trigger_f 함수를실행시키도록작성되어있다. 이지연시간은공격코드가힙에스프레이되고난뒤에취약점이유발되도록하기위해의도적으로추가되었다. 6
2.2.2 공격 코드 실행 테스트환경 = 공격자 시스템 : BackTrack 5 R2 + Metasploit = 피해자 시스템 : Windows XP SP3 + Internet Explorer 8 가. Metasploit 모듈을 이용할 것이므로, 해당 모듈을 로드한 뒤 옵션을 설정해 준다. [그림 9] 옵션 설정 나. 모듈을 실행하면 다음과 같이 공격자 서버가 실행된다. [그림 10] 모듈을 실행 후 서버 가동 다. 피해자 서버에서 공격자 서버로 접속하면 피해자 브라우저에서는 오류가 발생하게 되고, 공격자 서버에서는 아래와 같은 절차와 함께 공격이 성공적으로 수행된다. [그림 11] 공격이 성공적으로 수행된 화면 라. [그림 11]과 같이 meterpreter 리버스 커넥션이 성공적으로 맺어지면 공격자는 피해자 시스템에서 별다른 제한 없이 Post-exploitation 공격을 수행할 수 있게 된다. 7
마. 피해자컴퓨터에서공격자서버로접속하면, 브라우저에서아무런증상이나타나지않는다. 하지만이는 Metasploit 에서취약점공격만을위해최소한의기능을가지도록제작된것으로, 실제공격에서는보다더정교한방법으로공격이이루어질수있다. 그예로, 만일공격자가정상웹페이지 ( 인터넷뉴스또는홈페이지 ) 에취약점공격코드를삽입할경우, 사용자는이를인지하지못한채로공격에노출될수있다. [ 그림 12] 공격성공후피해자측브라우저 ( 아무런증상이나타나지않음 ) 2.3. 공격기법분석 2.3.1 동적분석을통해공격흐름파악가. 공격이성공하면 Internet explorer 브라우저의자식프로세스로 notepad.exe 가실행되는데, 이는 metasploit 에서사용하는 Post-exploitation 도구인 meterpreter 가실행되고있는것으로키로깅, 원격조정, 파일업로드등강력한기능을제공한다. 자세한기능은관련문서를참고하길바라며, 이번문서에서는취약점유발원리를밝히는것에초점을맞추도록한다. [ 그림 13] 공격성공후프로세스상태 (Process Explorer 이용 ) 나. 우선공격자와피해자시스템간에주고받는데이터를확인해본다. Wireshark 로공격 시패킷을캡쳐한결과, [ 그림 14] 같이 TCP 세션이성립되고, http 요청이수행되는것을 확인한다. 8
[그림 14] Wireshark 로 캡쳐한 패킷 다. 공격이 인터넷 브라우저 상에서 발생하므로, http 패킷을 추려내어 확인한다. [그림 15] 에서 보듯이 두 시스템 간에 주고받은 http 패킷은 총 2 개이며, 요청과 응답 형태로 구성되어 있다. 피해자의 요청에 대한 공격자의 응답값이 취약점을 일으키는 핵심 코드로, 별도의 텍스트로 저장해 내용을 확인해 본다. [그림 15] Wireshark 를 이용해 http 응답값을 추출 라. 웹 페이지 내용 확인 결과, 공격 코드에서 분석한 것처럼 힙스프레이 코드와 취약점 유발 코드를 가지고 있는 것을 확인할 수 있다. [그림 16] 취약점 유발 웹페이지 내용 9
2.3.2 정적분석으로취약점발생원리탐색 가. 정확한취약점발생원리를확인하기위해디버거를이용해분석을수행한다. 우선 Ollydbg 를 Just-In-Time-debugging 모드로전환해충돌이발생하면자동으로 attach 되어디버깅을할수있도록설정한다. [ 그림 17] 디버거를 JIT 모드로변경 나. Paros 를이용해공격자서버에서보내는응답값을다음과같이변조하면인위적으로 충돌을발생시킬수있다. [ 그림 18] 요청값변조로충돌발생을유도 10
다. 충돌이 발생하면 디버거가 자동으로 attach 되면서 실행되고, 다음과 같이 문제가 되는 코드가 나타난다. [그림 11]에서 보듯이, EAX 안의 내용이 'BBBBBBBB' 로 설정이 되어있어서 MOV EDX, DWORD PTR DS:[EAX+70] 명령 수행을 시도할 때 충돌이 발생하게 된다. [그림 19] 충돌 발생 후 attach 된 디버거 모습 라. 원래 EAX 에 들어갔어야 할 주소는 'BBBBBBBB' 가 아니라 '1C1C1C7C(1C1C1C+70)' 가 된다. 요청값을 변조하지 않을 경우 프로그램 흐름이 어떻게 이동하는지 확인해 보기 위해 '1C1C1C7C' 의 내용을 확인해 본다. [그림 20] 1C1C1C 안에 채워진 내용을 확인 [그림 13]에서 보듯이, '1C1C1C7C' 부분은 공격 코드 중 ROP chain 부분임을 알 수 있다. ROP Chain 을 이용해 메모리 보호 기법을 다시 한 번(MSF 자체에서도 ROP 체인을 제공하고 있다.) 우회한 후, NOP slide 로 흐름을 이어간다. 그 뒤에, 아래 그림처럼 리버스 커넥션을 맺는 공격코드로 흐름이 이동하게 되어 공격이 성공적으로 수행된다. 11
[그림 21] 쉘코드 시작 부분과 이어져 있는 NOP Slide 마. 디버거의 스택 창을 확인하면, 마지막으로 실행된 모듈이 mshtml.dll 임을 확인할 수 있다. 즉, mshtml.dll 내부의 특정 매커니즘에 의해 취약점이 유발되었다는 것으로 추측할 수 있다. [그림 22] 스택에 마지막으로 실행된 부분 바. [그림 22]에서 보이는 스택의 마지막 실행 부분을 'Follow in Assembler' 명령을 수행하면 다음과 같이 취약점이 발생하는 'MOV EDX, DWORD PTR DS:[EAX+70]' 코드가 포함된 부분을 호출하는 코드를 추적해 볼 수 있다. 결정적으로 해당 호출 명령에 의해 취약점이 발생되지만, 근본적인 원인이 되는 메커니즘은 상세한 분석을 통해 검증해 볼 필요가 있다. [그림 23] 취약점 유발 코드를 호출하는 부분 12
사. 해당 취약점의 발생 원인을 찾기 위해 다음과 같은 두 가지 방법을 동시에 사용한다. a) 취약점은 mshtml.dll 모듈 안에서 발생한다. 그러므로 디버거에서 제공되는 기능을 이용해 새로운 모듈이 올라올 때 자동으로 브레이크 포인트가 걸리도록 설정하면 언젠간 mshtml.dll 이 올라오는 부분을 포착할 수 있다. [그림 24] 모듈 로드에 변화가 있을 때마다 브레이크 되도록 설정하는 화면 b) 모듈이 처음으로 실행되는 Entry Point 부분의 소스를 'CC'로 변경해 모듈이 처음 시작되는 부분에서 인터럽트가 발생해 프로그램 실행이 잠시 정지된다. [그림 25] 분석을 위해 임의로 EP 를 변조 아. [그림 24] 와 [그림 25]에서 사용한 방법을 통해 취약점을 발생시키면, 다음과 같이 mshtml.dll 모듈에 접근할 수 있게 된다. 모듈이 로드 되면 우선 앞서 변조했던 EP(Entry Point) 부분을 정상코드로 변환시킨다. [그림 26] EP 부분을 정상 코드로 재변환 13
자. [그림 23]에서 확인한 취약점 유발 코드로 가는 호출 명령 ( CALL mshtml.6363fcc4 ) 을 포함하는 함수의 시작점을 mshtml.dll 내부에서 찾아 브레이크 포인트를 걸어준다. ( sequence of commands 기능을 이용 ) [그림 27] 함수의 시작점을 찾기 위해 어셈블리 코드로 해당 지점 검색 [그림 28] 원하는 부분을 찾아 브레이크 포인트 설정 차. 브레이크 포인트(BP)를 건 뒤 프로그램을 재실행 시켜주면 우리가 지정한 BP 에 흐름이 멈추게 되고, 스택 창에서 코드 분석 시 보았던 'testfaild'라는 친숙한 단어를 발견할 수 있다. 반복적으로 F9(실행) 을 몇 차례 누르면 다음과 같이 스택에 취약점 유발 웹페이지에서 보았던 'id' 들이 보인다. mshtml.dll 모듈에서는 공격코드 분석에서 제시한 순서, 즉 웹페이지에 기록된 순서에 따라 'id'를 처리하는 것을 확인할 수 있다. [그림 29] 웹페이지에서 보았던 'id' 들을 스택에서 확인 14
카. 브레이크 포인트를 유지한 채로 프로그램을 계속 실행하다 보면 [그림 29] 처럼 스택 부분에서 앞서 처리된 id(testfaild) 부분들을 확인 가능하다. 분석을 반복적으로 진행하다 보면 아래 그림과 같은 순서로 id 값들이 처리된다. [그림 30] 스택에서 순차적으로 처리되는 id 속성 [그림 30]에서 주의를 기울어야 할 부분이 몇 가지 있다. 우선 'Navigator' 부분은 취약점 발생을 위한 관문 역할을 하는 부분으로, 이 부분을 진행하면 다음과 같이 새로운 환경 설정에 대한 안내가 나온다. [그림 31] Navigator 가 실행된 모습 [그림 31]처럼 'Ask me later' 버튼을 누른 뒤 특정 매커니즘에 의해 실질적인 취약점이 발생하게 된다. 하지만 여기서 중요한 점은 바로 그림 30 에서 볼 수 있는 회색 박스 안의 id 부분이다. 타. MS12-037 취약점은 Internet Explorer 에서 같은 ID 속성을 처리할 때 충돌이 발생하는 결함을 이용해 공격을 수행한다. 바로 [그림 30]의 회색부분이 바로 취약점 유발 부분인데, 만일 브레이크 포인트(BP)를 해제하지 않고, id 가 처리 되는 매커니즘을 하나씩 확인하려 시도하면 취약점이 발생되지 않는다. 그 이유는 같은 id 를 가지는 여러 객체가 동시에 불러져 와야 충돌이 발생하기 때문이다. 취약점 발생 원리를 그림으로 간단히 표현하면 다음과 같다. 15
[ 그림 32] 취약점발생개요도 a) main_f 함수 : 메인함수에서는힙스프레이를수행하고 1 초가지난후 trigger_f() 함수를호출한다. b) trigger_f : DOM 객체를처리하는부분이다. 공격코드에서는 W3C 와 IE 두가지 DOM 에대한처리를해주고있지만, 실질적으로 IE DOM 만사용되었다. (fireevent 함수는 IE DOM 에서작동하는함수이다.) c) FireEvent : 실질적으로취약점이발생하는부분이다. fireevent 가실행되는벡터는두가지가존재하는데하나는 crash_f() 함수를실행하는부분이고, 나머지하나는 feng_shui_f() 함수를실행하는부분이다. 두함수는모두 'imgtest' 라는 id 와연관이되어있는데, Internet Explorer 가 crash_f() 함수내부의 eval() 함수를이용해 imgtest 의속성을불러올때프로그램의흐름은 imgtest 라는 id 를가지는이미지또는 div 에접근할수있게된다 ([ 그림 6] 참고 ). 즉, fireevent 에서 crash_f() 로이동하거나, feng_shui_f() 로이동하게되는것이다. 만일흐름이 crash_f() 로이동한다고하더라도, 또다시 fireevent 의실행부분으로돌아오게되고 ([ 그림 32] 의 where to go 부분 ) 두갈림길에봉착하게된다. 그러다가언젠가는 feng_shui_f() 로흐름이이동해힙스프레이가뿌려진곳으로프로그램이이동하게되어쉘코드가실행되는원리이다 ( 공격코드실행시마다취약점이발생하는시간이조금씩다르다 ). 16
3. 결론 MS12-037 취약점은인터넷브라우저의 ID 속성처리매커니즘에존재하는결함을이용한취약점이다. 비록공개된다른취약점들에비해비교적패치가빨리이루어졌지만최근이슈가되고있는 XML 이나기타 JAVA 및 Flash 멀티미디어관련취약점과는다소다른유형으로다소특이한원리를가지고있다. 비록정확한코드분석을통한근본적인결함에는다가가지못했지만, 브라우저가 DOM 객체를처리하는과정에서취약점이발생할수있다는사실을확인했다는점에서시사하는바가크다. 문서내에존재하는모든객체를간편하게끌어다쓸수있는 DOM 기능은사용자에게편리성을제공해주는반면 MS12-037 과같은보안결함을유발할수있다는사실이이번분석문서를통해밝혀졌다. 17
4. 대응방안 MS12-037 은현재패치가완료된상태로, 자동업데이트를사용하는사용자는해당취약점에 대한위험요소를가지고있지않다. 만일업데이트를수동으로설정했거나, 운영체제를새롭게 설치한사용자라면보안업데이트를반드시적용해야한다. [ 그림 33] 윈도우업데이트설정화면 5. 참고자료 1. 참고문서 - DOM Scripting by Jeremy Keith 2. 참고사이트 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms764730(v=vs.85).aspx 18