Il developer SpecterDev ha pubblicato il suo nuovo kernel exploit per il firmware 4.05 della PlayStation 4, sviluppato anche grazie alla documentazione resa dal team Fail0verflow.
In questo progetto è possibile trovare un’implementazione completa del kernel exploit namedobj
per PlayStation 4 sul firmware 4.05.
Hope everyone had a Merry Christmas! Here's the 4.05 kernel exploit, fully implemented. Enjoy! Write-up coming soon! https://t.co/MQR0lzCu9Y
— Specter (@SpecterDev) December 27, 2017
Il bug
Il bug è essenzialmente di tipo type confusion
con il campo ‘kind’ dell’oggetto ‘id_entry’ utilizzato negli oggetti denominati. Gli oggetti denominati sono oggetti che dispongono di proprietà associate (ad esempio un nome per come lo si potrebbe immaginare), che punta all’oggetto reale nell’heap. Specificando un type 0x5000 per l’oggetto, è possibile causare una type confusion.
Ora è necessario trovare un’altra area del kernel che può eccedere per corrompere l’oggetto. Fortunatamente c’è sys_mdbg_service()
.
Questo ci permetterà di sovrascrivere i 32 bit più bassi di un puntatore free()
con sys_namedobj_delete()
.
Da qui noi possiamo andare a creare una situazione use-after-free
che è possibile utilizzare per ottenere l’esecuzione di codice spruzzando oggetti falsi nel mucchio e corrompendo un puntatore di funzione.
I've also uploaded a test payload you can use after the kernel exploit runs that jailbreaks and patches the kernel to allow access to debug settings, just needs to be netcatted to the loader via port 9020. https://t.co/70UMwgTQ7o
— Specter (@SpecterDev) December 27, 2017
Strategia
Una buona strategia per sfruttare questo bug è la seguente:
- Perdere un oggetto di destinazione dal mucchio del kernel che non solo dispone di puntatori di funzioni che possono essere danneggiati, ma è anche ideale per evitare che si blocchi il kernel.
- Creare
type confusion
tramitesys_namedobj_create()
con il flag 0x5000 (o flag 0x4000 a causa della bit OR). - Impostare un kernel ROP chain in userland. Idealmente in questa ROP chain si desidera disattivare la protezione di scrittura del kernel, eseguire le patch desiderate (come la mappatura di memoria RWX) e pivot per tornare in maniera efficace.
- Sovrascrivere i 32 bit più bassi nell’oggetto con
sys_mdbg_service()
con i 32 bit inferiori dell’indirizzo dell’oggetto target. Non possiamo sovrascrivere i 32 bit superiori, ma fortunatamente il puntatore memorizzato in precedenza era comunque un puntatore di heap, quindi i 32 bit superiori verranno impostati sul prefisso dell’indirizzo heap di FreeBSD (0xFFFFYYYYxxxxxxxx dove YYYY viene randomizzato da ASLR all’avvio). - Attivare
free()
tramitesys_namedobj_delete()
. - Spruzzare l’oggetto falso sull’heap con un puntatore di funzione che indica il kROP chain creato in precedenza.
- Trova una funzione che utilizza l’oggetto corrotto e attiva il puntatore funzione da leggere.
- Ora hai l’esecuzione di codice e la tua catena kROP sta funzionando in ring0! Sìì!
- Correggere l’oggetto
free()
, perché se non lo fai, appena il webkit esce, il kernel si blocca perché cercheràfree()
al tuo oggetto e di portare a un doppiofree()
. - Ritorno in userland con successo.
Patch incluse
Le seguenti patch vengono create di default nella catena del kernel ROP:
- Disabilita la protezione da scrittura del kernel.
- Permette il mapping della memoria RWX (read-write-execute).
- Risoluzione dinamica (sys_dynlib_dlsym) consentita da qualsiasi processo.
- Chiamata di sistema personalizzata #11 (
kexec ()
) per eseguire codice arbitrario in modalità kernel. - Consenti agli utenti non privilegiati di chiamare
setuid(0)
correttamente. Funziona come controllo di stato, raddoppiato come escalation di privilegi.
Note
- Questo exploit si dimostra incredibilmente stabile intorno al 95%. L’exploit nel webKit si blocca molto raramente e lo stesso vale per il kernel.
- Ho creato una patch in modo che il kernel venga eseguito una volta sola sul sistema, è ancora possibile creare patch aggiuntive tramite payload.
- Viene aggiunta una syscall personalizzata (# 11) per eseguire qualsiasi memoria RWX in modalità kernel, che può essere utilizzata per eseguire payload utile per poter eseguire operazioni come jailbreaking e patch del kernel.
- Non viene fornito alcun SDK in questa versione, tuttavia uno barebone per iniziare con una data successiva.
Download: Kernel Exploit 4.05
Se non riuscite a impostare un vostro server web sul PC potrete scegliere di visitare dal browser web della PlayStation 4 la pagina http://www.sprx.solutions/PS4/, il link ci è stato offerto dall’utente Skillsofcape su twitter.