
AppEnumGuard は、CVE-2025-31207 として追跡されているインストール済みアプリケーション列挙のサイドチャネルに対する防御用ツイークです。iOS 15.0〜18.4.1 の従来の rootless および rootHide 脱獄環境に対応しています。 このリポジトリには、脆弱な結果を実証し、緩和策を検証する通常のサンドボックス化された iOS テストアプリケーションも含まれています。
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 ツイークとサンドボックス化されたテスターは、テスターのインジェクションを無効にした状態で iOS 17.3.1 ビルド 21D61 で一緒に検証されました。テスターはツイークを削除した状態でリークを検出し、ツイークをインストールした後に緑色の合格を返しました。
公開されたプリミティブは、プライベートな SpringBoardServices 関数 SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions を呼び出します。脆弱なシステムでは、インストール済みアプリケーションと存在しないアプリケーションで異なるエラーを返します:
9: ターゲットは存在するが、ポリシーにより起動が拒否される7: ターゲットが存在しないAppEnumGuard 1.1 は SpringBoard にのみインジェクションし、一般的な FBSystemService 信頼検証メソッドをフックします。不正な起動リクエストが FBSOpenApplicationErrorDomain セキュリティポリシーエラー 3 を返す場合、ツイークはそれをアプリケーション未検出エラー 4 に変更します。外側の SpringBoardServices API は、インストール済みと存在しないターゲットの両方に対して 7 を返します。
プライベートメソッドの引数数と Objective-C タイプエンコーディングは、フックがインストールされる前に検証されます。Apple が ABI を変更した場合、AppEnumGuard は未知の SpringBoard メソッドをフックする代わりにフェイルオープンします。
バージョン 1.0 は、すべての UIKit アプリケーション内で SpringBoardServices をフックしていました。機能しましたが、保護されるすべてのアプリへのインジェクションが必要でした。インジェクションを無効化または検出するアプリは、緩和策をバイパスできました。バージョン 1.1 では強制を SpringBoard に移し、単一の中央フックが AppEnumGuard をプロセスにインジェクションせずに呼び出し元を保護します。
リリース 1.2 は、いずれかのブートストラップ用にビルドできます:
AppEnumGuard_1.2_rootless_iphoneos-arm64.deb — 従来の rootless ツイークAppEnumGuard_1.2_roothide_iphoneos-arm64e.deb — rootHide ツイークAppEnumGuardTester_1.2_sandboxed.ipa — アイコン付きサンドボックス化検証アプリ.deb をインストールし、リースプリングします。選択したターゲットがインストールされている場合の期待される結果:
| 状態 | ターゲット | 存在しない | テスター結果 | |---|---|---|---:|---:|---| | ツイークなし | 9 | 7 | 赤 / FAIL | | ツイーク有効 | 7 | 7 | 緑 / PASS |
テスターは、選択したアプリが検出できない場合に緑を報告し、検出できる場合に赤を報告します。インストールされていることがわかっているアプリのみを選択してください。7 / 7 だけでは、機能する緩和策と存在しないターゲットを区別できません。
デバイステストでは、テスターのインジェクションを無効にして両方の状態を再現しました。ツイークをアンインストールすると赤の 9 / 7 結果が生成され、v1.1 をインストールすると緑の 7 / 7 結果が生成されました。
標準の 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
テスターは Xcode の iPhoneOS SDK でコンパイルされ、脱獄や昇格された権限はありません:
./scripts/build-tester-ipa.sh
結果の IPA は dist/ に配置されます。アドホック署名されているため、インストーラーは通常の開発 ID で再署名できます。テストは通常のアプリケーションサンドボックスから実行することを意図しているため、platform-application や com.apple.private.security.no-sandbox を付与しないでください。
7 / 7 テストは、ターゲットアプリケーションがインストールされていることがわかっている場合にのみ意味があります。MIT