Alla fine il developer SpecterDev ha mantenuto la parola data pubblicando il primo vero Kernel Exploit della console PlayStation 5 per firmware 4.03, seppur sperimentale.
Nella nottata appena trascorsa sono comparsi su Twitter numerose immagini che testimoniano l’esecuzione dell’exploit. Un’implementazione sperimentale webkit ROP di un exploit del kernel PS5 basato su IPV6 Use-After-Free (UAF) del developer TheFlow, precedentemente segnalato su HackerOne.
Here it is. Thanks to everyone mentioned earlier. Be warned stability is not great, something to be improved on for sure.https://t.co/J7MJOZlTOx
— Specter (@SpecterDev) October 2, 2022
La strategia di exploit è per la maggior parte basata su di un PoC BSD/PS4 di TheFlow con alcune modifiche per adattarsi al fastidioso layout della memoria PS5.
Stabilisce una primitiva di lettura/scrittura (semi-arbitraria) arbitraria. L’exploit si dimostrerebbe comunque limitato nelle sue capacità, ragion per cui sarebbe destinato principalmente agli sviluppatori che avranno modo di decodificare alcune parti del sistema.
Inoltre la stabilità sembrerebbe piuttosto bassa rispetto allo stesso exploit della console PlayStation 4, e ciò sarebbe dovuto alla natura del bug di essere legato a una condizione di gara, nonché alle mitigazioni e al layout della memoria della console PlayStation 5.
Lo sviluppo potrebbe inoltre abbracciare anche il firmware 4.50 un giorno, basterebbe sostituire i validi offset del gadget 4.50 con in più le diapositive del kernel.
Attualmente incluso
- Ottieni lettura/scrittura arbitraria e può eseguire un server RPC di base per letture/scritture (o un server dump per letture di grandi dimensioni) (devi modificare il proprio indirizzo/porta nel file exploit alle righe 673-677).
- Abilita il menu delle impostazioni di debug (nota: dovrai uscire completamente dalle impostazioni e tornare indietro per vederlo).
- Ottiene i privilegi di root.
Limitazioni
- Questo exploit ottiene la lettura/scrittura, ma non l’esecuzione del codice. Questo perché al momento non è possibile eseguire il dump del codice del kernel per i gadget, poiché le pagine
.text
del kernel sono contrassegnate come eXecute Only Memory (XOM). Il tentativo di leggere i puntatori.text
del kernel andrà in panic. - Come per quanto sopra + l’hypervisor (HV) che applica la protezione da scrittura del kernel, anche questo exploit non può installare patch o hook nello spazio del kernel, il che significa che per il momento nessun codice correlato all’homebrew.
- L’integrità del flusso di controllo (CFI) a grana fine basata su Clang è presente e applicata.
- La prevenzione/esecuzione dell’accesso in modalità supervisore (SMAP/SMEP) non può essere disabilitata a causa dell’alta tensione.
- La primitiva di scrittura è alquanto vincolata, poiché i byte 0x10-0x14 devono essere zero (o un’interfaccia di rete valida).
- La stabilità dell’exploit è attualmente scarsa. Maggiori informazioni su questo di seguito.
- In caso di esecuzione riuscita, uscire dal browser con il pulsante circolare, il pulsante PS va in panic per un motivo attualmente sconosciuto.
Come usare
- Configurare fakedns tramite
dns.conf
per puntaremanuals.playstation.net
all’indirizzo IP del tuo PC. - Eseguire fake dns:
python fakedns.py -c dns.conf
- Eseguire il server HTTPS:
python host.py
- Accedere alle impostazioni di rete avanzate della console PS5 e impostare il DNS primario sull’indirizzo IP del tuo PC e lasciare il secondario su
0.0.0.0
.- A volte il manuale non si carica ancora ed è necessario un riavvio, incerto sul motivo per cui è davvero strano.
- Vai al manuale dell’utente nelle impostazioni e accettare la richiesta del certificato non attendibile.
- Facoltativo: Eseguire gli script del server rpc/dump (nota: indirizzo/porta deve essere sostituito in formato binario in
exploit.js
).
Prossimamente
Riparare i socket per uscire dal browser in modo pulito (priorità top).- Scrivere alcune patch di dati (seconda priorità).
Abilitare le impostazioni di debug.Patch cred per uid0.- Jailbreak con sovrascrittura di cr_prison.
- Migliorare l’affidabilità UAF.
- Migliorare l’affidabilità del socket della vittima (terza priorità).
- Utilizzare un obiettivo di perdita migliore/più coerente rispetto a kqueue.
Utilizzo di RPC e dumping del kernel .data
RPC
RPC è una configurazione molto semplice e limitata.
- Modificare l’indirizzo IP + la porta (se modificato) in
exploit.js
. - Eseguire il server tramite
python rpcserver.py
, consentire alla console PS5 di connettersi al termine dell’exploit. La PS5 invierà l’indirizzo di base del kernel.data
in ASCII e potrai quindi inviare comandi di lettura e scrittura. L’esempio è sotto.
[RPC] Connection from: ('10.0.0.169', 59335)
[RPC] Received kernel .data base: 0x0xffffffff88530000
> r 0xffff81ce0334f000
42 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
> w 0xffff81ce0334f004 0x1337
Wrote qword.
Questa configurazione è un po’ ingannevole e presto sarà implementato un sistema migliore.
Dump
- Modificare l’indirizzo IP + la porta (se modificato) in
exploit.js
. - Commentare il codice RPC in
exploit.js
e decommentare il codice dumper. - Eseguire il server tramite
python dumpserver.py
, consentire alla PS5 di connettersi e avviare il dump al termine dell’exploit. Continuerà a scaricare i dati dalla base del kernel fino a quando non andrà in panic a causa della memoria non mappata. Nota: La lettura è alquanto lenta a circa 200 kbps, quindi potrebbero essere necessari circa 10 minuti per il completamento.
Fasi dell’exploit
Questo exploit funziona in 5 fasi e per la maggior parte segue la stessa strategia di exploit del poc di theflow.
- Attivare l’UAF iniziale su
ip6_pktopts
e fare in modo che due socket puntino agli stessipktopts
/ overlap (master socket <-> overlap spray socket). - Liberare i
pktopts
sul socket principale e simulalo con uno sprayip6_rthdr
contenente una overlaptclass
etichettata. - Passaggio Infoleak. Utilizzare
pktopts
/rthdr
overlap per perdere una kqueue dallo slab 0x200 epktopts
dallo slab 0x100. - Fase di lettura/scrittura arbitraria. Falsare nuovamente i
pktopts
e trovare il socket di overlap per utilizzareIPV6_RTHDR
come primitiva di lettura/scrittura. - Fase di pulizia + patch. Aumentare il refcount sui socket danneggiati per l’uscita dal browser corretta + dati patch per abilitare il menu di debug e patchare ucreds per uid0.
Note di stabilità
La stabilità per questo exploit è di circa il 30% e presenta più potenziali punti di errore. In ordine di probabilità discendente osservata:
- Lo Stage 1 provoca più di un UAF a causa della mancata cattura di uno o più nel reclamo, causando una corruzione latente che provoca il panic qualche tempo dopo.
- Lo Stage 4 trova il socket di sovrapposizione/vittima, ma il pktopts è lo stesso del socket principale, facendo sì che la primitiva “lettura” rilegga semplicemente il puntatore che tenti di leggere invece del contenuto di quel puntatore. Questo ha bisogno di alcuni miglioramenti e deve essere risolto se possibile perché è davvero fastidioso.
- Il tentativo dello Stage 1 di rivendicare l’UAF fallisce e qualcos’altro ruba il puntatore, provocando un panic immediato.
- La perdita di kqueue fallisce e non riesce a trovare un puntatore
.data
del kernel riconosciuto. - Lasciare il browser con mezzi “insoliti” come il pulsante PS, il pulsante di condivisione o il crash del browser, provocherà un panic nel kernel. Ha bisogno di essere indagato.
Appunti di ricerca
- Sulla base di vari test e dumping con la primitiva di lettura, sembra che la PS5 sia tornata alla dimensione della pagina 0x1000 rispetto allo 0x4000 della PS4.
- Sembra anche che su PS5 le pagine adiacenti appartengano raramente allo stesso slab, poiché otterrai dati molto diversi nelle pagine adiacenti. Il layout della memoria sembra più disperso.
- Spesso quando la PS5 va in panic (almeno nel contesto del webkit), ci sarà un output audio terribile poiché il buffer audio viene danneggiato in qualche modo.
- A volte questo danneggiamento dell’audio persiste fino all’avvio successivo, senza sapere perché.
- Simile alla PS4, su PS5 richiederà la pressione manuale del pulsante di accensione sulla console due volte per riavviarsi dopo un panic.
- È normale che la PS5 impieghi un tempo assurdo per riavviarsi dal panic se è isolata da Internet (purtroppo). Aspettati che l’avvio richieda 3-4 minuti.
Download: Source code PS5 4.03 Kernel Exploit
Fonte: twitter.com