UnjailMe
다음에 기반한 샌드박스 탈출 도구:
- Rani Idan(Zimperium)의 개념 증명(CVE-2018-4087)
- @cheesecakeufo의 securityd 오버플로 개념 증명(제로데이, 알려진 CVE 없음, Abraham에게 감사드립니다!)
ZIMPERIUM PoC에 대하여
Rani는 Jonathan Levine의 sbtool을 사용하여 샌드박스 내에서 통신에 접근 가능한 서비스가 무엇인지 알아냈습니다.
그런 다음 그는 bluetoothd를 더 찾아내고 해당 서비스로부터/로의 메시지를 가로채는 코드를 설정했습니다.
이를 통해 그는 많은 데몬의 세션을 하이재킹하고 클라이언트 포트를 유출할 수 있다는 것을 알아냈습니다.
이 방법으로 bluetoothd에 대한 클라이언트 연결에 추가 데이터가 포함된 콜백을 추가할 수 있음을 발견했습니다.
그 결과, 클라이언트 포트(세션)가 가로채지는 시스템 데몬의 프로세스 카운터(콜백)와 레지스터 x3(추가 데이터)에 대한 제어권을 얻을 수 있습니다.
이를 통해 샌드박스 앱이 특권 컨텍스트로 탈출하여 시스템 권한으로 코드를 실행할 수 있는 가능성을 제공합니다.
Apple은 iOS 11.2.5에서 세션 ID에 arc4random()을 사용하여 취약점을 패치했습니다.
더 이상 클라이언트 포트를 얻을 수 없는 것처럼 보이지만 세션 가로채기는 여전히 가능합니다.
이 새로운 패치에서는 arc4random()을 무차별 대입하는 데 약 5일이 걸리며(4.294.967.296가지 가능성), 따라서 이것이 보안 문제에 대한 수정으로 간주되지 않기 때문에 최종 패치를 기대하고 있습니다.
출처: Zimperium 블로그
Abraham Masri의 PoC에 대하여
제가 알기로 이것은 securityd와의 통신에서 발생하는 버퍼 오버플로입니다.
이는 잘못된 길이의 XPC 메시지(딕셔너리 기반 값-키 메시지)를 제공함으로써 수행됩니다.
서비스가 메시지를 수신하고 언더플로가 발생합니다.
Abraham은 많은 프로세서 레지스터를 제어할 수 있는 방법을 찾은 것으로 보이며, 이는 시스템 내에서 실행되는 앱이 시스템 권한으로 코드를 실행할 수 있게 합니다.
Abraham의 PoC는 Abraham이 이 취약점에 대한 익스플로잇을 직접 만들려고 시도하고 있음을 보여줍니다. 베이스 주소를 유출하는 코드가 존재하는데, 이는 ROP 체인 생성의 시작으로 알려져 있습니다.
Abraham이 직접 이 익스플로잇을 작성할 계획인지, 아니면 우리에게 올바른 방향을 제시하는 것인지는 알 수 없습니다.
요구 사항
- iOS 10~11.3.1을 실행하는 64비트 iOS 장치
이 프로젝트에 대하여
- 이 프로젝트는 탈옥이 아니며, 탈옥에 기여하지도 않습니다. 이 프로젝트는 사용자 영역에서만 동작하기 때문입니다.
- 이 프로젝트는 루트 파일 시스템에 쓰기 권한을 얻을 수 없으며 앞으로도 얻지 못할 것입니다. 커널에 의해 읽기 전용으로 마운트되어 있기 때문입니다.
- 이 프로젝트는 Cydia Substrate와 같은 동적 라이브러리 형태의 임의 코드 실행을 쉽게 허용하지 않습니다.
- 이 프로젝트의 주요 목표는 샌드박스 컨테이너 앱을 시스템 권한으로 승격시키는 것입니다.
- AMFI는 모든 바이너리가 유효하게 서명되어 있어야 하며, 이 프로젝트는 AMFI를 패치할 수 없습니다.
- 이 프로젝트는 사용자 데이터 파티션(/var/root, /var/mobile)에 대한 읽기 및 쓰기 권한을 얻는 것을 목표로 합니다.
- 이 프로젝트는 자격 증명 복구 및 포렌식 목적으로 보호된 키체인 저장소에 접근하는 것을 목표로 합니다.
- 또한 이 프로젝트는 루트 권한으로 코드를 실행하고 파일 전송을 위한 서버 기능을 제공하는 것을 목표로 합니다.
- 이 프로젝트는 개발자와 연구자들이 기여할 수 있도록 도움을 주기 위해 만들어졌습니다.
- 이 프로젝트는 탈옥 개발자와 보안 연구원들이 퍼징 기술을 사용하여 특권 컨텍스트 내에서만 접근 가능한 커널 드라이버의 버그나 사용자 영역 버그를 더 쉽게 찾을 수 있게 해줄 것입니다.
- 이 프로젝트는 탈옥 트윅 개발자들이 새로운 iOS 11 기능을 연구하고 실제 기기에서 트윅 개발을 디버깅하는 것을 더 쉽게 해줄 것입니다.
- 이 프로젝트는 주로 iOS 10
11.2.5에서 작동하는 데 초점을 맞추고 있지만, 이론적으로 익스플로잇이 개발되면 11.2.511.3.1까지도 지원할 수 있습니다.
스크린샷
앱 사용 방법
- 이 앱은 프로젝트에 어떤 가치도 더하지 않지만, 요청하는 사람들을 위한 시각적 자료 역할을 합니다(커뮤니티의 많은 과대광고된 사람들이 요청했습니다).
- 이 앱은 라이브러리와 프레임워크에서 메모리, mach-o 정보, 그리고 ROP 개발에 유용한 기본 주소를 포함한 정보를 덤프합니다.
- 많은 파싱과 출력으로 인해 앱의 로직이 완료되는 데 최대 15분이 소요될 수 있으며, 이는 최종 릴리스에서는 그렇지 않을 것입니다.
- 이 앱은 iPhone에 어떤 가치도 더하지 않으며 소프트웨어의 동작을 변경하지 않습니다. 일부 데몬이 충돌할 수 있지만 시스템에 영구적인 손상은 없습니다.
- 연구자들은 대신 Xcode에서 이 프로젝트를 실행하는 것이 좋습니다.
문제 해결 (필요 없지만, 만일을 대비하여)
- 앱 삭제
- 블루투스 끄기
- 재부팅
- 블루투스 켜기
- 블루투스 끄기
기능
- FTP 접근 (현재는 샌드박스, 향후 샌드박스 해제)
- 시각적 PoC
- zerodium의 PoC (드디어 약간 개선, system() 함수 호출 가능)
- Abraham의 PoC, 루트로 임의 코드 실행 가능, ssh에 적합.
- Sem Voigtlander의 PoC (커널 주소 공간 할당 DoS, 장치 재부팅 기능).
계획
- 다른 데몬의 주소 공간을 완전히 제어하는 것을 포함한 전체 익스플로잇.
- 원격 SSH 셸 접근 (dropbear 또는 파생물).
고려할 미래 사항
- SpringBoardd 코드 주입 (안녕하세요 탈옥 애호가 여러분)
launchd (세션을 얻을 수 없으므로 불가능).
가설 (단순 추측)
- launchd 자격을 가진 데몬 찾기 / 자격 주입.
BaseBoard 프레임워크를 로드하는 코드 주입
- dyld_shared_cache에 있는 라이브러리의 주소 유출.
- dyld_shared_cache에 있는 모든 라이브러리에서 ROP 가젯 찾기.
- 콜백 및 콜백 추가 데이터를 설정하여 ROP 체인 호출.
- BaseBoard의 역공학 로직을 사용하여 launchd가 ASLR을 비활성화하고 인수와 함께 amfid를 실행하도록 만듦.
- amfid 패치
- BaseBoard의 역공학 로직을 사용하여 afcd가 /에 대한 인수와 ASLR 비활성화로 실행되도록 만듦 (afc2와 유사).
- BaseBoard의 역공학 로직을 사용하여 unjaild를 실행. unjaild는 launchd를 감싸는 래퍼 역할을 하며 작업 권한 및 코드 주입을 처리하는 데몬.
- BaseBoard 로직을 사용하여 ASLR이 비활성화된 launchd에 대한 task port 획득
검토할 사항
- AMFI 패치 (쉽지 않음, amfi를 통해 세션을 얻을 수 없지만 다른 데몬을 사용하여 권한 상승 가능).
- 자격 주입 (꼭 필요하지는 않음, 너무 많은 데몬을 제어할 수 있어 필요 없음).
- 비공개 API를 사용하여 추가 권한 상승 (BaseBoard.framework는 시스템 권한으로 ASLR을 비활성화하고 프로세스를 실행할 수 있음)???
- liblorgnette을 iOS로 부활 및 포팅 (완료)
Download ipa
https://github.com/MTJailed/UnjailMe/releases/tag/0.1
크레딧
- Abraham (@cheesecakeufo) - 그의 securityd 제로데이
- 취약점 및 초기 PoC: Rani Idan (Zimperium) <3
- PureFTPd
- liblorgnette 프로젝트 (약간의 개선 포함)
- @ringarang의 NEWUI
기부 또는 기여
- 소스 코드는 트위터 DM(@MTJailed)으로 요청하면 제공됩니다.
- 기부해 주세요. 이런 프로젝트를 진행할 시간과 수단이 매우 부족합니다! (http://paypal.me/devsupport)
- 곧 소스 코드(ftp 제외)가 GitHub에 공개될 예정입니다.