
# Preuve de concept CVE-2026-65343 — Lecture hors limites AppleKeyStore → contournement KASLR (iOS 26.6 / 23G71)
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 depuis 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 moment du 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() → 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 OOB :
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 OOB ; 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 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 entitlementsSecurity.framework peut invoquer l'appel AKS IOKit
dans le processus (dépend de l'appareil et de la version iOS). Sur certaines configurations, l'appel est routé via XPC secd
à la place — dans ce cas, le repli avec handle nul confirme l'accessibilité du chemin OOB mais pas le contournement complet du KASLR.# 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é |