Il 28 settembre, Roma ha ospitato la conferenza RomHack, durante la quale abbiamo avuto modo di seguire Andy Nguyen, noto come TheFlow, considerato uno dei principali hacker della scena PlayStation.
In questo discorso TheFlow ha ripercorso la sua esperienza nell’hacking delle console PlayStation, attività che ha iniziato ad appena 16 anni, rilasciando vari jailbreak.
Durante la conferenza, Andy si è concentrato dapprima sull’exploit di vulnerabilità nel protocollo di rete della console PlayStation 4, mostrando come il protocollo IPVS possa essere manipolato per ottenere esecuzione di codice remoto con privilegi del kernel.
Prima di spiegare l’exploit, Andy fornisce un contesto sui sistemi operativi delle PlayStation 4 e PlayStation 5.
La PS4 utilizza un kernel FreeBSD 9 su processore AMD Jaguar, mentre la PS5 usa un kernel FreeBSD 11.1 su AMD Zen 2, con varie mitigazioni di sicurezza come CFI, SMAP, e KLR.
La PS4 manca di molte di queste protezioni, rendendo lo sfruttamento delle vulnerabilità più semplice rispetto alla PS5. Andy conclude con un’analisi di vulnerabilità precedenti trovate nel codice FreeBSD, che a volte Sony non riesce ad aggiornare tempestivamente.
L’hacker TheFlow continua spiegando come trovare vulnerabilità nel kernel FreeBSD, anche cercando commit che correggono bug senza avvisi ufficiali o CVE. Questo approccio potrebbe risultare utile per chi desidera guadagnare attraverso piattaforme come HackerOne.
Nel 2019, Andy ha scoperto una vulnerabilità “use-after-free” nella chiamata di sistema SetoOpt
che, per la mancanza di meccanismi di blocco, può generare una condizione di race tra due thread.
Questo ha permesso di sfruttare il bug per ottenere primitive di lettura e scrittura arbitrarie. In seguito, TheFlow ha descritto una vulnerabilità scoperta nel driver custom di Sony per il filesystem ExFAT, che può essere sfruttata tramite un semplice drive USB malevolo.
La vulnerabilità deriva da un errore di troncamento durante un’allocazione dell’heap, che porta a un overflow e alla corruzione di oggetti adiacenti.
L’exploit nel kernel su PS4 seguono un pattern simile: prima si corrompe un puntatore funzione del kernel per redirigerlo a una ROP chain in userspace, poi si disabilita la write protection tramite un gadget che scrive su CR0.
Infine, si modificano il codice kernel per abilitare permessi come il jailbreaking e si installano syscall fasulle.
TheFlow prosegue spiegando un ulteriore exploit chiamato “kxc”, che permette di eseguire codice nel contesto del kernel saltando al primo argomento fornito. Con questo exploit, è possibile mappare un payload in userspace con capacità di chroot e usare la syscall kxx
per eseguirlo.
In precedenza, la catena degli exploit nel kernel veniva combinata con un exploit userspace, come quelli basati su vulnerabilità di WebKit, BDJ (Blu-ray Disc Java) o safe data.
I bug nel WebKit, spesso presi dal Project Zero, sono semplici da sfruttare e utilizzare per gli utenti, ma il processo è pesantemente sandboxato e non supporta il chroot.
Per BDJ, Andy ha condotto delle ricerche scoprendo che, sfuggendo alla sandbox Java, è possibile ottenere l’esecuzione di codice nativo, rendendo questo vettore di attacco promettente perché indipendente dal firmware e con maggiori privilegi rispetto al WebKit.
Tuttavia, richiede un masterizzatore Blu-ray e molte unità disco delle PS4 sono difettose, riducendo l’accessibilità dell’exploit. Inoltre, gli escape dalla sandbox Java sono stati corretti nelle ultime versioni del firmware.
Gli exploit basati su “safe data” hanno il vantaggio di essere in alcuni casi non patchabili, poiché si può evitare di installare aggiornamenti sui dischi fisici. Tuttavia, è necessario avere una console già hackerata per installare i file di salvataggio modificati.
TheFlow prosegue descrivendo l’exploit “BleedingTooth” rilasciato anni fa per il Bluetooth, e discute la funzionalità del Remote Play, che purtroppo è utilizzabile solo nelle versioni più recenti del firmware, rendendo un exploit in questo ambito poco interessante poiché rapidamente patchabile.
Per quanto riguarda lo stack TCP/IP, non ha trovato vulnerabilità sfruttabili sulla PlayStation 4, nonostante alcune segnalazioni per FreeBSD.
Indagando più a fondo nel kernel della PlayStation 4, Andy nota stringhe interessanti relative a PPPoE, un protocollo che permette l’accesso a Internet su reti DSL, utilizzato anche dalla console.
Il protocollo PPPoE prevede tre fasi: Discovery, Session, e Termination, e Andy inizia a esaminare il codice per capire se Sony ha aggiunto modifiche al codice originario di NetBSD.
Dopo solo cinque minuti di reverse engineering, Andy scopre un bug nel protocollo di controllo del link (LCP). Il problema risiede nel fatto che la funzione copia le opzioni TLV con una lunghezza arbitraria di 8 bit senza controllare se il buffer sia abbastanza grande, provocando un overflow del buffer heap.
Inizialmente entusiasta, Andy si rende conto che questo bug era già stato corretto nel codice Upstream di NetBSD nel 2006, smorzando la sua aspettativa di ottenere un nuovo CVE.
Durante i test per attivare il bug, Andy osserva un comportamento anomalo: il pacchetto contenente le opzioni rifiutate presenta stringhe che somigliano a puntatori, cosa che non dovrebbe accadere in quella parte della memoria riservata esclusivamente ai dati di rete e socket.
Andy prosegue spiegando che, inaspettatamente, un puntatore del kernel viene inviato attraverso la rete per design. Analizzando i pacchetti ricevuti con Scapy, Andy scopre un tag PPPoE chiamato “host unique” che contiene un puntatore del kernel come identificatore univoco del client.
Questo puntatore fa riferimento all’oggetto dell’interfaccia PPPoE. Anche se questo bug di leak delle informazioni è stato corretto nel codice upstream nel 2018, non è stato emesso alcun avviso ufficiale, quindi la PS4 rimane vulnerabile.
Sebbene il puntatore trapelato sia allocato sull’heap e non possa essere utilizzato per bypassare KASLR (Kernel Address Space Layout Randomization), risulta comunque utile per l’exploit.
Il puntatore fa riferimento alla struttura pppoe_softc, che contiene campi interessanti come l’indirizzo MAC, l’ID di sessione e alcuni buffer controllabili dall’attaccante.
Utilizzando queste informazioni, si può pianificare un attacco con letture arbitrarie e la scrittura di dati controllabili.
Nel corso dell’exploit, durante la fase di scoperta del protocollo, un pacchetto di iniziazione inviato dalla PS4 permette di ottenere un leak delle informazioni, mentre alla fine di questa fase si può inviare una richiesta di configurazione LCP per scatenare una corruzione della memoria.
Entrambi i bug sono semplici da attivare, ma per sfruttarli appieno è necessario trovare una struttura di rete adatta a essere corrotta, con l’obiettivo di ottenere il controllo su letture e scritture arbitrarie, o addirittura il controllo dell’instruction pointer (RIP).
A questo scopo, Andy suggerisce di cercare strutture allocate nel network stack tramite malloc o funzioni simili, oltre a trovare un modo per bypassare KASLR e costruire ROP chains.
Andy spiega poi come, per bypassare KASLR (Kernel Address Space Layout Randomization), sia necessario sfruttare vulnerabilità nel network stack della PS4, concentrandosi su vulnerabilità che potrebbero permettere di ottenere informazioni preziose, come puntatori, senza dover riavviare la console in caso di errore.
Dopo aver abbandonato l’idea di corrompere la struttura degli IPv6 fragment, Andy si è concentrato sul protocollo di IPv6 Neighbor Discovery, simile al protocollo ARP per IPv4, che serve a determinare gli indirizzi MAC degli host IPv6 sulla stessa rete.
Scopre che la cache degli indirizzi IPv6 non ha limiti di dimensione, permettendo a un attaccante di inondarla con numerosi indirizzi IP falsi, creando una heap spray.
Ogni indirizzo IP falso viene memorizzato in una lista collegata, con l’indice della lista basato su 6 byte dell’indirizzo IP.
Questo approccio permette di allocare un gran numero di voci nella cache, rendendo più semplice pianificare un attacco per manipolare il kernel o ottenere un leak di informazioni.
Andy continua spiegando la strategia per sfruttare la cache IPv6 per bypassare KASLR sulla PS4. Utilizzando indirizzi IP IPv6 come 1.1.1.1, gli attaccanti possono forzare l’inserimento di più voci nella stessa lista collegata.
Ogni voce nella cache segue una macchina a stati ben definita, con cinque possibili stati, tra cui lo stato “incomplete”, che attiva un ciclo di neighbor solicitation per richiedere l’indirizzo MAC del peer.
Durante questo processo, quando una macchina non conosce l’indirizzo MAC di un peer, invia un pacchetto di richiesta (neighbor solicitation) e il peer risponde con un pacchetto neighbor advertisement contenente il proprio indirizzo MAC.
L’idea di Andy è quella di inviare molti pacchetti con diversi indirizzi sorgente IPv6, innescando numerose allocazioni di oggetti llentry nella cache del target (PS4).
Quando la PS4 invia i pacchetti di solicitation, l’attaccante risponde con pacchetti di advertisement, mantenendo le voci nella cache in uno stato di reachable per 24 ore.
Una volta che le voci sono state allocate nella cache, Andy sovrascrive un oggetto llentry, cambiando il suo stato da reachable a incomplete e memorizzando un uff fittizio che verrà inviato in seguito.
Inviando pacchetti neighbor advertisement per tutti gli indirizzi, si aspetta che per llentry modificato, la PS4 risponda in modo diverso, rivelando così preziose informazioni per l’exploit.
TheFlow descrive poi il metodo finale per bypassare il KASLR (Kernel Address Space Layout Randomization) sulla PS4 sfruttando il protocollo di IPv6 Neighbor Discovery.
Il processo inizia con l’invio di numerosi pacchetti con indirizzi sorgente IPv6 diversi, forzando l’allocazione di molte voci di cache llentry nella PS4. Queste voci sono necessarie per memorizzare l’indirizzo MAC corrispondente agli indirizzi IP IPv6 sconosciuti.
Successivamente, Andy modifica una voce della cache, cambiandone lo stato da reachable a incomplete e corrompendo il puntatore ifp (interface pointer).
Quando la PS4 riceve una richiesta di ICMP Echo per gli indirizzi IPv6 non corrotti, risponde normalmente. Tuttavia, per llentry corrotta, la PS4 invia un pacchetto di Neighbor Solicitation, che include dati trapelati come l’indirizzo MAC.
La chiave del bypass è manipolare il puntatore ifp in modo che punti alla struttura pppoe softc. L’attaccante riesce a far sì che la PS4 utilizzi il campo SC AC cookie di questa struttura per recuperare un oggetto creato dall’attaccante.
Il campo if address, contenente l’indirizzo MAC, punta a dati controllati, permettendo di fare trapelare informazioni critiche. Usando questo approccio, Andy riesce a bypassare KASLR e ottenere il controllo necessario per ulteriori exploit.
Andy spiega poi come sfruttare il puntatore del segmento dati ottenuto durante la fuga di informazioni per ottenere il controllo del RIP (Instruction Pointer) ed eseguire codice arbitrario attraverso una catena di gadget.
Il processo inizia con la corruzione della voce llentry, da cui riceviamo un pacchetto di Neighbor Solicitation contenente il puntatore del segmento dati. Questo puntatore viene utilizzato per calcolare l’offset necessario per aggirare il KASLR.
Nel diagramma illustrato, vediamo come il puntatore next dell’oggetto llentry corrotto punti alla struttura pppoe softc, ora aggiornata con un nuovo indirizzo MAC e un nuovo session ID.
Una volta costruito un oggetto llentry fasullo, il puntatore della tabella L (LLE table pointer) viene reindirizzato per controllare completamente l’oggetto.
Quando l’oggetto llentry viene liberato, la funzione di liberazione viene invocata e, tramite gadget specifici, Andy riesce a eseguire una stack pivot verso una catena di gadget (ROP chain) situata nella memoria.
Questo processo consiste in due fasi: la prima copia la ROP secondaria nello stack originale e la seconda disabilita la protezione in scrittura, consente l’allocazione di una pagina eseguibile, copia il payload di fase uno e infine salta a quel payload.
Il payload di fase uno ha delle limitazioni di dimensione, ma è sufficiente per ripristinare lo stato del sistema.
Dopo aver creato un processo in ascolto per il payload di fase due (che può essere di qualsiasi dimensione), Andy ripristina il puntatore dello stack e completa la funzione timer per garantire la continuazione del processo.
Con questo, il sistema riprende a funzionare normalmente, come se nulla fosse accaduto.
Andy conclude il suo intervento spiegando che l’exploit funziona molto bene e che la comunità ha contribuito con numerosi pull request per aggiungere supporto a tutte le versioni del firmware.
È interessante notare che l’exploit può essere attivato all’avvio della console, poiché la PlayStation stabilisce una connessione con i server Sony. Andy menziona anche che un gruppo cinese ha preso il suo lavoro e ha creato un dongle JBre venduto a 30 dollari.
Dopo il suo discorso, ci sono alcune domande dal pubblico. Alla domanda provocatoria su quanto tempo ci vorrà per giocare a giochi di backup su PS5, Andy risponde di non aver giocato a nessun gioco e di aver hackerato la console solo per divertimento.
Un’altra domanda riguarda le risorse per entrare nel mondo dell’hacking delle console. Andy consiglia di consultare vari write-up disponibili, come quelli di SpecterDev, e le sue stesse presentazioni sulla PlayStation. Si offre anche di condividere risorse tramite un tweet.
Fonte: x.com