PoC pour CVE-2026-65343, une lecture hors limites (OOB read) du noyau AppleKeyStore sur iOS 26.6 qui divulgue des pointeurs du noyau afin de contourner KASLR depuis une application sandboxée via la capture du handle ACM par DYLD_INTERPOSE.
Composant : extension noyau AppleKeyStore — _LibSer_SEPControl_Deserialize
Affecté : iOS / iPadOS 26.6 (23G71) et versions antérieures
Corrigé dans : iOS / iPadOS 26.6.1 (23G83)
Type : Lecture hors limites lors de la désérialisation des messages de contrôle SEP
Impact : Fuite de pointeur noyau → contournement du KASLR depuis un processus sandboxé et sans entitlement (via capture du handle ACM par DYLD_INTERPOSE)
Découvert par : Drinor Selmanaj (Sentry), Surya Narayan Kushwaha
(selon Apple Security Advisory — 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 ainsi dans les allocations adjacentes du tas noyau. Ces régions adjacentes contiennent des pointeurs noyau (0xfffffff0xxxxxxxx) qui peuvent être utilisés pour calculer le décalage 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
L'appel direct à IOServiceOpen("AppleKeyStore") est bloqué par le sandbox sur les applications sideloadées. Cependant, le chemin de signature de clé du 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 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 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 repli 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 celles utilisées par fishhook) déclenchent KERN_PROTECTION_FAILURE → SIGBUS. DYLD_INTERPOSE via __DATA,__interpose fonctionne car dyld traite la table d'interpose 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# 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
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é |