
CVE-2026-20687 : AppleJPEGDriver startDecoder Timeout UAF — vulnérabilité du noyau iOS/macOS conduisant à une panique différée (A19 Pro, iOS 26.3 RC)
CVE-2026-20687 · Enfilade · enfilade.io
Composant : Kernel
Impact : Une application peut être en mesure de provoquer un arrêt inattendu du système ou d'écrire dans la mémoire du kernel.
Description : Un problème d'utilisation après libération a été corrigé grâce à une meilleure gestion de la mémoire.
| iOS | 26.3 (23D125) (testé) |
| macOS | — |
| Composant | AppleJPEGDriver |
| Corrigé | iOS 26.4 / iPadOS 26.4 |
| Matériel | iPhone18,2 (iPhone 17 Pro Max, A19 Pro) |
L'exécution du PoC provoquera un kernel panic sur l'appareil. Enregistrez votre travail avant de l'exécuter. Des panics répétés peuvent entraîner une corruption du système de fichiers. À des fins de recherche en sécurité uniquement.
Le chemin de dépassement de délai dans startDecoder_sync libère une requête mais laisse son pointeur de nœud de file intégré dans le vecteur par-codec. Une traversée ultérieure de la file déréférence le nœud obsolète et le kernel panique sous l'application du contrôle des balises MTE. Le panic est généralement différé jusqu'à ce qu'un décodage JPEG synchrone ultérieur s'exécute — sur iPhone, cela se produit de manière fiable lorsque l'application Appareil photo est ouverte.
// Prépare le driver ; le panic est généralement différé jusqu'à l'ouverture de l'Appareil photo.
IOServiceOpen("AppleJPEGDriver");
for (int i = 0; i < N; i++) {
startDecoder_async(); // queue_io_gated: vector.push(req + 0x78)
}
IOServiceClose(conn);
// Plus tard, l'ouverture de l'Appareil photo déclenche :
startDecoder_sync();
queue_io_gated: vector.push(req + 0x78);
wait(10s) -> TIMEOUT;
pool_free(req); // BUG : ne retire PAS de la file (req + 0x78)
// Encore plus tard (finish_io_gated) :
fullSpeedRequestExist():
node_ptr = vector[i]; // obsolète : node_ptr == (req libéré + 0x78)
req2 = *(node_ptr + 0x8); // lecture UAF -> défaut de balise MTE -> panic
ios-app/Test.xcodeproj dans Xcode.Voir LICENSE.