
AppEnumGuard v1.2
CVE-2025-31207の緩和策と、iOS 15〜18.4.1のrootlessおよびrootHide脱獄向けサンドボックス化テスター。
AppEnumGuard
AppEnumGuardは、CVE-2025-31207として追跡されているインストール済みアプリケーション列挙のサイドチャネルに対する防御用のtweakです。iOS 15.0〜18.4.1において、従来型のrootlessおよびrootHideジェイルブレイク環境をサポートします。 このリポジトリには、脆弱な結果を実証し、緩和策を検証する、通常のサンドボックス化されたiOSテストアプリケーションも含まれています。
CVE-2025-31207
CVE-2025-31207は、AppleのFrontBoardアプリケーション起動ロジックにおける情報漏えいの脆弱性です。サンドボックス化されたアプリケーションは、プライベートなSpringBoardServicesの起動関数を通じて任意のバンドル識別子を送信し、異なる戻りコードを用いてインストール済みアプリケーションと存在しないアプリケーションを区別できます。これにより、バンキング、メッセージング、セキュリティ、サイドローディング、ジェイルブレイク関連のアプリを含む、ユーザーがインストールしたアプリケーションに関するプライベート情報が明らかになる可能性があります。
Appleはこの問題を、アプリケーションがインストール済みアプリを列挙できるようにするロジックの問題と説明しています。AppleはiOSおよびiPadOS 18.5において改善されたチェックによりこれを修正しました。その結果、iOS 18.5より前のシステムはOSレベルで影響を受けたままです。
互換性
| コンポーネント | サポート対象 |
|---|---|
| iOS | 15.0〜18.4.1 |
| ジェイルブレイク | 従来型のrootlessまたはrootHideジェイルブレイク環境 |
| ブートストラップ/パッケージアーキテクチャ | rootless / iphoneos-arm64、rootHide / iphoneos-arm64e |
| デバイスアーキテクチャ | arm64およびarm64e(rootless)、arm64e(rootHide) |
| パッケージ | デバイスのブートストラップに一致するパッケージをインストール |
デフォルトのビルドは従来型のrootless Theosを使用し、arm64およびarm64eスライスを含みます。rootHide版はrootHide Theosでビルドされ、必要なrootHideの.jbrootローダーパスを含みます。両方のパッケージはfirmware (>= 15.0)およびfirmware (<< 18.5)を宣言しています。AppleがCVE-2025-31207を修正したiOS 18.5以降では、この緩和策は不要です。
SpringBoard側のv1.1 tweakとサンドボックス化されたテスターは、テスターへのインジェクションを無効にした状態で、iOS 17.3.1ビルド21D61上で一緒に検証されました。テスターはtweakを削除した状態でリークを検出し、tweakをインストールした後は緑の合格を返しました。
仕組み
公開されているプリミティブは、プライベートなSpringBoardServices関数SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptionsを呼び出します。脆弱なシステムでは、インストール済みアプリケーションと存在しないアプリケーションに対して異なるエラーを返します。
9: ターゲットは存在するが、起動はポリシーにより拒否される7: ターゲットが存在しない
AppEnumGuard 1.1はSpringBoardにのみインジェクションし、共通のFBSystemService信頼検証メソッドをフックします。不正な起動リクエストがFBSOpenApplicationErrorDomainのセキュリティポリシーエラー3を返す場合、tweakはそれをアプリケーション未検出エラー4に変更します。その後、外側のSpringBoardServices APIは、インストール済みと存在しないターゲットの両方に対して7を返します。
プライベートメソッドの引数数とObjective-Cの型エンコーディングは、フックをインストールする前に検証されます。AppleがABIを変更した場合、AppEnumGuardは未知のSpringBoardメソッドをフックするのではなく、フェイルオープンします。
1.0からの変更点
バージョン1.0は、すべてのUIKitアプリケーション内でSpringBoardServicesをフックしていました。これは動作しましたが、保護対象のすべてのアプリへのインジェクションが必要でした。インジェクションを無効化または検出したアプリは、緩和策をバイパスできました。バージョン1.1は強制をSpringBoardに移行したため、単一の中央フックが、AppEnumGuardを呼び出し元のプロセスにインジェクションすることなく保護します。
リリースのダウンロード
リリース1.2は、どちらのブートストラップ向けにもビルドできます。
AppEnumGuard_1.2_rootless_iphoneos-arm64.deb— 従来型のrootless tweakAppEnumGuard_1.2_roothide_iphoneos-arm64e.deb— rootHide tweakAppEnumGuardTester_1.2_sandboxed.ipa— アイコン付きのサンドボックス化された検証アプリ
インストールと検証
- rootless または rootHide ブートストラップに対応する
.debをインストールし、リスプリングします。 - 通常の開発者/サイドロード署名を使用してテスター IPA をインストールします。
- AppEnum Test では AppEnumGuard のインジェクションを無効のままにします。v1.1 は SpringBoard からこれを保護します。
- インストール済みと分かっているアプリのアイコンをタップします。プリセットは WhatsApp、YouTube、Spotify、Dopamine、TrollStore、Reddit で利用できます。
選択したターゲットがインストールされた状態での期待される結果:
| 状態 | ターゲット | 欠落 | テスター結果 |
|---|---|---|---|
| Tweak 未導入 | 9 | 7 | 赤 / FAIL |
| Tweak 有効 | 7 | 7 | 緑 / PASS |
テスターは既知の脆弱な 9 / 7 結果に対してのみ赤を報告し、それ以外のすべての数値結果に対しては緑を報告します。赤の結果は AppEnumGuard がインストールされていないことを示します。
緑の結果には App not detected と表示されます。脆弱な 9 / 7 結果には App detected および AppEnumGuard missing と表示されます。
インストール済みと分かっているアプリのみを選択してください。7 / 7 だけでは、機能している緩和策と存在しないターゲットを区別できません。
テスターには短いプロジェクト説明と、この GitHub リポジトリへのクリック可能なリンクも含まれています。
デバイステストでは、テスターのインジェクションを無効にした状態で両方の状態が再現されました。Tweak をアンインストールすると赤の 9 / 7 結果が得られ、v1.1 をインストールすると緑の 7 / 7 結果が得られました。
Tweak をビルドする
標準の Theos では、デフォルトのビルドは従来の rootless です:
cd Tweak
make clean package FINALPACKAGE=1
rootHide の場合は、rootHide Theos をインストールして次を実行します:
cd Tweak
THEOS=/path/to/theos-roothide \
make clean package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=roothide
テスターIPAのビルド
テスターはXcodeのiPhoneOS SDKでコンパイルされ、脱獄や昇格された エンタイトルメントはありません:
./scripts/build-tester-ipa.sh
生成された IPA は dist/ に配置されます。これはアドホック署名されているため、インストーラが通常の開発用 ID で再署名できます。テストは通常のアプリケーションサンドボックスから実行することを目的としているため、platform-application や com.apple.private.security.no-sandbox を付与しないでください。
スコープと制限事項
- これは公開されている SpringBoardServices プリミティブに対するユーザー空間の緩和策であり、Apple の完全な FrontBoard パッチではありません。
- バージョン 1.1 では、保護されたアプリケーションへのインジェクションは不要です。インジェクションをグローバルに、または SpringBoard 自体に対して無効にすると、緩和策も無効になります。
- サーバー側の実装は iOS 17.3.1 ビルド 21D61 で確認されています。その他のサポート対象バージョンでは、プライベートセレクタがランタイムで検証された期待どおりの ABI を持つ場合にのみ、tweak はフックをインストールします。
7 / 7のテストは、対象アプリケーションがインストールされていることが判明している場合にのみ意味を持ちます。- テスターは意図的に文書化されていないプライベート API を呼び出すため、App Store への提出には適していません。
参考文献
ライセンス
MIT