[Scena PS4] OrbisSWU, il toolkit per l’aggiornamento della Playstation 4

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).

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 funzioneIdentificatore dell'ordine
Decrypt PUP Header 0xC0184401
Verify Segment (1) 0xC0184402
Verify Segment (2) 0xC0184403
Verify BLS Header0xC010440D
Decrypt Segment 0xC0184404
Decrypt Segment Block0xC0284405

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

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.

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

(Visited 1 times, 1 visits today)

4 commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *