[ 보안위협분석보고서 ] 취약점을이용한아이폰탈옥 (JailBreak) 상세분석보고서 Ver 1.2 (Revision 8/12) 2010. 08. 03 ( 주 ) 하우리사전대응팀
목차 1. 보안위협동향분석... 2 1-1. 아이폰웹기반탈옥툴 JailbreakMe 2.0 star 공개... 2 2. 취약점상세분석... 5 2-1. 취약점을이용한아이폰 JailBreak 상세분석... 5 2-1-1. FreeType 2 CFF Font Stack Corruption Vulnerability - CVE-2010-1797... 5 2-1-2. IOSurface Integer Overflow Vulnerability - CVE-2010-2973... 9 3. 하우리사전대응팀... 14 1
1. 보안위협동향분석 1-1. 아이폰웹기반탈옥툴 JailbreakMe 2.0 star 공개 JailbreakMe 사이트는 USER-AGENT 값을확인하여모바일사파리 (Safari) 브라우저로접속하였는지확인하고, 다음과같은자바스크립트를통해서각각의아이폰, 아이팟, 아이패드펌웨어버전에해당하는 PDF 파일로이동한다. 8월 1일데브팀 (DEV-Team) 의 Comex가개발한아이폰 (iphone) 의웹기반탈옥툴 JailbreakMe 2.0 star 가공개되었다. 7월말미국정부가아이폰탈옥 (Jailbreak) 에대해서불법으로볼수없다고발표한뒤에공개된것이라사람들의관심이더욱커지고있다. 해당툴은아이폰운영체제 (ios) 4.X, 3.X 버전을설치한아이패드, 아이폰4, 아이폰 3GS, 3G 모든단말기에서사용할수있다. 이번에공개된탈옥툴은지난탈옥방식과달리아이폰의모바일사파리 (Safari) 브라우저로 JailbreakMe 사이트 (www.jailbreakme.co m) 에접속하는것으로간단히탈옥이가능하다. 다음화면은모바일사파리브라우저를이용해서 JailbreakMe 사이트에접속한화면이다. 이화면에서슬라이드를오른쪽으로밀면탈옥 (Jailbreak) 이시작된다. <JailbreakMe 리다이렉트소스 > 탈옥사이트 (http://www.jailbreakme.com/_/) 에서펌웨어버전별로만들어진 PDF 파일을확인할수있다. < 아이폰탈옥에사용되는 PDF 파일 > < 아이폰탈옥프로그램 - JailbreakMe 2.0 star > 다음화면은아이폰운영체제 (ios) 4.0에서탈옥을진행하고있는화면이다. 탈옥이완료되면 Cydia 애플리케이션이설치된다. 이번아이폰탈옥은 FreeType2 폰트엔진이 PDF 내부에포함되어있는 CFF 폰트를처리하는과정에서발생하는취약점과 IOSurface 속성처리과정에서발생하는두가지취약점을이용한다. 탈옥에사용되는 iphone3,1_4.0.pdf 파일을대상으로관련된내용을살펴보자. 인코딩된 CFF 폰트 (Type1C) 스트림은 PDF 파일내부의 13번째오브젝트에위치해있다. <JailbreakMe 2.0 star - 탈옥진행화면 > <PDF 내부에인코딩되어포함된 CFF 폰트 > 2
PDF 파일의 13 번째오브젝트를 PDF 파서 (Parser) 를사용해디코딩 한화면이다. 해당취약점을이용하여악성코드제작자는악의적인 PDF 파일을제작하고, 이를메일에첨부하여발송하거나 SMS 메시지의링크를통해사용자에게악성 PDF 파일을실행하도록유도할수있다. <PDF 파서 (Parser) 를이용한디코딩 > 디코딩된데이터에서탈옥과관련된많은정보를얻을수있다. 다음화면에서탈옥진행에필요한 wad.bin 파일과탈옥과관련된문자열들을발견할수있다. < 이메일을이용한악성 PDF 유포 > 이외에도트위터에악성 PDF 파일로연결되는단축 URL을남기는등의사회공학적인방법을이용해사용자의접속을유도할수있다. < 디코딩된데이터내용 > 이외에도 IOSurfaceBytesPerRow, IOSurfacePixelFormat, IOSurfaceHeight, IOSurfaceWidth 설정값들이비정상적으로크게설정되어있다. < 트위터를이용한악성 PDF 유포 > 8월 11일애플에서는 PDF 파일을열어볼때발생할수있는보안상의문제점을해결한아이폰운영체제 (ios) 4.0.2를발표했다. 사용자들은아이튠즈 (itunes) 업데이트기능을이용해업데이트가가능하다. <IOSurface 의비정상적인설정값 > < 아이폰운영체제 (ios) 4.0.2 소프트웨어업데이트 > 3
데브팀 (DEV Team) 의 Comex 는이번아이폰탈옥소스파일을트위 터를통해공개했다. 아직까지해당취약점을이용한악성코드의유포사례는발견되지않았다. 하지만, 탈옥툴을개발한 Comex가소스파일을공개하여이를악용한또다른공격이우려되고있다. 아직까지아이폰운영체제를업데이트하지않은사용자들은악성 PDF 파일을통해악성코드에감염될수있으므로아이폰운영체제 (ios) 를 4.0.2 버전으로업그레이드하고출처가불분명한 PDF 파일은함부로열어보지말아야한다. < 데브팀 (DEV-Team) 의 Comex 트위터 > 다음은 Comex가공개한탈옥소스파일이다. 해당파일은 github (http://github.com/comex/star) 에서다운로드받을수있다. <Comex 가공개한 JailbreakMe 2.0 star 소스 > 탈옥툴을개발한 Comex는탈옥한아이폰에서플래시 (Flash) 를사용할수있도록만들어주는프래시 (Frash) 라는애플리케이션도개발했다. 모바일사파리브라우저는플래시를사용할수없지만, 안드로이드용플래시플레이어 (Flash Player) 를아이폰운영체제 (ios) 에맞게포팅하여사용할수있게만들었다. <Comex 가개발한프래시 (Frash) 애플리케이션 > 4
2. 취약점상세분석 2-1. 취약점을이용한아이폰 JailBreak 상세분석 파일을로딩한다. Javascript를사용하지않고, 웹페이지에바로접근할경우다음과같이여러버전의 PDF 파일을확인할수있다. 최근아이폰을탈옥하는사이트인 JailBreak 사이트가문을열었다. 기존의탈옥사이트와는달리사이트에접속한후, 슬라이드바를미는순간아이폰이탈옥되기때문에, 사용자들에게많은인기를끌고있다. 하지만이러한기능은아이폰자체에존재하는보안취약점을이용하는것으로, 공격자가해당취약점을이용할경우아이폰에서동작하는악성코드가유포되거나사용자의주요정보가유출될수있다. 아이폰의기본브라우저인 Safari가악의적으로조작된 PDF 파일을처리하는과정에서, 원격의공격자로부터코드실행을허용할수있는취약점이존재한다. 공격자는웹서버를구성한후악의적인 PDF를업로드하고, 사회공학적기법을통해사용자들의접속을유도하는방식으로공격을수행할수있다. 최근웹사이트방문만으로아이폰을탈옥할수있는 JailBreak 서비스는탈옥프로그램의자동실행을위해해당취약점을이용하고있다. JailBreak의경우단순히사용자의아이폰 / 아이패드 / 아이팟 ( 이하아이폰으로통일 ) 등의단말기를탈옥하는용도로사용하고있지만, 공격자가이를악용할경우사용자의아이폰에악의적인목적의코드를삽입할수있다. <ios 버전별 PDF 파일 > 2-1-1. FreeType 2 CFF Font Stack Corruption Vulnerability - CVE-2010-1797 JailBreak의웹페이지의초기화면에접근할경우 Javascript가실행되며, 슬라이드를통해탈옥프로그램실행여부를질의한다. 해당코드실행취약점은 PDF 파일내의 CFF(Compact Font Format) 가공격자에의해조작되었을때, Safari 브라우저가이를적절하게처리하지못하기때문에발생한다. Safari 브라우저등의아이폰애플리케이션은 CFF 포맷을처리하기위해 FreeType 라이브러리를사용한다. 해당라이브러리는소스코드가공개되어있기때문에인터넷을통해소스코드를쉽게확보할수있다. 해당소스코드를통해공격자는조금더수월하게취약점을연구할수있다. 공개된소스코드와아이폰에탑재된 CFF 처리로직의어셈블리코드를대조한결과, 아이폰의경우 2.3.5 이하버전의 FreeType 라이브러리를통해 CFF 포맷을파싱하는것으로확인되었다. <JailBreakMe 접속화면 > 사용자가슬라이드를밀어프로그램의실행을결정할경우, Javascript는사용자의아이폰버전을조회하여버전에맞는 PDF <FreeType 라이브러리다운로드 > 5
PDF에저장된 CFF 스트림은기본적으로 zlib 인코딩방식으로압축되어있기때문에, PDF 파일내에 CFF 포맷을식별하기위해압축을해제해야한다. 압축이정상적으로해제되면 CFF의스트림을식별할수있다. <CFF 구조확인 > 실제취약점을발생시키는데이터는 stream 영역에기록되어있다. PDF가실행되면 stack argument 는 FF를기준으로나누어져스택에입력되며, 뒤의 operator는지정된함수가실행되어순차적으로처리된다. <op 코드처리로직 > 사용자가 Safari 브라우저를통해 PDF파일을실행하면 CFF 포맷을처리하기위해 Load_Glyph() 함수가호출되며, Load_Glyph 함수는 CFF 포맷을파싱하기위해 cff_decoder_parse_charstrings 함수를호출한다. <CFF 처리함수호출부분 > <CFF Stream 확인 > 오퍼레이터값은순차적으로처리되며, 해당 op코드에해당하는로직이호출된다. 공개된소스코드에서 op코드를처리하는로직을확인하면다음과같다. cff_decoder_parse_charstrings 함수는 PDF 내에존재하는 CFF 포맷을파싱한후, 오퍼레이터에의해해당하는함수들이순차적으로실행되어결과값이스택에추가된다. 공개된 FreeType 라이브러리에서스택에데이터를추가하는부분의로직은다음과같다. 6
< 취약점발생부분상세분석 - 라이브러리 > 실제아이폰에접속하여디버거를통해해당로직을확인하면, 그어셈블리코드는아래와같다. < 취약점발생부분코드분석 - CFF 처리함수호출 > < 취약점발생부분상세분석 - 아이폰어셈블리 > 어셈블리코드나소스코드를통해알수있듯이, 해당로직은기본적으로 Stack Overflow에대한보호모듈이적용되어있다. 스택에예상보다많은값이입력될경우 R0 레지스터에 130을입력한후, 해당함수를종료한다. < 취약점발생부분코드분석 - 실행흐름변조부분 > Load_Glyph 함수가리턴되어공격자에게실행흐름이넘어가는순간의어셈블리코드는다음과같다. < 오버플로우로인한함수종료 > POP 명령에의해 STACK에저장된 Return Address가 PC 레지스터에입력되며, 실행흐름이 Load_Glyph 함수로돌아온다. 하지만 Overflow 발생시프로그램의실행이중단되지않고단순히함수가종료된후실행이계속되기때문에, 공격자는제한적으로스택을조작할수있다. < 실행흐름변조부분 > 리턴되는순간의스택프레임은다음과같다. <Return Address 변조코드 > 공격자는 CFF 포맷을조작함으로써 Load_Glyph 함수의 Return Address를조작할수있다. CFF를처리하는함수가 Overflow로인해종료되었지만이미 Load_Glyph 함수의 Return Address는조작되었고, 프로그램의실행흐름이지속되기때문에 Load_Glyph 함수가리턴되는순간공격자가의도한쉘코드가실행된다. < 실행흐름변조시스택프레임 > 해당스택프레임은공격자에의해구성된값이며, 이값은 CFF 스트림을통해입력된다. 스택에등록된값은 PDF 파일내의 CFF 스트림에서확인할수있다. 현재스택에들어있는내용은앞서설명했던 CFF 스트림의 Stack Argument 필드이다. 7
0x328c5c65 --> mmap <CFF 스트림내의 Stack Argument> POP 명령에의해스택에저장된값이 R4 ~ R7 레지스터에순차적으로들어가며, PC 레지스터에 0x30207bab 값이입력된다. PC 레지스터는프로그램이다음실행할주소를저장하기때문에, 프로그램의실행흐름이 0x30207bab 번지로변경된다. 처음실행되는쉘코드는 Stack Argument 영역에존재한다. 하지만해당영역의크기가작아, 탈옥프로그램을실행하는데필요한많은함수주소를포함할수없다. r0 0x9000000 // 할당메모리 // 영역주소 r1 0x109748 r2 0x3 r3 0x1012 <ROP - mmap 호출정보 > 이후 bcopy 함수를사용해두번째실행될 rop 코드를 mmap 함 수를통해할당한메모리에복사한다. 0x328c1e58 --> bcopy r0 0x76a569 // source r1 0x9100000 // dest r2 0x9744 <ROP - bcopy 호출정보 > 함수실행이완료되면생성한 0x9100000 메모리영역에쉘코드가복사된것을확인할수있다. < 복사된메모리영역데이터확인 > < 실행가능한 Stack Argument의 Size> 그래서첫번째쉘코드는시스템함수를호출하여 0x09000000 영역에메모리를할당하고, CFF 스트림아래쪽에존재하는또다른 ROP쉘코드를복사하는역할을수행한다. 두번째쉘코드는 CFF 스트림중오퍼레이터목록뒤쪽에서찾을수있다. 쉘코드는제일먼저 mmap 함수를사용해, 0x09000000 영역에메모리영역을할당한다. 8
< 메모리영역에복사된 CFF 스트림의 ROP 코드 > 두번째실행될쉘코드가메모리에성공적으로올라가면, 탈옥프로그램을실행하기위한본격적인 ROP 쉘코드실행이시작된다. Safari 브라우저는기본적으로 mobile 계정의권한으로동작하기때문에, 탈옥을하기위해루트권한을획득하는작업이선행되어야한다. 0x9100000에서시작되는두번째 ROP 쉘코드는커널취약점을통해루트권한을획득한후, 인스톨에필요한파일을설치한다. r0 0x9100640 // /System/Library/Frameworks/IOKit.framework/IOKit r1 0x0 0 r2 0x0 0 <ROP - 커널공격코드 > 이후문서화되지않은함수등 4개의함수가추가적으로실행된다. 실행함수 : 0x3147b6e1,mach_task_self,0x3147bdd1,0x3147b42d 아래와같은함수를통해 xml과관련된 CFData 레퍼런스를생성 하고처리한다. XML 내의 IOSurface 속성과관련된값에의해인 티저오버플로우가발생하게된다. 0x3356fc24 --> CFDataCreate < 사파리웹브라우저실행권한확인 > 2-1-2. IOSurface Integer Overflow Vulnerability - CVE- 2010-2973 r0 0x0 0 r1 0x9100684 152045188 r2 0x292 658 커널취약점을공격하기위해가장먼저 IOSurface 및 IOKit 라이 브러리를오픈한다. XML 정보 : <?xml version="1.0" encoding="utf- 8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD 0x328c4951 --> dlopen PLIST 1.0//EN" "http://www.apple.com/dtds/propertylist- 1.0.dtd"><plist r0 0x9100600 version="1.0"><dict><key>iosurfaceallocsize</k //System/Library/PrivateFrameworks/IOSurface.fra ey><integer>158536</integer><key>iosurfaceb mework/iosurface uffertilemode</key><false/><key>iosurfacebyte r1 0x0 0 sperelement</key><integer>4</integer><key>io r2 0x0 0 SurfaceBytesPerRow</key><integer>3050433824 </integer><key>iosurfaceheight</key><integer <ROP - 커널공격코드 > >3221270467</integer><key>IOSurfaceIsGlobal< /key><true/><key>iosurfacememoryregion</ke 0x328c4951 --> dlopen y><string>purplegfxmem</string><key>iosurfac epixelformat</key><integer>1095911234</integ 9
er><key>iosurfacewidth</key><integer>398383 3928</integer></dict></plist> <ROP - 커널공격코드 > 0x3357a329 --> CFPropertyListCreateFromXMLData r0 0x0 0 r1 0x873400 8860672 r2 0x0 0 <ROP - 커널공격코드 > 실제커널의권한상승과관련된함수들이순차적으로호출된다. 0x33517f1d --> IOSurfaceCreate 0x33517ef9 --> IOSurfaceLookup 0x33517dc9 --> IOSurfaceLock 0x33517d31 --> IOSurfaceGetBaseAddress 0x33517df1 --> IOSurfaceGetID 0x328c1e64 --> memmove 0x33517db1 --> IOSurfaceUnlock < 커널공격코드 - 목록 > 문서화되지않은함수 0x3147b28d 가호출된후, setuid(0) 함수가호출되어루트로권한상승이일어난다 mknod 함수가연속적으로 2번호출되어 /dev/mem 파일과 /dev/kmem 디바이스에대한접근이이루어진다. 0x32912de0 --> mknod r0 0x9100b7c, 0x9100b88 // /dev/mem, /dev/kmem r1 0x2180 r2 0x3000000, 0x3000001 <ROP - mknod 호출정보 > open 함수를통해 /dev/kmem 파일의핸들을얻는다. 0x328c8dcc --> open r0 0x9100b94 // /dev/kmem r1 0x2 r2 0x0 r3 0x0 <ROP - open 호출정보 > /dev/kmem 파일에코드를패칭한다. 0x328ebd54 --> pwrite 0x3291218c --> setuid r0 0x0 0 r1 0x0 0 r2 0x0 0 <ROP - setuid 호출정보 > 루트권한을획득한이후 PDF 내에저장된파일을추출하여 /tmp 디렉터리에 installui.dylib 파일을생성하기위한작업이수행된다. r0 0x7 r1 0x9100ba4 // µ\001 /tmp/installui.dylib" r2 0x4 4 r3 0xc011f914-1072563948 <ROP - pwrite 호출정보 > close함수와 CFRelease 함수가호출된후, 문서화되지않은 0x3147bea5 함수가호출된다. 이후 /tmp에설치될 dylib 파일의 핸들이생성된다. 10
0x328c8dcc --> open 0x328c4b91 --> dlsym r0 0x9100ba8 // /tmp/installui.dylib r1 0x201 513 r2 0x1a4 420 <ROP - open 호출정보 > 생성한파일의핸들에데이터가입력된다. 입력되는데이터는 PDF 내에위치해있다. 동적라이브러리파일인 /tmp/installui.dylib 파 일의생성이완료된다. 0x328e456c --> write r0 0x7 7 r1 0x9100bc0 152046528 r2 0x54d8 21720 <ROP - write 호출정보 > r0 0x4f05350 82858832 r1 0x9106098 // iui_go r2 0x0 0 <ROP 함수호출 - dlsym 호출정보 > 0x7461d5 --> iui_go r0 0x9109744 152082244 r1 0x91060a0 152068256 r2 0x36a4 13988 <ROP 함수호출 - iui_go 호출정보 > 이후탈옥애플리케이션인 Cydia 등을추가설치하기위한패키지 를다운로드하는등의아래와같은일련의함수들이실행된다. 파일의핸들이정상적으로종료되면, 해당파일을로드하기위한작업이수행된다. dlopen 함수가호출되어, 생성한파일의핸들을구성한다. 0x328c4951 --> dlopen r0 0x9100ba8 // /tmp/installui.dylib r1 0x1 1 r2 0x0 0 <ROP - dlopen 호출정보 > dlsym 함수를호출하여동적라이브러리파일의 iui_go 함수심볼을로드한후, 이를호출하여실행한다. <installui.dylib 파일의리스트 > 11
Dude_keepGoing 함수에의해 jailbreakme.com 사이트에서탈옥 패키지파일이포함된 wad.bin 파일을다운로드한다. <wad.bin 파일다운로드 > 파일이다운로드되면, 해당파일의정상유무를식별하기위해 Dude_connectionDidFinishLoading 함수를호출하여다운로드한파일을검사한다. wad.bin 파일을식별하기위해 0x42424242 (BBBB) 를식별자로사용하였으며, 함수에의해다운로드한파일의식별자가검사된다. < 압축해제후파일호출 > install.dylib 파일이정상적으로호출되면, do_install 함수가호출된다. < 다운로드파일식별 > < 다운로드파일식별자 > 파일에대한검사가완료되면 wad.bin 파일의압축을풀어, /tmp/install.dylib 파일로저장한다. <do_install 함수호출 > 이후 /etc/fstab 파일을열고, 내용을수정한다. <wad.bin 파일압축해제 > 압축이해제된동적라이브러리파일인 install.dylib 파일을호출한다. 해당파일은실질적으로탈옥과관련된설정및애플리케이션을설치하는파일이다. </etc/fstab 파일오픈 > 12
탈옥된아이폰에설치되는애플리케이션인 Cydia 인스톨러패키지를설치한다. </etc/fstab 파일패치 > fstab 파일에대한패치가끝나면커널메모리의디바이스파일인 /dev/kmem에접근하여, 코드및플래그를패치한다. <Cydia 패키지설치 > 설치가완료되면 uicache 명령어를통해 SpringBoard를재시작하여탈옥을완료한다. </dev/kmem 파일패치 > <SpringBoard 재시작 > </dev/kmem 파일패치 > 이후아래와같은특정디렉터리및파일을복사한다. < 특정디렉터리및파일복사 > 13
3. 하우리사전대응팀 하우리사전대응팀은취약점등최신보안위협의분석을통해해킹및악성코드로발전할수있는가능성을 연구하여사전에예방하는활동을수행합니다. 14