
PoC CVE-2023-28205: Vulnerabilità Use-After-Free in Apple WebKit
Questa vulnerabilità interessa Apple WebKit e può essere sfruttata tramite contenuti web appositamente predisposti, consentendo potenzialmente l'esecuzione di codice arbitrario nel contesto del processo WebKit.
La build di WebKit analizzata in questo repository è basata su WebKit-613.1.17.1 (famiglia PlayStation / Safari 15.4).
La proof of concept attiva una condizione use-after-free (UAF)
ritardando intenzionalmente la registrazione di oggetti JavaScript come
Map e Date durante le operazioni di structured cloning.
Questa finestra temporale consente al Garbage Collector (GC) di JavaScriptCore di recuperare oggetti ancora logicamente in uso, causando la dereferenziazione di puntatori obsoleti durante la prosecuzione dell'esecuzione.
SerializedScriptValueCloneDeserializer::deserialize()La vulnerabilità risiede nella logica di deserializzazione dello structured clone, in particolare nel modo in cui gli oggetti JavaScript appena creati vengono tracciati durante la deserializzazione ricorsiva.
In SerializedScriptValue.cpp, il deserializzatore utilizza contenitori
WebKit standard come:
Vector<JSObject*, 32> outputObjectStack;
Vector<JSMap*, 4> mapStack;
Vector<JSSet*, 4> setStack;
Questi contenitori Vector non vengono scansionati dal Garbage Collector.
Se un ciclo di garbage collection viene attivato durante la deserializzazione
(ad esempio a causa di pressione sulla memoria o esecuzione JS rientrante), gli
oggetti referenziati solo da questi contenitori potrebbero essere raccolti
erroneamente.
Il deserializzatore, tuttavia, continua a utilizzare questi puntatori pendenti, determinando una condizione use-after-free.
La patch di sicurezza ufficiale di WebKit (commit c9880de) sostituisce questi
contenitori con MarkedVector, una struttura compatibile con il GC che registra
correttamente i suoi contenuti come GC root.
Nella build analizzata:
MarkedVector non è implementatoCloneDeserializer utilizza ancora VectorCiò conferma che la build è completamente vulnerabile a CVE-2023-28205.
Il seguente crash è stato riprodotto in modo affidabile dalla PoC ed è coerente con una dereferenziazione di puntatore obsoleto successiva al GC.
SIGSEGV (11)0x0000000000000068SceNKWebProcesslibSceNKWebKit.sprxL'indirizzo di fault 0x68 indica una dereferenziazione di un puntatore base
NULL con offset di campo oggetto, una firma classica dell'accesso a un
oggetto JavaScript liberato.
Lo stato dei registri conferma:
RAX = 0x0 (base oggetto NULL)Questo comportamento di crash è una manifestazione diretta della
UAF CloneDeserializer descritta sopra.