
PoC per CVE-2026-65343, una lettura OOB del kernel di AppleKeyStore su iOS 26.6 che espone puntatori del kernel per aggirare KASLR da un'app in sandbox tramite la cattura dell'handle ACM di DYLD_INTERPOSE.
Componente: estensione kernel AppleKeyStore — _LibSer_SEPControl_Deserialize
Interessati: iOS / iPadOS 26.6 (23G71) e precedenti
Corretto in: iOS / iPadOS 26.6.1 (23G83)
Tipo: Lettura Out-of-Bounds nella deserializzazione dei messaggi di controllo SEP
Impatto: Perdita di puntatori del kernel → KASLR defeat da un processo sandboxed e senza entitlement (tramite cattura dell'handle ACM con DYLD_INTERPOSE)
Scoperto da: Drinor Selmanaj (Sentry), Surya Narayan Kushwaha
(secondo l'Apple Security Advisory — iOS 26.6.1)
_LibSer_SEPControl_Deserialize nell'estensione kernel AppleKeyStore pubblica una coppia da un buffer di messaggio ACM (Credential Manager) verso lo userspace tramite , .
(payload_ptr, declared_length)copyout()declared_length ≤ remainingFornendo declared_length = 0x800, il driver copia circa 0x7E8 byte oltre la fine del buffer del messaggio ACM del kernel — leggendo in allocazioni adiacenti dell'heap del kernel. Quelle regioni adiacenti contengono puntatori del kernel (0xfffffff0xxxxxxxx) che possono essere usati per calcolare lo slide 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
La chiamata diretta IOServiceOpen("AppleKeyStore") è bloccata dalla sandbox sulle app sideloaded. Tuttavia, il percorso di firma delle chiavi del Secure Enclave di Security.framework chiama IOConnectCallMethod in-process con un handle di sessione ACM reale.
Il PoC usa un hook __DATA,__interpose (che viene eseguito al momento del caricamento di dyld, prima che __DATA_CONST diventi di sola lettura — fishhook è bloccato su iOS 26 dalla protezione DATA_CONST):
SecKeyCreateRandomKey(kSecAttrTokenIDSecureEnclave) → SecKeyCreateSignature() → IOConnectCallMethod in-process viene invocato con un handle ACM reale(conn, handle[16])declared_length = 0x800 su 163 selettori AKS0xfffffff0xxxxxxxx → calcola lo slide KASLRpoc_aks_oob.m implementa la catena completa di cattura dell'handle ACM e di probing OOB:
kSecAttrAccessibleAfterFirstUnlock, senza biometria)declared_length = 0x800 su tutti i 163 selettori AKSKPTR @+XXXX = 0xfffffff0YYYYYYYYSe la firma della chiave SE viene instradata tramite XPC di secd invece che in-process, il probe di fallback usa un handle nullo (conferma la raggiungibilità del percorso OOB; tutti i selettori falliranno la validazione ACM, ma il percorso VNOP è confermato).
Su iOS 26, __DATA_CONST (che contiene la GOT) è mappato in sola lettura prima che qualsiasi codice in-process venga eseguito. Le scritture runtime sulla GOT (come quelle usate da fishhook) attivano KERN_PROTECTION_FAILURE → SIGBUS. DYLD_INTERPOSE tramite __DATA,__interpose funziona perché dyld elabora la tabella di interpose al momento del caricamento dell'immagine, prima che il kernel applichi la protezione __DATA_CONST.
kSecAttrTokenIDSecureEnclave) — disponibile per qualsiasi app sideloaded senza 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 minimi (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>
| Data | Evento |
|---|---|
| 2026-08-17 | Rilasciato iOS 26.6.1 con la correzione |
| 2026-08-17 | Crediti Apple pubblicati nell'advisor di sicurezza |