상세 컨텐츠

본문 제목

폭스콘이 OEM으로 생산하는 Android 휴대폰에서 “Pork Explosion” 취약점 발견!

국내외 보안동향

by 알약(Alyac) 2016. 10. 26. 10:05

본문

폭스콘이 OEM으로 하는 Android 휴대폰에서 “Pork Explosion” 취약점 발견!

 

최근 보안 연구원 JonSawyer는 폭스콘이 OEM으로 생산하는 몇몇 Android 스마트폰에서 백도어를 발견했습니다. 공격자는 해당 백도어를 이용하여 사용자의 안드로이드 휴대폰을 루팅할 수 있습니다. JonSawyer는 과거에 미국지방정부와 사법기관에 보안자문서비스를 진행한 경험이 있어, 이러한 발견이 적지않은 파장을 불러올 것으로 예상되고 있습니다.

 

폭스콘은 여러 제조사의 안드로이드 스마트폰을 OEM 방식으로 생산하고 있습니다. 뿐만 아니라 일부 기업은 폭스콘에 휴대폰 시스템 펌웨어 중 일부 하위레벨의 코드를 개발하도록 허용하고 있습니다.

 

Sawyer은 폭스콘이 OEM 방식으로 Android 스마트폰을 제작할 때, '고의'로 App 내 코드에 디버깅 기능을 남겨둔 점에 주목했습니다. 이후 특수한 앱의 도움을 받아 공격자가 해당 백도어를 이용하여 사용자의 휴대폰을 공격하도록 한 점을 발견하였다고 밝혔습니다.

 

그는 "해당 취약점은 폭스콘 기술자의 과실로 발생한 것으로 보인다. 해당 백도어가 고의로 남게 된 것인지 아니면 실수로 남게 된 것인지는 우선 논하지 않겠다. 그러나 이런 실수는 매우 위험한 것으로, 공격자가 해당 취약점을 성공적으로 악용할 경우, 안드로이드의 보안매커니즘인 SELinux를 우회하여 루팅 권한을 얻어 아무런 자격증명 없이 각종 데이터에 접근할 수 있다"고 말했습니다.


Pork Explosion으로 명명된 이번 취약점은 공격자와 포렌직 전문가 모두에게 매우 유용한 취약점입니다. 스마트폰에는 각종 보안 취약점이 존재하기 때문에 포렌직 전문가들은 이러한 점을 이용하여 목표 디바이스에서 각종 자료들을 성공적으로 채증할 수 있습니다. Sawyer는 해당 취약점이 공격자가 직접 root shell에 접근하는 것을 허용하며, 따라서 포렌직 전문가들 역시 해당 취약점을 이용하여 데이터를 채증하고 암호를 해독하는 등의 행위를 할 수 있다고 주장했습니다.

 

Sawyer는 폭스콘의 Infocus M810 와 Nextbit Robin 두 가지 휴대폰에서 해당 취약점을 발견했다고 밝혔습니다. 그는 올해 8월 Nextbit 회사 및 Google 안드로이드 보안팀에 연락을 취했으며, 해당 취약점에 대한 정보를 보안전문가들에게 전달하였다고 밝혔습니다. 이에 Nextbit은 해당 취약점을 패치 완료하였습니다. 그러나 Infocus는 아직까지 업데이트를 진행하지 않고 있습니다.

 


취약점 분석


공격자가 만약 목표 휴대폰을 획득했다면, USB를 이용하여 SELinux를 사용할 수 없도록 설정한 후 디바이스의 rootshell을 획득합니다. 이 밖에도 adb명령, fastboot 및 App의 부트스트랩을 이용하여 디바이스를 공격합니다. 


Nexbit Robin의 App 부트스트랩을 이용하여 분석한 결과, fastboot 명령이 주목을 받았습니다. 해당 명령은 해당 위치에 나오면 안되는 것이기 때문입니다.

 

LOAD:0F92F8DC fastboot_table                          ; CODE XREF:sub_F939888+174p

 

LOAD:0F92F8DC

 

LOAD:0F92F8DC var_C          = -0xC

 

LOAD:0F92F8DC

 

LOAD:0F92F8DC                STMFD           SP!, {R4,LR}

 

LOAD:0F92F8E0                MOV             R4, #0xF9B9C14

 

LOAD:0F92F8E8                SUB             SP, SP, #8

 

LOAD:0F92F8EC                MOV             R0, #0x2AE4

 

