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 までの iOS を実行している64ビット iOS デバイス
このプロジェクトについて
- このプロジェクトは脱獄ではなく、また脱獄に貢献するものでもありません。ユーザーランドでのみ動作します。
- このプロジェクトは、ルートファイルシステムへの書き込み能力を得ることはできませんし、今後も得ることはありません。カーネルによって読み取り専用としてマウントされているためです。
- このプロジェクトは、Cydia Substrate のように動的ライブラリの形で任意のコード実行を容易に許可するものではありません。
- このプロジェクトの主な目標は、サンドボックス化されたコンテナアプリをシステム権限に昇格させることです。
- AMFI はすべてのバイナリが有効に署名されていることを強制しており、このプロジェクトは AMFI にパッチを当てることはできません。
- このプロジェクトは、ユーザーデータパーティション(/var/root、/var/mobile)への読み取りおよび書き込み権限を取得することを目指しています。
- このプロジェクトは、資格情報の復元やフォレンジック目的のために、保護されたキーチェーンストレージへのアクセスを取得することを目指しています。
- このプロジェクトはまた、root としてコードを実行したりファイル転送を行うためのサーバー機能を提供することを目指しています。
- このプロジェクトは、開発者や研究者が貢献するための助けとなることを意図していました。
- このプロジェクトにより、脱獄開発者やセキュリティ研究者は、特権コンテキスト内からのみアクセス可能なカーネルドライバのバグや、ファジング技術を使ったユーザーランドのバグをより簡単に見つけられるようになります。
- このプロジェクトにより、脱獄ツイーク開発者は、新しい iOS 11 の機能を調査し、実機でのツイーク開発をデバッグすることが容易になります。
- このプロジェクトは主に iOS 10 から 11.2.5 までを対象としていますが、理論上は、エクスプロイトが開発されれば 11.2.5 から 11.3 までを含むサポートも可能です。
スクリーンショット
アプリの使い方
- このアプリはプロジェクトに価値を追加するものではなく、それを求める人々への視覚的なものとして機能します(コミュニティから多くの盛り上がった人々がこれを求めました)
- このアプリは、メモリ、mach-o 情報、そのベースアドレスなど、ライブラリやフレームワークからの情報をダンプします。これは ROP 開発に役立ちます。
- アプリ内のロジックは、多くのパースとプリントがあるため、完了までに最大15分かかることがあります。これは最終リリースではそうではありません。
- このアプリはあなたのiPhoneに価値を追加したり、ソフトウェアの動作を変更したりするものではありません。一部のデーモンがクラッシュする可能性がありますが、システムに永続的な損傷はありません。
- 研究者は代わりに Xcode でこのプロジェクトを実行することをお勧めします。
トラブルシューティング(必要ありませんが、念のため)
- アプリを削除
- Bluetoothをオフにする
- 再起動
- Bluetoothをオンにする
- Bluetoothをオフにする
特徴
- FTP アクセス(現在はサンドボックス化、将来的には非サンドボックス化)
- ビジュアル PoC
- zerodium による PoC(ようやくわずかに改善され、system() 関数を呼び出せる)
- Abraham による PoC。root として任意のコードを実行できるはずで、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 を実行する。これは launchd のラッパーとして使用でき、タスク特権とコードインジェクションを処理するデーモンです。
- BaseBoard ロジックを使用して、ASLR 無効で launchd 上のタスクポートを取得する
調査すべきこと
- AMFI パッチ(簡単ではない。amfi 上のセッションは取得できないが、他のデーモンを使って昇格できるかもしれない)
- エンタイトルメントインジェクション(あまり必要ではない。多くのデーモンを制御しているため、これは不要)
- プライベート API を使用してさらに昇格する(BaseBoard.framework は ASLR 無効でシステム権限を持ったプロセスを起動できる?)
- liblorgnette を復活させ iOS に移植する (完了)
ipa のダウンロード
https://github.com/MTJailed/UnjailMe/releases/tag/0.1
クレジット
- securityd ゼロデイを提供した Abraham (@cheesecakeufo)
- 脆弱性と初期 PoC: Rani Idan (Zimperium) <3
- PureFTPd
- liblorgnette プロジェクト(私自身の軽微な改良を含む)
- @ringarang による NEWUI
寄付または貢献
- Twitter の DM (@MTJailed) でリクエストすればソースコードを提供できます
- 寄付をお願いします。このようなプロジェクトに取り組む時間と手段がほとんどありません!(http://paypal.me/devsupport)
- まもなくソースコード(ftp を除く)が GitHub で公開されます。