
# PoC CVE-2026-65343 — Lectura fuera de límites en AppleKeyStore → Derrota de KASLR (iOS 26.6 / 23G71)
Componente: Extensión de kernel AppleKeyStore — _LibSer_SEPControl_Deserialize
Afecta: iOS / iPadOS 26.6 (23G71) y anteriores
Corregido en: iOS / iPadOS 26.6.1 (23G83)
Tipo: Lectura fuera de límites en la deserialización de mensajes de control SEP
Impacto: Fuga de punteros del kernel → derrota de KASLR desde un proceso en sandbox sin entitlements (mediante captura del handle ACM con DYLD_INTERPOSE)
Descubierto por: Drinor Selmanaj (Sentry), Surya Narayan Kushwaha
(según Apple Security Advisory — iOS 26.6.1)
_LibSer_SEPControl_Deserialize en la extensión de kernel AppleKeyStore publica un par desde un buffer de mensajes ACM (Credential Manager) al espacio de usuario mediante , .
(payload_ptr, declared_length)copyout()declared_length ≤ remainingAl proporcionar declared_length = 0x800, el driver copia aproximadamente 0x7E8 bytes más allá del final del buffer de mensajes ACM del kernel — leyendo asignaciones adyacentes del heap del kernel. Esas regiones adyacentes contienen punteros del kernel (0xfffffff0xxxxxxxx) que pueden usarse para calcular el slide de KASLR.
; _LibSer_SEPControl_Deserialize (ruta afectada, 26.6 / 23G71)
ldr w2, [acm_msg + declared_length_offset] ; 0x800 controlado por el usuario
; SIN comprobación: w2 <= (acm_msg_end - payload_ptr) ← FALTA
bl copyout ; copia w2 bytes al espacio de usuario
La llamada directa a IOServiceOpen("AppleKeyStore") está bloqueada por la sandbox en aplicaciones sideloaded. Sin embargo, la ruta de firma de claves del Secure Enclave de Security.framework llama a IOConnectCallMethod en el mismo proceso con un handle de sesión ACM real.
El PoC utiliza un hook __DATA,__interpose (que se ejecuta en el momento de carga de dyld, antes de que __DATA_CONST se vuelva de solo lectura — fishhook está bloqueado en iOS 26 por la protección DATA_CONST):
SecKeyCreateRandomKey(kSecAttrTokenIDSecureEnclave) → SecKeyCreateSignature() → se dispara IOConnectCallMethod en el mismo proceso con un handle ACM real(conn, handle[16])declared_length = 0x800 en los 163 selectores AKS0xfffffff0xxxxxxxx → calcula el slide de KASLRpoc_aks_oob.m implementa la cadena completa de captura del handle ACM y la sonda OOB:
kSecAttrAccessibleAfterFirstUnlock, sin biometría)declared_length = 0x800 en los 163 selectores AKSKPTR @+XXXX = 0xfffffff0YYYYYYYYSi la firma de la clave SE se enruta a través de XPC de secd en lugar de en el mismo proceso, la sonda de respaldo usa un handle cero (confirma la accesibilidad de la ruta OOB; todos los selectores fallarán la validación ACM, pero la ruta VNOP queda confirmada).
En iOS 26, __DATA_CONST (que contiene el GOT) se mapea como solo lectura antes de que se ejecute cualquier código en el proceso. Las escrituras al GOT en tiempo de ejecución (como las usadas por fishhook) provocan KERN_PROTECTION_FAILURE → SIGBUS. DYLD_INTERPOSE mediante __DATA,__interpose funciona porque dyld procesa la tabla de interpose en el momento de carga de la imagen, antes de que el kernel aplique la protección de __DATA_CONST.
kSecAttrTokenIDSecureEnclave) — disponible para cualquier aplicación sideloaded sin entitlementsSecurity.framework puede invocar la llamada AKS IOKit
en el mismo proceso (depende del dispositivo y la compilación de iOS). En algunas configuraciones la llamada se enruta a través de XPC de secd
— en ese caso, el respaldo de handle cero confirma la accesibilidad de la ruta OOB pero no la derrota completa de KASLR.# Proyecto Xcode — enlaza Security.framework y 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 mínimos (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>
| Fecha | Evento |
|---|---|
| 2026-08-17 | iOS 26.6.1 publicado con la corrección |
| 2026-08-17 | Créditos de Apple publicados en el advisory de seguridad |