Il developer TheoryWrong ha pubblicato il suo primo articolo inerente la scena hack della PlayStation 4 e PlayStation 4 Pro, ferma ormai da diverso tempo sul firmware 5.05.
L’articolo parla di OrbisSWU, un toolkit che permette di gestire il sistema di aggiornamento della console PlayStation 4 e di due casi specifici, l’aggiornamento della console con lettore Blu-ray rotto e l’installazione di un firmware inferiore a quello montato sulla console (downgrade del firmware).
https://twitter.com/TheoryWrong/status/1267218027336142849
OrbisSWU
OrbisSWU è una speciale applicazione memorizzata in tutti i file PUP della PlayStation 4. Permette di eseguire l’aggiornamento del firmware della console. Attraversa ogni cosa, il kernel, le applicazioni, il lettore Blu-ray e il chipset WiFi/Bluetooth.
Tutto inizia in SceShellUI, quando la console richiede di eseguire un aggiornamento, inizia ripristinandolo in una cartella specifica. Fortunatamente, SceShellUI è un’applicazione che in realtà carica un file .exe
(sì, proprio un file eseguibile) con codice C# basato su Mono. Questa libreria si chiama app.exe.sprx
.
Basterà recuperare questa libreria dal server FTP di xVortex (che ha la particolarità di decifrare gli eseguibili dalla PS4 a ELF). Quindi estrarre l’eseguibile di Windows.
Vista esadecimale della libreria PS4 contenente l’eseguibile
DoUpdateJob.cs in app.exe.sprx
SceShellUI andrà a copiare il file PUP nello spazio /update/PS4UPDATE.PUP
ed estrarrà orbis_swu.elf
. Quindi, verrà eseguito un riavvio in modalità di aggiornamento.
Durante l’avvio, il mini-syscore (processo 1 dopo aver caricato il kernel) verificherà in quale modalità dovrebbe essere caricato.
Il mini-syscore controlla quale modalità deve essere caricata all’avvio della console, qui la modalità “update”
Una volta avviata la modalità di aggiornamento, l’eseguibile orbis_swu.self
precedentemente estratto verrà eseguito dalla console mediante la funzione sc_spawn
.
Lancio di orbis_swu.self dal mini-syscore utilizzando la modalità di aggiornamento
Durante la sua esecuzione, il file PUP verrà completamente decrittografato. I file PUP sono file di aggiornamento costituiti da “BLOB”, parti crittografate, a volte compresse che verranno decifrate una ad una da SAMU (il processore di sicurezza della Playstation 4).
Un elenco di BLOB per Firmware 5.05, qui la firma è in md5 e corrisponde alla versione crittografata. Il contenuto dei file viene decrittografato.
I BLOB tra loro formano diversi tipi di file, ecco un (piccolo) elenco di file che possiamo trovare al suo interno:
1, ???, /dev/sflash0s0x32b
2, ???, /dev/sflash0s0x33
3, ???, /dev/sflash0s0x38
3, ???, wlan_firmware.bin
4, ???, /dev/sflash0s1.cryptx2b
5, secure_modules.bin, /dev/sflash0s1.cryptx3b
6, system.img, /dev/da0x4b.crypt
7, ???, /dev/da0x2
8, eap.img, /dev/da0x3.crypt
9, recovery.img, /dev/da0x0.crypt
10, /dev/sflash0s1.cryptx40
11, /dev/da0x1.crypt
11, preinst.img
12, system_ex.img, /dev/da0x5b.crypt
13, /dev/sflash0s0x32b
14, /dev/sflash0s0x33
Per decrittografare il file PUP, la PlayStation 4 utilizzerà un elenco di comandi (ioctl) per il “device” /dev/pup_update0:
Nome della funzione | Identificatore dell'ordine |
Decrypt PUP Header | 0xC0184401 |
Verify Segment (1) | 0xC0184402 |
Verify Segment (2) | 0xC0184403 |
Verify BLS Header | 0xC010440D |
Decrypt Segment | 0xC0184404 |
Decrypt Segment Block | 0xC0284405 |
Va notato che SAMU (Security Coprocessor) rifiuta di decrittografare i file PUP di una versione precedente alla versione corrente, è uno dei meccanismi di sicurezza che rileva i tentativi di downgrade.
Una volta decodificati i brani, Orbis_SWU utilizzerà funzioni specializzate per aggiornare le diverse parti della console, come il lettore BlueRay, il chipset Wifi/Bluetooth, ecc..
Una piccola parte delle funzioni di orbis_swu.self
Avvio dell’aggiornamento al di fuori della modalità di aggiornamento
È possibile avviare l’utility di aggiornamento senza mettere la console in modalità di aggiornamento, può aggiornare anche i componenti della PlayStation 4. Per fare questo, avrete bisogno di un exploit del kernel, Le H(omebrew) EN(abler) e il file make_fself.py
di Flat_Z.
L’idea è che attraverso un “host” homebrew, avremo la possibilità di eseguire un file orbis_swu.self
modificato che farà tutto ciò che vogliamo. Basta utilizzare la funzione sceSystemServiceLoadExec(char* path, void* unk);
La modifica di orbis_swu
dovrà applicare 2 patch per renderlo utilizzabile con un’applicazione host.
- Modifica dell’output video:
orbis_swu
viene normalmente utilizzato in un contesto in cui SceShellUI non esiste. Dobbiamo ora dirgli che deve prendere l’uscita delle Applicazioni. - Dagli permessi: come ogni processo di sistema,
orbis_swu
deve essere in grado di accedere a determinate cose. Sarà quindi necessario concedergli autorizzazioni speciali e farlo uscire dalla sua sandbox attraverso una chiamata di sistema, è anche necessario patchare il kernel per poter avere accesso allo sflash per iscritto.
Modifica di “start” per eseguire un syscall (qui 67) che eliminerà semplicemente la sandbox dall’applicazione.
Qui, il registro ESI (Argomento 2) deve essere impostato su 0 per impostarlo su MAIN
Una volta fatto questo, l’applicazione homebrew sarà pronta per utilizzare orbis_swu
ed eseguire gli aggiornamenti. Ora è quando le cose iniziano a diventare interessanti!
Orbis_swu.self è stato avviato senza la presenza di un aggiornamento.
Caso 1: Aggiornare una PS4 senza lettore Blu-ray
Il primo possibile utilizzo di questo strumento, è quello di introdurre l’aggiornamento delle console senza il lettore Blu-ray (o con lettore Blu-ray non funzionante).
BdWriter::checkDeviceExist -1PupReader::checkSegmentUpdate initialize failed: 0x801809a8 PupReader::Estimate::2019 checkSegmentUpdate failed: 0x801809a8 [ERROR]sceUpdaterVerifySign() failed : 801809a8
Qui possiamo vedere che l’aggiornamento è impossibile perché la funzione BdWriter::checkDeviceExistnon
riesce a trovare il lettore Blu-ray. Basterebbe modificare questa funzione per avviare un aggiornamento a un firmware superiore.
La posizione della visualizzazione dell’errore
La patch è molto semplice, sarà sufficiente modificare le istruzioni per restituire l’errore con un xor ebx, ebx
invece di amov eax, ebx
.
Le istruzioni per modificare
[stextbox id=’warning’]Attenzione: L’aggiornamento della PlayStation 4 senza un lettore Blu-ray non è priva di rischi senza un backup del disco rigido, non sarà più possibile utilizzare gli strumenti di ripristino (Soft Brick). Sarà sempre possibile aggiungere un lettore Blu-ray per sbloccare la situazione.[/stextbox]
Aggiornamento PS4 senza essere in modalità aggiornamento
Caso 2: Tentativo di downgrade
Anche se può sembrare fantasioso provare ad eseguire il downgrade nel modo più semplice possibile, è ancora necessario che questo processo richiami Modoru, il downgrade della PlayStation Vita del developer TheFlow che esegue il suo modulo di aggiornamento per eseguire il downgrade con una versione modificata.
Qui l’idea è semplice, se la console PlayStation 4 non è in grado di decrittografare i BLOB del file PUP precedenti alla sua versione, li decifreremo per lui. L’attacco è semplice, agganceremo la syscall dedicata a ioctl
e intercetteremo le chiamate fatte al “device” di decrittazione quindi:
- Crea una firma MD5 della versione crittografata.
- Trova la versione decifrata in una chiave USB.
- Restituisce la versione decrittografata senza usare SAMU.
Il gancio syscall “Ioctl” sta collegando funzioni utili
Questo sorprendentemente ha funzionato, e la console PlayStation 4 ha accettato l’aggiornamento.
Come previsto, vengono utilizzati i file pre-decodificati. | Il downgrade è in corso |
Tuttavia, ad un certo punto del downgrade appare un errore a livello di Switch Bank che annulla l’aggiornamento e ritorna alla versione corrente (il banco di backup).
Dopo l’analisi di SFLASH, è possibile notare che i valori sono tutti ugualmente cambiati, come la anche la sua versione.
Fonte
Fonte articolo originale: https://theorywrong.me/?p=88
- Payload Kernel basato sul lavoro di Golden: https://github.com/jogolden/ps4-ksdk
- IDC ps4_pup_unpack: https://github.com/idc/ps4-pup_unpack/
- TheUpdaterToolkit: https://github.com/theorywrong/TheUpdaterToolkit/
- Zecoxao e LightningMods per il loro aiuto e la loro partecipazione alla ricerca è nello sviluppo del PoC.
Ancora non ho capito cosa ci fa un eseguibile Windows all’interno di una libreria Unix FreeBSD..
Quindi è possibile o no il downgrade?
In linea teorica si, ma per poterlo eseguire bisogna sempre partire da un exploit
Quindi da 7.02 ofw ancora niente. Grazie per l’informazione