
Prova de conceito para CVE-2026-65343, uma leitura fora dos limites no AppleKeyStore que vaza ponteiros do kernel para derrotar o KASLR no iOS 26.6. Inclui captura do handle ACM via DYLD_INTERPOSE e uma sondagem entre seletores AKS.
Componente: Extensão de kernel AppleKeyStore — _LibSer_SEPControl_Deserialize
Afetados: iOS / iPadOS 26.6 (23G71) e anteriores
Corrigido em: iOS / iPadOS 26.6.1 (23G83)
Tipo: Leitura fora dos limites na desserialização de mensagens de controle do SEP
Impacto: Vazamento de ponteiros do kernel → derrota do KASLR a partir de um processo em sandbox, sem entitlements (via captura do handle ACM com DYLD_INTERPOSE)
Descoberto por: Drinor Selmanaj (Sentry), Surya Narayan Kushwaha
(conforme Apple Security Advisory — iOS 26.6.1)
_LibSer_SEPControl_Deserialize na extensão de kernel AppleKeyStore publica um par de um buffer de mensagens ACM (Credential Manager) para o espaço do usuário via , .
(payload_ptr, declared_length)copyout()declared_length ≤ remainingAo fornecer declared_length = 0x800, o driver copia aproximadamente 0x7E8 bytes além do final do buffer de mensagens ACM do kernel — lendo alocações adjacentes do heap do kernel. Essas regiões adjacentes contêm ponteiros do kernel (0xfffffff0xxxxxxxx) que podem ser usados para calcular o slide do KASLR.
; _LibSer_SEPControl_Deserialize (caminho afetado, 26.6 / 23G71)
ldr w2, [acm_msg + declared_length_offset] ; 0x800 controlado pelo usuário
; SEM verificação: w2 <= (acm_msg_end - payload_ptr) ← AUSENTE
bl copyout ; copia w2 bytes para o espaço do usuário
O acesso direto a IOServiceOpen("AppleKeyStore") é bloqueado pela sandbox em aplicativos sideloaded. No entanto, o caminho de assinatura de chaves do Secure Enclave do Security.framework chama IOConnectCallMethod no processo com um handle de sessão ACM real.
O PoC usa um hook __DATA,__interpose (que é executado no momento do carregamento do dyld, antes que __DATA_CONST se torne somente leitura — fishhook é bloqueado no iOS 26 pela proteção DATA_CONST):
SecKeyCreateRandomKey(kSecAttrTokenIDSecureEnclave) → SecKeyCreateSignature() → IOConnectCallMethod no processo é acionado com um handle ACM real(conn, handle[16])declared_length = 0x800 em 163 seletores AKS0xfffffff0xxxxxxxx → calcula o slide do KASLRpoc_aks_oob.m implementa a captura completa do handle ACM e a cadeia de sondagem OOB:
kSecAttrAccessibleAfterFirstUnlock, sem biometria)declared_length = 0x800 em todos os 163 seletores AKSKPTR @+XXXX = 0xfffffff0YYYYYYYYSe a assinatura da chave SE for roteada via XPC do secd em vez de no processo, a sonda de fallback usa um handle zero (confirma a acessibilidade do caminho OOB; todos os seletores falharão na validação ACM, mas o caminho VNOP é confirmado).
No iOS 26, __DATA_CONST (que contém o GOT) é mapeado como somente leitura antes que qualquer código no processo seja executado. Escritas em tempo de execução no GOT (como usadas pelo fishhook) acionam KERN_PROTECTION_FAILURE → SIGBUS. DYLD_INTERPOSE via __DATA,__interpose funciona porque o dyld processa a tabela de interpose no momento do carregamento da imagem, antes que o kernel aplique a proteção __DATA_CONST.
kSecAttrTokenIDSecureEnclave) — disponível para qualquer aplicativo sideloaded sem entitlements# Projeto Xcode — vincule 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
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>
| Data | Evento |
|---|---|
| 2026-08-17 | iOS 26.6.1 lançado com a correção |
| 2026-08-17 | Créditos da Apple publicados no advisory de segurança |