
Proof-of-concept per CVE-2026-65343, una lettura fuori dai limiti in AppleKeyStore che fa trapelare puntatori del kernel per aggirare KASLR su iOS 26.6. Include l'acquisizione dell'handle ACM tramite DYLD_INTERPOSE e una sonda attraverso i selettori AKS.
Componente: estensione kernel AppleKeyStore — _LibSer_SEPControl_Deserialize
Versioni interessate: iOS / iPadOS 26.6 (23G71) e precedenti
Corretto in: iOS / iPadOS 26.6.1 (23G83)
Tipo: Lettura fuori dai limiti nella deserializzazione dei messaggi di controllo SEP
Impatto: Leak di puntatori kernel → bypass KASLR da un processo in sandbox, senza entitlement (tramite cattura dell'handle ACM con DYLD_INTERPOSE)
Scoperto da: Drinor Selmanaj (Sentry), Surya Narayan Kushwaha
(secondo Apple Security Advisory — iOS 26.6.1)
_LibSer_SEPControl_Deserialize nell'estensione kernel AppleKeyStore pubblica una coppia da un buffer di messaggi ACM (Credential Manager) verso lo spazio utente tramite , .
(payload_ptr, declared_length)copyout()declared_length ≤ remainingFornendo declared_length = 0x800, il driver copia circa 0x7E8 byte oltre la fine del buffer kernel dei messaggi ACM — leggendo nelle allocazioni heap kernel adiacenti. Queste regioni adiacenti contengono puntatori kernel (0xfffffff0xxxxxxxx) che possono essere usati per calcolare lo slide KASLR.
; _LibSer_SEPControl_Deserialize (percorso interessato, 26.6 / 23G71)
ldr w2, [acm_msg + declared_length_offset] ; 0x800 controllato dall'utente
; NESSUN controllo: w2 <= (acm_msg_end - payload_ptr) ← MANCANTE
bl copyout ; copia w2 byte verso lo spazio utente
L'apertura diretta di IOServiceOpen("AppleKeyStore") è bloccata dalla sandbox sulle app sideloadate. Tuttavia, il percorso di firma delle chiavi Secure Enclave di Security.framework chiama IOConnectCallMethod in-process con un handle di sessione ACM reale.
La PoC usa un hook __DATA,__interpose (che viene eseguito al caricamento di dyld, prima che __DATA_CONST diventi read-only — fishhook è bloccato su iOS 26 dalla protezione DATA_CONST):
SecKeyCreateRandomKey(kSecAttrTokenIDSecureEnclave) → SecKeyCreateSignature() → la chiamata IOConnectCallMethod in-process viene attivata con un handle ACM reale(conn, handle[16])declared_length = 0x800 su 163 selettori AKS0xfffffff0xxxxxxxx → calcola lo slide KASLRpoc_aks_oob.m implementa l'intera catena di cattura dell'handle ACM e di probe OOB:
kSecAttrAccessibleAfterFirstUnlock, senza biometria)declared_length = 0x800 su tutti i 163 selettori AKSKPTR @+XXXX = 0xfffffff0YYYYYYYYSe la firma della chiave SE viene instradata tramite XPC secd invece che in-process, il probe di fallback usa un handle zero (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 read-only 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 interpose al momento del caricamento dell'immagine, prima che il kernel applichi la protezione __DATA_CONST.
kSecAttrTokenIDSecureEnclave) — disponibile per qualsiasi app sideloadata senza entitlement# Progetto Xcode — collega Security.framework e 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 | iOS 26.6.1 rilasciato con la correzione |
| 2026-08-17 | Crediti Apple pubblicati nell'advisory di sicurezza |