
PoC CVE-2023-28205: vulnerabilidad Use-After-Free en Apple WebKit
Esta vulnerabilidad afecta a Apple WebKit y puede explotarse mediante contenido web manipulado de forma maliciosa, lo que potencialmente permite la ejecución de código arbitrario en el contexto del proceso WebKit.
La compilación de WebKit afectada analizada en este repositorio se basa en WebKit-613.1.17.1 (linaje de PlayStation / Safari 15.4).
La prueba de concepto desencadena una condición de use-after-free (UAF) al
retrasar intencionalmente el registro de objetos JavaScript como
Map y Date durante operaciones de clonado estructurado.
Esta ventana de tiempo permite que el recolector de basura de JavaScriptCore (GC) reclame objetos que todavía están lógicamente en uso, lo que da como resultado que se desreferencien punteros obsoletos durante la ejecución continuada.
SerializedScriptValueCloneDeserializer::deserialize()La vulnerabilidad reside en la lógica de deserialización del clonado estructurado, específicamente en cómo se rastrean los objetos JavaScript recién creados durante la deserialización recursiva.
En SerializedScriptValue.cpp, el deserializador utiliza contenedores
estándar de WebKit, como:
Vector<JSObject*, 32> outputObjectStack;
Vector<JSMap*, 4> mapStack;
Vector<JSSet*, 4> setStack;
Estos contenedores Vector no son escaneados por el recolector de basura.
Si se desencadena un ciclo de recolección de basura durante la deserialización
(por ejemplo, mediante presión de memoria o ejecución JS reentrante), los objetos
referenciados solo por estos contenedores pueden recolectarse incorrectamente.
Sin embargo, el deserializador continúa usando estos punteros colgantes, lo que da como resultado una condición de use-after-free.
El parche de seguridad oficial de WebKit (commit c9880de) reemplaza estos
contenedores con MarkedVector, una estructura sensible al GC que registra
correctamente su contenido como raíces del GC.
En la compilación analizada:
MarkedVector no está implementadoCloneDeserializer todavía usa VectorEsto confirma que la compilación es completamente vulnerable a CVE-2023-28205.
El siguiente fallo fue provocado de forma fiable por la PoC y es coherente con una desreferencia de puntero obsoleto posterior al GC.
SIGSEGV (11)0x0000000000000068SceNKWebProcesslibSceNKWebKit.sprxLa dirección de fallo 0x68 indica una desreferencia de puntero base NULL con
un desplazamiento de campo de objeto, una firma clásica de acceso a un
objeto JavaScript liberado.
El estado de los registros lo confirma:
RAX = 0x0 (base del objeto NULL)Este comportamiento de fallo es una manifestación directa del
UAF en CloneDeserializer descrito anteriormente.