
PoC für CVE-2026-65343, einen AppleKeyStore-Kernel-OOB-Read auf iOS 26.6, der Kernel-Pointer leakt, um KASLR aus einer sandboxed App über DYLD_INTERPOSE ACM-Handle-Capture zu umgehen.
Komponente: AppleKeyStore Kernel-Erweiterung — _LibSer_SEPControl_Deserialize
Betroffen: iOS / iPadOS 26.6 (23G71) und früher
Behoben in: iOS / iPadOS 26.6.1 (23G83)
Typ: Out-of-Bounds-Leser bei der Deserialisierung von SEP-Steuernachrichten
Auswirkung: Kernel-Zeiger-Leak → KASLR-Umgehung aus einem sandboxed, entitlement-freien Prozess (über DYLD_INTERPOSE ACM-Handle-Erfassung)
Entdeckt von: Drinor Selmanaj (Sentry), Surya Narayan Kushwaha
(gemäß Apple Security Advisory — iOS 26.6.1)
_LibSer_SEPControl_Deserialize in der AppleKeyStore Kernel-Erweiterung veröffentlicht ein (payload_ptr, declared_length)-Paar aus einem ACM (Credential Manager)-Nachrichtenpuffer an den Userspace via , .
copyout()declared_length ≤ remainingDurch Angabe von declared_length = 0x800 kopiert der Treiber etwa 0x7E8 Bytes über das Ende des Kernel-ACM-Nachrichtenpuffers hinaus — und liest dabei in angrenzende Kernel-Heap-Allokationen hinein. Diese angrenzenden Bereiche enthalten Kernel-Zeiger (0xfffffff0xxxxxxxx), die zur Berechnung des KASLR-Slides verwendet werden können.
; _LibSer_SEPControl_Deserialize (betroffener Pfad, 26.6 / 23G71)
ldr w2, [acm_msg + declared_length_offset] ; benutzergesteuert 0x800
; KEINE Prüfung: w2 <= (acm_msg_end - payload_ptr) ← FEHLT
bl copyout ; kopiert w2 Bytes in den Userspace
Direktes IOServiceOpen("AppleKeyStore") wird durch die Sandbox bei sideloaded Apps blockiert. Der Security.framework Secure Enclave Key-Signing-Pfad ruft jedoch IOConnectCallMethod in-process mit einem echten ACM-Session-Handle auf.
Der PoC verwendet einen __DATA,__interpose-Hook (der zur dyld-Ladezeit ausgeführt wird, bevor __DATA_CONST schreibgeschützt wird — fishhook wird auf iOS 26 durch den DATA_CONST-Schutz blockiert):
SecKeyCreateRandomKey(kSecAttrTokenIDSecureEnclave) → SecKeyCreateSignature() → in-process IOConnectCallMethod wird mit einem echten ACM-Handle ausgelöst(conn, handle[16]) erfassendeclared_length = 0x800 über 163 AKS-Selektoren replizieren0xfffffff0xxxxxxxx Kernel-Zeiger scannen → KASLR-Slide berechnenpoc_aks_oob.m implementiert die vollständige ACM-Handle-Erfassung und OOB-Probe-Kette:
kSecAttrAccessibleAfterFirstUnlock, ohne Biometrie)declared_length = 0x800 über alle 163 AKS-SelektorenKPTR @+XXXX = 0xfffffff0YYYYYYYYWenn die SE-Schlüsselsignatur über secd XPC statt in-process geleitet wird, verwendet die Fallback-Probe ein Null-Handle (bestätigt die Erreichbarkeit des OOB-Pfads; alle Selektoren werden die ACM-Validierung fehlschlagen, aber der VNOP-Pfad ist bestätigt).
Unter iOS 26 wird __DATA_CONST (das die GOT enthält) schreibgeschützt gemappt, bevor jeglicher in-process Code ausgeführt wird. Laufzeit-GOT-Schreibvorgänge (wie sie von fishhook verwendet werden) lösen KERN_PROTECTION_FAILURE → SIGBUS aus. DYLD_INTERPOSE via __DATA,__interpose funktioniert, weil dyld die Interpose-Tabelle zur Image-Ladezeit verarbeitet, bevor der Kernel den __DATA_CONST-Schutz durchsetzt.
kSecAttrTokenIDSecureEnclave) — für jede sideloaded App ohne Entitlements verfügbar# 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
Minimale Entitlements (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>
| Datum | Ereignis |
|---|---|
| 2026-08-17 | iOS 26.6.1 mit Fix veröffentlicht |
| 2026-08-17 | Apple-Credits im Security Advisory veröffentlicht |