
PoC CVE-2023-28205 : Vulnérabilité Use-After-Free dans Apple WebKit
Cette vulnérabilité affecte Apple WebKit et peut être exploitée via du contenu web malveillant, permettant potentiellement l'exécution de code arbitraire dans le contexte du processus WebKit.
La version de WebKit analysée dans ce dépôt est basée sur WebKit-613.1.17.1 (lignée PlayStation / Safari 15.4).
La preuve de concept déclenche une condition use-after-free (UAF) en retardant intentionnellement l'enregistrement des objets JavaScript tels que Map et Date lors des opérations de clonage structuré.
Cette fenêtre temporelle permet au Ramasse-miettes (GC) de JavaScriptCore de réclamer des objets qui sont encore logiquement en cours d'utilisation, entraînant le déréférencement de pointeurs obsolètes lors de l'exécution continue.
SerializedScriptValueCloneDeserializer::deserialize()La vulnérabilité réside dans la logique de désérialisation de clonage structuré, en particulier dans la façon dont les objets JavaScript nouvellement créés sont suivis lors de la désérialisation récursive.
Dans SerializedScriptValue.cpp, le désérialiseur utilise des conteneurs WebKit standards tels que :
Vector<JSObject*, 32> outputObjectStack;
Vector<JSMap*, 4> mapStack;
Vector<JSSet*, 4> setStack;
Ces conteneurs Vector ne sont pas analysés par le Ramasse-miettes. Si un cycle de ramasse-miettes est déclenché pendant la désérialisation (par exemple via une pression mémoire ou une exécution JS réentrante), les objets référencés uniquement par ces conteneurs peuvent être collectés incorrectement.
Le désérialiseur continue cependant d'utiliser ces pointeurs pendants, entraînant une condition use-after-free.
Le correctif de sécurité officiel de WebKit (commit c9880de) remplace ces conteneurs par MarkedVector, une structure compatible GC qui enregistre correctement son contenu comme racines GC.
Dans la version analysée :
MarkedVector n'est pas implémentéCloneDeserializer utilise toujours VectorCela confirme que la version est totalement vulnérable à CVE-2023-28205.
Le crash suivant a été déclenché de manière fiable par la PoC et est cohérent avec un déréférencement de pointeur obsolète post-GC.
SIGSEGV (11)0x0000000000000068SceNKWebProcesslibSceNKWebKit.sprxL'adresse de défaut 0x68 indique un déréférencement de pointeur NULL avec un décalage de champ d'objet, une signature classique de l'accès à un objet JavaScript libéré.
L'état des registres confirme :
RAX = 0x0 (base d'objet NULL)Ce comportement de crash est une manifestation directe de l'UAF du CloneDeserializer décrit ci-dessus.