L’ultima implementazione del PoC LibHijacker sembra aver motivato lo sviluppo dell’exploit nel kernel “ipv6 uaf” sulla console PlayStation 5. Questo ha reso possibile l’installazione di file PKG e fPKG sulla console, anche se attualmente non è possibile eseguirli.
I due progetti si distinguono tra loro. Il PoC originale sviluppato da astrelsky impiega Redis come parte del suo processo.
New update from @specterdev
Cex To Dexhttps://t.co/FdKXIdCg7y— Echo Stretch (@StretchEcho) August 26, 2023
Redis è un sistema di memorizzazione e caching dei dati in memoria, e in questo caso specifico viene utilizzato per creare un processo “daemon” separato dallo stack utilizzato sulla console PS5.
Questo processo “daemon” viene generato tramite il server Redis in esecuzione sulla console e viene dedicato all’esecuzione dell’applicazione homebrew.
L’uso di Redis in questo contesto permette di creare un ambiente isolato e separato per l’esecuzione dell’applicazione homebrew, prevenendo qualsiasi interferenza con altri processi o stack di sistema.
L’implementazione sperimentale del WebKit ROP per un exploit nel kernel della console PS5, invece, si basa su IPV6 Use-After-Free (UAF) identificato da TheFlow e segnalato su HackerOne.
La strategia dell’exploit è in gran parte derivata dal PoC BSD/PS4 di TheFlow, ma con alcune modifiche per adattarsi alla complicata struttura della memoria della PS5.
Questo exploit crea una primitiva di lettura arbitraria e scrittura (semi-arbitraria). Tuttavia, le capacità di questo exploit sono limitate e quindi è principalmente indirizzato a sviluppatori interessati a sperimentare l’ingegneria inversa su parti specifiche del sistema.
Grazie agli ultimi miglioramenti in termini di stabilità, l’affidabilità dell’exploit è ora attorno all’80%. L’exploit dovrebbe supportare i seguenti firmware:
- 3.00
- 3.10
- 3.20
- 3.21
- 4.00 (da fare)
- 4.02
- 4.03
- 4.50
- 4.51
Attualmente incluso
- Permette la lettura/scrittura arbitraria e può eseguire un server RPC di base per letture/scritture (o un server di dump per letture di grandi dimensioni) (è necessario modificare il proprio indirizzo/porta nel file di exploit alle righe
673-677
). - Abilita il menu delle impostazioni di debug (nota: dovrai uscire completamente dalle impostazioni e rientrare 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 impone 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).
- Tuttavia, a causa del lavoro più recente che utilizza le pipe, ora è possibile la lettura/scrittura completamente arbitraria.
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(non più necessario).- Fare in modo che il caricatore ELF supporti le rilocazioni.
- Aggiungere il supporto per ulteriori spostamenti e possibilmente un collegamento dinamico completo?
Utilizzo dell’ELF Loader
Per utilizzare l’ELF Loader, l’utente deve eseguire l’exploit fino al completamento. Una volta completato, verrà avviato un server sulla porta :9020
.
L’utente deve connettersi e inviare l’ELF alla PS5 tramite quella porta, dopodiché verrà eseguito. A meno che l’ELF non causi un crash del browser, è possibile continuare ad eseguire ELF in modo continuativo.
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 simularlo con uno sprayip6_rthdr
contenente una overlaptclass
etichettata. - Passaggio di 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.
- Eseguire il server di caricamento ELF che accetterà e caricherà/eseguirà ELF. Attualmente WIP, al momento non supporta i trasferimenti.
Note di stabilità
La stabilità per questo exploit è tra l’80%~90% e presenta due potenziali punti di errore. In ordine di probabilità decrescente osservata:
- Lo Stage 1 non riesce a recuperare l’UAF, causando un arresto anomalo immediato o una corruzione latente che provoca un arresto anomalo..
- Lo Stage 4 non riesce a trovare un socket della vittima.
Appunti di ricerca
Sembra che, in base a vari test e dump con la primitiva di lettura, la PS5 sia tornata a utilizzare una dimensione di pagina di.0x1000
rispetto ai0x4000
della PS4- Tuttavia, dopo ulteriori indagini, la dimensione della pagina è effettivamente ancora
0x4000
. Ciò nonostante, a causa di alcune modifiche apparentemente prive di senso all’allocatore, è possibile assegnare porzioni diverse all’interno della stessa pagina virtuale.
- Tuttavia, dopo ulteriori indagini, la dimensione della pagina è effettivamente ancora
- Inoltre, sembra che su PS5 le pagine adiacenti appartengano raramente alla stessa “slab”, poiché si ottengono dati molto diversi dalle pagine vicine. Il layout della memoria sembra più disperso.
- Spesso, quando la PS5 va in modalità panic (almeno nel contesto di WebKit), si verifica un output audio terribile a causa del danneggiamento del buffer audio in qualche modo.
- In alcuni casi, questa corruzione audio persiste anche dopo il successivo avvio, senza una causa chiara.
- Analogamente a quanto accadeva su PS4, sulla PS5 è necessario premere manualmente il pulsante di accensione sulla console due volte per riavviarla dopo un panico.
- È normale che la PS5 impieghi un tempo notevolmente lungo per riavviarsi in caso di panico se non è connessa a Internet (purtroppo). L’avvio dovrebbe richiedere da 3 a 4 minuti.
Download: Source code PS5 4.03/4.50/4.51 Kernel Exploit
Fonte: twitter.com