LOAD:0F92F8F0                MOV             R1, #0xF140

 

LOAD:0F92F8F4                LDR             R3, [R4]

 

LOAD:0F92F8F8                MOVT            R0, #0xF97

 

LOAD:0F92F8FC                MOVT            R1, #0xF92

 

LOAD:0F92F900                STR             R3,[SP,#0x10+var_C]

 

LOAD:0F92F904                BL              fastboot_register

 

LOAD:0F92F908                MOV             R0, #0x2AEC

 

LOAD:0F92F90C                MOV             R1, #0xDCB4

 

LOAD:0F92F910                MOVT            R0, #0xF97

 

LOAD:0F92F914                MOVT            R1, #0xF92

 

LOAD:0F92F918                BL              fastboot_register

 

LOAD:0F92F91C                MOV             R0, #0x2B00

 

LOAD:0F92F920                MOV             R1, #0xEB58

 

LOAD:0F92F924                MOVT            R0, #0xF97

 

LOAD:0F92F928                MOVT            R1, #0xF92

 

LOAD:0F92F92C                BL              fastboot_register

 

LOAD:0F92F930                MOV             R0, #0x2B10

 

LOAD:0F92F934                MOV             R1, #0xE3A0

 

LOAD:0F92F938                MOVT            R0, #0xF97

 

LOAD:0F92F93C                MOVT            R1, #0xF92

 

LOAD:0F92F940                BL              fastboot_register

 

LOAD:0F92F944                MOV             R0, #0x2B24

 

LOAD:0F92F948                MOV             R1, #0xE598

 

LOAD:0F92F94C                MOVT            R0, #0xF97

 

LOAD:0F92F950                MOVT            R1, #0xF92

 

LOAD:0F92F954                BL              fastboot_register

 

LOAD:0F92F958                MOV             R0, #0x2B34

 

LOAD:0F92F95C                MOV             R1, #0xE6C4

 

LOAD:0F92F960                MOVT            R0, #0xF97

 

LOAD:0F92F964                MOVT            R1, #0xF92

 

LOAD:0F92F968                BL              fastboot_register

 

LOAD:0F92F96C                MOV             R0, #0x2B44

 

LOAD:0F92F970                MOV             R1, #0xE7C8

 

LOAD:0F92F974                MOVT            R0, #0xF97

 

LOAD:0F92F978                MOVT            R1, #0xF92

 

LOAD:0F92F97C                BL              fastboot_register

 

LOAD:0F92F980                MOV             R0, #0x2B50

 

LOAD:0F92F984                MOV             R1, #0xE954

 

LOAD:0F92F988                MOVT            R0, #0xF97

 

LOAD:0F92F98C                MOVT            R1, #0xF92

 

LOAD:0F92F990                BL              fastboot_register

 

LOAD:0F92F994                MOV             R0, #0x2B60 ;reboot-recovery

 

LOAD:0F92F998                MOV             R1, #0xE500

 

LOAD:0F92F99C                MOVT            R0, #0xF97

 

LOAD:0F92F9A0                MOVT            R1, #0xF92

 

LOAD:0F92F9A4                BL              fastboot_register

 

LOAD:0F92F9A8                MOV             R0, #0x2B70 ;reboot-ftm

 

LOAD:0F92F9AC                MOV             R1, #0xE54C

 

LOAD:0F92F9B0                MOVT            R0, #0xF97

 

LOAD:0F92F9B4                MOVT            R1, #0xF92

 

LOAD:0F92F9B8                BL              fastboot_register

 

LOAD:0F92F9BC                MOV             R0, #0x2B7C

 

LOAD:0F92F9C0                MOV             R1, #0xEE1C

 

LOAD:0F92F9C4                MOVT            R0, #0xF97

 

LOAD:0F92F9C8                MOVT            R1, #0xF92

 

LOAD:0F92F9CC                BL              fastboot_register

 

LOAD:0F92F9D0                MOV             R0, #0x2B88

 

LOAD:0F92F9D4                MOV             R1, #0xF804

 

LOAD:0F92F9D8                MOVT            R0, #0xF97

 

LOAD:0F92F9DC                MOVT            R1, #0xF92

 

LOAD:0F92F9E0                BL              fastboot_register

 

LOAD:0F92F9E4                MOV             R0, #0x2B98

 

LOAD:0F92F9E8                MOV             R1, #0xF518

 

LOAD:0F92F9EC                MOVT            R0, #0xF97

 

LOAD:0F92F9F0                MOVT            R1, #0xF92

 

LOAD:0F92F9F4                BL              fastboot_register

 

LOAD:0F92F9F8                MOV             R0, #0x2BA0

 

LOAD:0F92F9FC                MOV             R1, #0xEFE0

 

LOAD:0F92FA00                MOVT            R0, #0xF97

 

LOAD:0F92FA04                MOVT            R1, #0xF92

 

LOAD:0F92FA08                BL              fastboot_register

 

LOAD:0F92FA0C                LDR             R2, [SP,#0x10+var_C]

 

LOAD:0F92FA10                LDR             R3, [R4]

 

LOAD:0F92FA14                CMP             R2, R3

 

LOAD:0F92FA18                BNE             loc_F92FA38

 

LOAD:0F92FA1C                MOV             R0, #0x2BA8

 

LOAD:0F92FA20                MOV             R1, #0xF0D0

 

LOAD:0F92FA24                MOVT            R0, #0xF97

 

LOAD:0F92FA28                MOVT            R1, #0xF92

 

LOAD:0F92FA2C                ADD             SP, SP, #8

 

LOAD:0F92FA30                 LDMFD           SP!, {R4,LR}

 

LOAD:0F92FA34                B               fastboot_register

 

위 코드에서 볼 수 있듯이, 휴대폰에는 일반 명령과 OEM 명령 두 종류의 fastboot명령이 존재합니다. 일반 명령은 "command:parameters”의 형식으로 USB를 통하여 전송됩니다. 예를들어 “getvar all”명령은 “getvar:all”형식으로 발송됩니다. 그리고 “reboot”명령은 직접 “reboot”형식으로 발송됩니다. 


여기서 주의해야 할 것은, 이러한 일반 명령어는 fastboot클라이언트 중에 하드코딩 되어 있다는 것입니다. 그러나 OEM 명령은 제조사 표준명령형식에 따라 실행되지 않습니다. OEM명령은 “oem command parameters”형식으로 발송됩니다. 예를들어 “oem writeimei 1234567899876543”입니다.

 

위에 나열한 명령 중, 문제가 있는 명령은 “reboot-ftm"입니다. 해당 명령어는 일반 명령어에 속하지 않을 뿐만 아니라 OEM 명령어에도 속하지 않습니다. 실제로 해당 명령어는 모바일 디바이스에서 제공하는 것으로, fastboot중에서는 해당 명령어를 실행할 수 없습니다. 


해당 명령어를 실행하기 위해 전문가들은 임의의 클라이언트를 생성했습니다. 이후 임의의 클라이언트와 디바이스를 연결한 후에 디바이스 bootloader에 “7265626F6F742D66746D(reboot-ftm)”데이터를 전송하였습니다. 코드는 다음과 같습니다.

 

Jons-Mac-Pro:nextbit jcase$ adb shell

 

root@ether:/ # id

 

uid=0(root) gid=0(root)groups=0(root),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats)

 

root@ether:/ # getenforce                                                    

 

Disabled

 

root@ether:/ # grep finger /system/build.prop                                 

 

# Do not try to parse description, fingerprint, orthumbprint

 

ro.build.fingerprint=Nextbit/ether/ether:6.0.1/MMB29M/00WW_1_350:user/release-keys


타겟 디바이스에 해당 명령어를 발송한 후, 휴대폰은 자동으로 "공장테스트모드"로 부팅됩니다. 해당 모드에서는 eMMC브랜드, MAC주소, IMEI번호 등 휴대폰의 소프트웨어와 하드웨어의 상세한 정보들을 확인할 수 있습니다. 만약 adb명령어를 이용하여 휴대폰에 접속한다면, "adb reboot ftm"명령을 이용하여 공장테스트모드에 접속할 수 있게 됩니다.

 

공장테스트모드에서는 adb프로세스가 root권한으로 동작하며, 어떠한 자격증명도 없이 adb를 통하여 디바이스의 shell권한을 획득할 수 있습니다. 주의해야할 점은 이 때 디바이스의 SELinux는 중지된 상태라는 것입니다. 보안 연구원은 해당 취약점을 찾기 위해 "ftmboot"와 "ftmdata" 두 영역을 먼저 찾는 것을 제안했습니다.

 





 

참고 :

http://www.theregister.co.uk/2016/10/14/pork_explosion_foxconn_flaw

http://bbqand0days.com/Pork-Explosion-Unleashed/

관련글 더보기

댓글 영역