
Preuve de concept pour CVE-2026-65343, une lecture hors limites dans AppleKeyStore qui divulgue des pointeurs noyau pour contourner KASLR sur iOS 26.6. Inclut la capture du handle ACM via DYLD_INTERPOSE et une sonde à travers les sélecteurs AKS.
Composant : Extension noyau AppleKeyStore — _LibSer_SEPControl_Deserialize
Versions concernées : iOS / iPadOS 26.6 (23G71) et antérieures
Corrigé dans : iOS / iPadOS 26.6.1 (23G83)
Type : Lecture hors limites dans la désérialisation des messages de contrôle SEP
Impact : Fuite de pointeurs noyau → contournement KASLR depuis un processus sandboxé, sans entitlement (via capture du handle ACM par DYLD_INTERPOSE)
Découvert par : Drinor Selmanaj (Sentry), Surya Narayan Kushwaha
(selon l'avis de sécurité Apple — iOS 26.6.1)
_LibSer_SEPControl_Deserialize dans l'extension noyau AppleKeyStore publie une paire issue d'un tampon de message ACM (Credential Manager) vers l'espace utilisateur via , .
(payload_ptr, declared_length)copyout()declared_length ≤ remainingEn fournissant declared_length = 0x800, le pilote copie environ 0x7E8 octets au-delà de la fin du tampon de message ACM du noyau — lisant dans les allocations de tas adjacentes du noyau. Ces régions adjacentes contiennent des pointeurs noyau (0xfffffff0xxxxxxxx) qui peuvent être utilisés pour calculer le décalage KASLR.
; _LibSer_SEPControl_Deserialize (chemin affecté, 26.6 / 23G71)
ldr w2, [acm_msg + declared_length_offset] ; 0x800 contrôlé par l'utilisateur
; AUCUNE vérification : w2 <= (acm_msg_end - payload_ptr) ← MANQUANTE
bl copyout ; copie w2 octets vers l'espace utilisateur
L'appel direct à IOServiceOpen("AppleKeyStore") est bloqué par le sandbox sur les applications sideloadées. Cependant, le chemin de signature de clé Secure Enclave de Security.framework appelle IOConnectCallMethod dans le processus avec un véritable handle de session ACM.
Le PoC utilise un hook __DATA,__interpose (qui s'exécute au chargement de dyld, avant que __DATA_CONST ne soit rendu en lecture seule — fishhook est bloqué sur iOS 26 par la protection DATA_CONST) :
SecKeyCreateRandomKey(kSecAttrTokenIDSecureEnclave) → SecKeyCreateSignature() → l'appel IOConnectCallMethod dans le processus se déclenche avec un véritable handle ACM(conn, handle[16])declared_length = 0x800 sur les 163 sélecteurs AKS0xfffffff0xxxxxxxx → calculer le décalage KASLRpoc_aks_oob.m implémente la chaîne complète de capture du handle ACM et de sonde hors limites :
kSecAttrAccessibleAfterFirstUnlock, sans biométrie)declared_length = 0x800 sur les 163 sélecteurs AKSKPTR @+XXXX = 0xfffffff0YYYYYYYYSi la signature de clé SE est routée via XPC secd au lieu du processus, la sonde de secours utilise un handle nul (confirme l'accessibilité du chemin hors limites ; tous les sélecteurs échoueront à la validation ACM, mais le chemin VNOP est confirmé).
Sur iOS 26, __DATA_CONST (qui contient la GOT) est mappé en lecture seule avant l'exécution de tout code dans le processus. Les écritures GOT à l'exécution (comme celles utilisées par fishhook) déclenchent KERN_PROTECTION_FAILURE → SIGBUS. DYLD_INTERPOSE via __DATA,__interpose fonctionne car dyld traite la table d'interposition au moment du chargement de l'image, avant que le noyau n'applique la protection __DATA_CONST.
kSecAttrTokenIDSecureEnclave) — disponible pour toute application sideloadée sans entitlements# Projet Xcode — lier Security.framework et 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
Entitlements minimaux (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 | Événement |
|---|---|
| 2026-08-17 | iOS 26.6.1 publié avec le correctif |
| 2026-08-17 | Crédits Apple publiés dans l'avis de sécurité |