
CVE-2026-65343のPoC。iOS 26.6におけるAppleKeyStoreカーネルのOOB読み取りで、DYLD_INTERPOSEによるACMハンドルキャプチャを介してサンドボックス化されたアプリからKASLRを回避するためにカーネルポインタを漏洩させる。
コンポーネント: AppleKeyStore カーネル拡張 — _LibSer_SEPControl_Deserialize
影響: iOS / iPadOS 26.6 (23G71) 以前
修正済み: iOS / iPadOS 26.6.1 (23G83)
種類: SEP 制御メッセージのデシリアライズにおける境界外読み取り
影響: カーネルポインタリーク → サンドボックス化された entitlement 不要のプロセスからの KASLR 回避 (DYLD_INTERPOSE による ACM ハンドルキャプチャ経由)
発見者: Drinor Selmanaj (Sentry)、Surya Narayan Kushwaha
(Apple Security Advisory — iOS 26.6.1 による)
AppleKeyStore カーネル拡張の _LibSer_SEPControl_Deserialize は、ACM (Credential Manager) メッセージバッファから (payload_ptr, declared_length) のペアを copyout() 経由でユーザ空間に公開するが、declared_length ≤ remaining を検証していない。
declared_length = 0x800 を指定することで、ドライバはカーネルの ACM メッセージバッファの終端を約 0x7E8 バイト超えてコピーし、隣接するカーネルヒープ割り当てを読み取る。これらの隣接領域にはカーネルポインタ (0xfffffff0xxxxxxxx) が含まれており、KASLR スライドの計算に利用できる。
; _LibSer_SEPControl_Deserialize (affected path, 26.6 / 23G71)
ldr w2, [acm_msg + declared_length_offset] ; user-controlled 0x800
; NO check: w2 <= (acm_msg_end - payload_ptr) ← MISSING
bl copyout ; copies w2 bytes to userspace
直接の IOServiceOpen("AppleKeyStore") はサイドロードされたアプリではサンドボックスによってブロックされる。しかし、Security.framework の Secure Enclave 鍵署名パスは、実際の ACM セッションハンドルを用いて プロセス内で IOConnectCallMethod を呼び出す。
PoC は __DATA,__interpose フックを使用する (これは dyld のロード時に実行され、__DATA_CONST が読み取り専用になる前である — fishhook は iOS 26 では DATA_CONST 保護によりブロックされる):
SecKeyCreateRandomKey(kSecAttrTokenIDSecureEnclave) → SecKeyCreateSignature() → プロセス内の IOConnectCallMethod が実際の ACM ハンドルで発火(conn, handle[16]) をキャプチャdeclared_length = 0x800 でリプレイ0xfffffff0xxxxxxxx カーネルポインタについてスキャン → KASLR スライドを計算poc_aks_oob.m は完全な ACM ハンドルキャプチャと OOB プローブチェーンを実装する:
kSecAttrAccessibleAfterFirstUnlock、生体認証なし)declared_length = 0x800 でリプレイKPTR @+XXXX = 0xfffffff0YYYYYYYY の形式で出力SE 鍵署名がプロセス内ではなく secd XPC 経由でルーティングされる場合、フォールバックプローブはゼロハンドルを使用する (OOB パスの到達可能性を確認する。すべてのセレクタは ACM 検証に失敗するが、VNOP パスは確認される)。
iOS 26 では、__DATA_CONST (GOT を含む) はプロセス内コードが実行される前に読み取り専用にマップされる。実行時の GOT 書き込み (fishhook で使用されるもの) は KERN_PROTECTION_FAILURE → SIGBUS を引き起こす。__DATA,__interpose 経由の DYLD_INTERPOSE は機能する。なぜなら dyld はイメージロード時に interpose テーブルを処理し、それはカーネルが __DATA_CONST 保護を適用する前だからである。
kSecAttrTokenIDSecureEnclave) — entitlement なしで任意のサイドロードアプリが利用可能# Xcode project — link Security.framework and Foundation.framework
clang -arch arm64 \
-isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
-framework Security -framework Foundation \
-o poc poc/poc_aks_oob.m
codesign -s "Apple Development" --entitlements ent.plist poc
最小限の entitlement (ent.plist):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>keychain-access-groups</key>
<array><string>$(AppIdentifierPrefix)com.research.poc65343</string></array>
</dict></plist>
| Date | Event |
|---|---|
| 2026-08-17 | iOS 26.6.1 released with fix |
| 2026-08-17 | Apple credits published in security advisory |