Il developer notzecoxao sempre sul pezzo ha condiviso una dettagliata analisi di un possibile exploit nel webKit per console PlayStation 4 e PlayStation 5.
I dettagli sono stati descritti dal team di sicurezza Google Project Zero, la vulnerabilità CVE-2022-22620: Use-after-free
è presente sul browser Safari di Apple, mentre lo stesso motore di rendering viene utilizzato anche all’interno del browser della console PlayStation 4.
https://twitter.com/notzecoxao/status/1536802936889696257
La vulnerabilità presente nell’API della cronologia consente l’accesso (e la modifica) a una pila di pagine visitate nel frame corrente e archiviate come file SerializedScriptValue
.
Questa API espone un getter per state
e un metodo replaceState
che consente di sovrascrivere la voce della cronologia “più recente”.
Il bug si presenta perché FrameLoader::loadInSameDocument
prende state
come argomento (stateObject
), ma non aumenta il conteggio dei riferimenti.
Solo un oggetto HistoryItem
contiene un riferimento a stateObject
, mentre loadInSameDocument
può attivare un callback nel JavaScript dell’utente tramite l’evento onblur
.
Il callback dell’utente può chiamare replaceState
per sostituire lo state
di HistoryItem
con un nuovo oggetto, eliminando quindi l’unico riferimento a stateObject
.
Quando il callback ritorna, loadInSameDocument
utilizzerà ancora questo oggetto free’d nella sua chiamata a statePopped
, portando ad un use-after-free.
Quando il callback ritorna, loadInSameDocument
utilizzerà ancora questo oggetto free’d nella sua chiamata a statePopped
, portando all’uso dopo-libero.
Quando viene chiamato loadInSameDocument
, cambia lo stato attivo sull’elemento su cui scorre. Se impostiamo lo stato attivo su un elemento diverso prima dell’esecuzione di loadInSameDocument
, l’evento blur
verrà attivato su quell’elemento.
Quindi possiamo liberare stateObject
chiamando replaceState
nel gestore di eventi onblur
.
Analisi della patch
La patch modifica l’argomento stateObject
in loadInSameDocument
da un puntatore non elaborato, SerializedScriptValue*
, a un puntatore con conteggio dei riferimenti, RefPtr<SerializedScriptValue>
, in modo che loadInSameDocument
ora incrementi il conteggio dei riferimenti sull’oggetto.
Considerazioni su come questa vulnerabilità potrebbe essere stata trovata (fuzzing, controllo del codice, analisi delle varianti, ecc..)
Sembra ragionevole che la vulnerabilità possa essere stata trovata osservando i commit e vedendo la correzione iniziale del 2013 ripristinata nel 2016, controllo del codice o fuzzing.
Il fuzzing sembra leggermente meno probabile a causa della necessità di supportare la “navigazione” che molti fuzzer cercano esplicitamente di escludere.
(Storico/presente/futuro) contesto del bug
Questo bug è stato effettivamente segnalato e corretto inizialmente nel 2013. Nel 2016 la correzione è stata regredita durante (sembra) il refactoring.
Sempre secondo notzecoxao questo bug sarebbe presente sul firmware 8.XX della console PlayStation 4, mentre la correzione risalirebbe a febbraio di quest’anno.
Fonte: twitter.com