
iOS 27 kernelcache RE: SEPディスパッチマップ、AMFI差分、Ghidraワークフロー
iOS AMFI 開発者モード有効化のための Linux ネイティブクロスコンパイラ + PoC (arm64/arm64e)
研究グレードのツールキット。 iOS 27.0.1 と 27.2 のファームウェアを差分解析し、AMFI の
IOUserClientディスパッチテーブルをリバースエンジニアリングし、Linux からベアメタルの IOKit PoC をクロスコンパイルし(Xcode 不要)、標準の Apple lockdown プロトコル経由で iOS 27.0.1 の開発者モードを有効化します(カーネルレベルでの永続性を検証済み)。現在の主要な発見: ImageIO におけるサイレントな ASTC/DDS オーバーフロー対策。汎用デコードパスから構造的に到達可能で、MediaAnalysis チェーンはASTCReadPlugin::initializeにまで追跡済み(セッション 28〜31)。
IOExternalMethodDispatch スロットをマッピングし、selector 11 = armSecurityBootMode を特定。poc/poc.c は AppleMobileFileIntegrity/AppleCredentialManager を開き、armSecurityBootMode を呼び出して結果をログ出力します。Foundation/UIKit の肥大化なし — 純粋な C + IOKit。poc/build_ipa.sh は CachyOS/Arch 上で clang + ld64.lld + ldid を使って署名済み .ipa を生成します。Apple/Xcode への依存はゼロ。iOS の開発者モード切り替えチェーンは、標準の Apple lockdown プロトコル(com.apple.amfi.lockdown)を介して完全に操作できます。脱獄も IPA も entitlements の偽造も不要 — Linux 上の pymobiledevice3 だけで済みます。
検証済み: 以下のチェーン実行後、mounter query-developer-mode-status → true となり、DeveloperDiskImage が /System/Developer にマウントされ、両方とも独立した再起動を経ても維持されました(以前は同じチェックが false に戻っていたため、永続性こそが真の証明です。FINDINGS_LOCK.md を参照)。
パスコードを削除してください(設定 → Face ID とパスコード → パスコードをオフにする)。
パスコードが設定されている場合、AMFI は action=1/action=2 に対して Device has a passcode set を返します。
# 1) enable → action=1 → REBOOT #1
flatpak-spawn --host python3 -m pymobiledevice3 amfi enable-developer-mode
# 2) after the device boots: post-restart accept → action=2 → REBOOT #2
# (the CLI has no separate accept command — call the service method directly,
# e.g. via poc/verify_now2.py)
# 3) reveal the Settings toggle → action=0
flatpak-spawn --host python3 -m pymobiledevice3 amfi reveal-developer-mode
flatpak-spawn --host python3 -m pymobiledevice3 mounter query-developer-mode-status # → true
flatpak-spawn --host python3 -m pymobiledevice3 mounter list # → IsMounted: true, /System/Developer
flatpak-spawn --host python3 -m pymobiledevice3 mounter auto-mount # → DeveloperDiskImage mounted successfully
| アクション | 意味 | 効果 |
|---|---|---|
0 | reveal | 設定に開発者モードのトグルを表示する |
1 | enable | フラグを設定し、デバイスを再起動する |
2 | accept | 再起動後の確認、さらに再起動する |
⚠️
pymobiledevice3はショートサーキットする:ステータスがすでにtrueの場合、enable-developer-modeは "Developer mode is already enabled" とログに出力するだけで、何も送信しない。 2回の再起動はAppleプロトコルの一部であり、偶発的なものではない。
sudo pacman -S clang lld zip # compiler + Mach-O linker
yay -S ldid # entitlement injector (AUR)
# iOS SDK:
mkdir -p poc/SDK
git clone https://github.com/theos/sdks poc/tmp && mv poc/tmp/iPhoneOS*.sdk poc/SDK/iPhoneOS.sdk
cd poc
IOS_SDK=/path/to/iPhoneOS.sdk ./build_ipa.sh
# Output: EnableAMFIDevMode.ipa
# Via ideviceinstaller (libimobiledevice):
ideviceinstaller --install EnableAMFIDevMode.ipa
# Via TrollStore (if jailbroken/CT-bypass device):
# → TrollStore app → "+" → pick EnableAMFIDevMode.ipa
# Via SideStore/AltStore:
# → Add to SideStore → sign with your Apple ID
# On device (SSH / NewTerm):
./EnableAMFIDevMode 1
cat /tmp/amfi_devmode_poc.log
# Then REBOOT to activate Developer Mode
run_dvt.sh)2つ目の IPA 不要 な経路が存在します: Linux 上でスタンドアロンの IOKit バイナリをクロスコンパイルし、
iOS 17+ の CoreDevice / RSD トンネル 経由でデバイスにプッシュし、DVT プロセス制御サービスで
実行します (App Sandbox の外 — installd も無料署名 IPA も不要)。
./run_dvt.sh enable # build (clang + ld64.lld) → deploy → `dvt launch --stream`
run_dvt.sh はチェーン全体を自動化します:
usbmuxd を起動/検証し、ideviceinfo(libimobiledevice)でデバイスを確認します;poc/poc.c を素の arm64 Mach-O にクロスコンパイルします(Apple ツールチェーン不要):
clang -c → ld64.lld -platform_version ios … -syslibroot … -undefined dynamic_lookup;
SDK バージョンは バイナリ の SDKSettings.plist から plistlib 経由で読み取ります;dvt launch --stream を呼び出します。ステータス: Linux クロスコンパイルは 動作します(実際の
arm64Mach-O が生成されます)。オンデバイス デプロイ手順はまだ WIP です —HANDOFF.mdの «Сессия 12» を参照してください。また、PoC の IOKit パス(AppleMobileFileIntegrityセレクタ 11)はプラットフォーム制限付きエンタイトルメントcom.apple.private.amfi.developer-mode-controlを必要とするため、Apple 署名されていないバイナリは DVT 経由で起動しても userclient によって拒否されます — Developer Mode を有効にする サポートされた 方法は、上記で文書化されている lockdown プロトコルです。
アーキテクチャスライスごとに 2 つのクリーンなステップ(ld64.lld への委譲時に clang ドライバが -arch/-platform_version を飲み込むのを回避します):
-arch arm64 -platform_version ios <min> <sdk> を指定した実行ファイルclang-20...15、ld64.lld/lld、llvm-lipo、ldid を自動検出します。グレースフルフォールバック:ツールチェーンが ptrauth サポートを欠く場合、arm64e → arm64。
.
├── ipsws/ # iOS firmware images (NOT versioned — multi-GB)
├── kernelcaches/ # Extracted kernelcaches (arm64e Mach-O)
├── extracted/ # RootFS dumps + entitlements scan
├── diff_output/ # Full markdown diff reports (KEXTS, DYLIBS, SANDBOX...)
├── research/ # CVE analysis, XNU source excerpts
├── docs/WHITEPAPER.md # Full AMFI binary-diff whitepaper (iOS 27.0.1 → 27.2)
├── poc/ # ★ PoC source + Linux build system
│ ├── poc.c # AMFI + ACM IOKit client (C99)
│ ├── stubs/iokit_stub.h # Minimal IOKit header for Linux syntax check
│ ├── entitlements.plist # Required entitlements for armSecurityBootMode
│ ├── build_ipa.sh # ★ Linux cross-compiler (clang + ld64.lld + ldid)
│ ├── syntax_check_linux.sh
│ ├── lockdown_devmode.py # Session 9: lockdown/AMFI dev-mode probes
│ ├── action_probe.py # ★ Real AMFI protocol {"action": N}
│ ├── state_check.py # ★ Full kernel-level status + mounter query
│ ├── verify_now2.py # Post-restart accept (action=2) + verification
│ ├── semantics_probe.py # lockbot KV-store semantics (set_value dead-end)
│ ├── spoof_test.py # DeveloperModeStatus spoof attempt (failed)
│ ├── probe_amfi_service.py
│ ├── final_verify.py
│ └── verify_now.py
├── run_dvt.sh # ★ CoreDevice/DVT deploy (build + usbmuxd + RSD tunnel + launch)
├── harness/ # Reproduction harnesses
│ └── astc_harness.swift # Minimal ASTC decode harness (macOS, Swift)
├── tools/macho_tool.py # stdlib-only Mach-O arm64e disassembler (kernelcache RE)
├── HANDOFF.md # Full session log (Russian + English)
└── README.md # You are here