
Un exploit del kernel basato su WebKit e jailbreak per PS5
Questo repository contiene un exploit WebKit ROP della vulnerabilità UMTX race use-after-free (CVE-2024-43102) segnalata da Synacktiv. In pratica è un porting della strategia di exploit di fail0verflow e di flatz. Abusa della UAF per ottenere una mappatura di lettura/scrittura nello stack di un thread del kernel e sfrutta letture e scritture su pipe per stabilire una primitiva di lettura/scrittura arbitraria nel kernel (non proprio ideale). Questa lettura/scrittura viene poi migliorata in una che sfrutta una coppia di socket ipv6 e una coppia di pipe per una lettura/scrittura stabile che può essere passata ai payload nello stesso modo reso possibile dal precedente exploit del kernel PS5 via IPV6.
La pagina stessa è una versione ridotta e modificata di PS5 Exploit Host di idlesauce, dato che aveva già fatto il lavoro di integrare psfree nello stile di codice che usavo in precedenza. Questo host è anche la mia scelta personale per eseguire le cose, perché è molto fluido e integra payload utili; spero venga aggiornato per supportare questo exploit nel prossimo futuro <3.
Alla fine verrà avviato un payload loader in ascolto di ELF di payload sulla porta 9021. Consiglio il PS5 Payload Dev SDK, dato che dovrebbe essere pienamente compatibile con questo loader quando verranno aggiunti gli offset del kernel.
Questa vulnerabilità interessa i firmware dalla 1.00 alla 7.61, tuttavia i FW >= 3.00 sembrano avere mitigazioni aggiuntive che richiedono di adattare l'exploit per funzionare. Dato che sono interessato principalmente ai firmware inferiori, questo exploit non supporta ancora FW >= 3.00. Inoltre, la vulnerabilità WebKit che concateniamo è stata corretta nella 6.00, quindi per questi sistemi sarà necessario un altro exploit WebKit che raggiunga lettura/scrittura in userland. Ripeto, non essendo concentrato sui firmware più recenti, per ora questo aspetto è lasciato incompleto.
Note importanti
I seguenti firmware sono attualmente supportati:
dns.conf per far puntare manuals.playstation.net all'indirizzo IP del tuo PCpython fakedns.py -c dns.confpython host.py0.0.0.0
Per usare il loader ELF, esegui l'exploit fino al completamento. Al termine avvierà un server sulla porta :9021. Collegati e invia il tuo ELF alla PS5 via TCP e lo eseguirà. Questo loader dovrebbe continuare ad accettare ed eseguire payload anche dopo aver chiuso il browser.
Double free iniziale
La strategia di questo exploit deriva in gran parte da fail0verflow e flatz. Vedi il writeup di chris@accessvector per maggiori informazioni sulla vulnerabilità. Una volta sfruttata, ci dà essenzialmente una double free. Possiamo usarla per sovrapporre il vmobject di uno stack del kernel con quello di una mappatura mmap, ottenendo una finestra sullo stack di un thread del kernel. Questa capacità molto potente ci consente di leggere/scrivere puntatori arbitrari del kernel nello stack, sconfiggendo l'ASLR e permettendo di creare primitive. Il thread di cui abbiamo accesso allo stack lo chiameremo thread vittima.
Ottenere lettura/scrittura arbitraria
Creando una pipe e riempiendo il buffer della pipe sul thread principale, poi provando a scriverci usando il thread vittima, il thread vittima si bloccherà in attesa che si liberi spazio nel buffer. Durante questo periodo, possiamo usare la nostra finestra sullo stack del kernel per modificare i puntatori iovec in puntatori del kernel e impostare i flag per farli trattare come indirizzi del kernel. Leggendo quindi la pipe sul thread principale, possiamo ottenere lettura arbitraria del kernel.
Allo stesso modo, facendo leggere la pipe al thread vittima, si bloccherà in attesa di dati in ingresso. Possiamo quindi, di nuovo, sovrascrivere i puntatori iovec e trasformarli in puntatori del kernel, e scrivere dati sul thread principale per ottenere scrittura arbitraria del kernel.
Migliorare la lettura/scrittura arbitraria
A questo punto abbiamo una lettura/scrittura arbitraria senza vincoli reali, ma siamo legati all'uso del multithreading e del blocco per farla funzionare, il che non è ideale. Usiamo quindi la R/W per iterare la tabella FD del processo e sovrapporre i pktopts di due socket IPV6. Possiamo poi creare un'altra lettura/scrittura arbitraria tramite il sockopt IPV6_PKTINFO. Anche questa primitiva di lettura/scrittura non è ideale, però, perché è limitata in dimensione e contenuti a causa dell'opzione socket sottostante. Manteniamo questo passaggio soprattutto per emulare lo scenario dell'exploit IPV6, su cui sono stati costruiti la maggior parte dei payload e simili.
Possiamo ottenere una lettura/scrittura migliore tramite le pipe. Iterando di nuovo la tabella FD del processo e modificando gli oggetti buffer della pipemap, possiamo stabilire lettura/scrittura. La coppia di socket IPV6 viene usata come meccanismo per controllare il buffer della pipemap.
Correggere/aggirare la corruzione
Se lasciamo le cose come stanno e proviamo a chiudere il browser, il sistema andrà in crash. Questo perché la pulizia del processo proverà a liberare lo stack del kernel che è già stato liberato. Per evitarlo, facciamo due cose:
td_kstack del thread vittima nella lista dei thread del processo.Sui FW < 3.00, questo exploit è molto stabile. L'unico punto critico di fallimento è non riuscire a sovrapporre i vmobjects. Sui firmware più recenti, questa sovrapposizione è più difficile da ottenere a causa di presunte mitigazioni a livello di page/heap allocator.
Chi è interessato a contribuire alla ricerca/sviluppo su PS5 può unirsi a un discord che ho configurato qui.