
Proof-of-Concept für CVE-2026-65343, eine Out-of-Bounds-Leseoperation in AppleKeyStore, die Kernel-Pointer preisgibt, um KASLR auf iOS 26.6 zu umgehen. Enthält die Erfassung von ACM-Handles über DYLD_INTERPOSE sowie einen Probe über AKS-Selektoren.
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-Read bei der Deserialisierung von SEP-Kontrollnachrichten
Auswirkung: Kernel-Pointer-Leak → KASLR-Umgehung aus einem sandboxed Prozess ohne Entitlements (über DYLD_INTERPOSE-ACM-Handle-Erfassung)
Entdeckt von: Drinor Selmanaj (Sentry), Surya Narayan Kushwaha
(laut 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 über , .
copyout()declared_length ≤ remaining istDurch die 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. Diese angrenzenden Bereiche enthalten Kernel-Pointer (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 an den Userspace
Direktes IOServiceOpen("AppleKeyStore") wird von der Sandbox bei sideloaded Apps blockiert. Der Secure-Enclave-Schlüsselsignierungspfad von Security.framework ruft jedoch IOConnectCallMethod im selben Prozess 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 gemacht wird — fishhook ist auf iOS 26 durch den DATA_CONST-Schutz blockiert):
SecKeyCreateRandomKey(kSecAttrTokenIDSecureEnclave) → SecKeyCreateSignature() → IOConnectCallMethod im selben Prozess feuert mit einem echten ACM-Handle(conn, handle[16]) erfassendeclared_length = 0x800 über 163 AKS-Selektoren0xfffffff0xxxxxxxx-Kernel-Pointern durchsuchen → 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 = 0xfffffff0YYYYYYYY ausWenn die SE-Schlüsselsignierung über secd-XPC statt im selben Prozess geleitet wird, verwendet die Fallback-Probe ein Null-Handle (bestätigt die Erreichbarkeit des OOB-Pfads; alle Selektoren schlagen bei der ACM-Validierung fehl, aber der VNOP-Pfad wird bestätigt).
Auf iOS 26 ist __DATA_CONST (das den GOT enthält) schreibgeschützt gemappt, bevor irgendein In-Process-Code ausgeführt wird. Laufzeit-GOT-Schreibvorgänge (wie von fishhook verwendet) lösen KERN_PROTECTION_FAILURE → SIGBUS aus. DYLD_INTERPOSE über __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-Projekt — Security.framework und Foundation.framework verlinken
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
Mindest-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 |