
Intel Management Engine JTAG Prova di concetto
Tutte le informazioni sono fornite esclusivamente a scopo didattico. Segui queste istruzioni a tuo rischio e pericolo. Né gli autori né il loro datore di lavoro sono responsabili di eventuali danni diretti o consequenziali o perdite derivanti da qualsiasi persona o organizzazione che agisca o ometta di agire sulla base delle informazioni contenute in questa pagina.
Introduzione
Software Richiesto
Generazione del Payload
Generazione del Token di Sblocco
Preparazione dell'Immagine SPI Flash
Integrazione dei File nell'Immagine del Firmware
Disattivazione della Firma OEM
Creazione dell'Immagine del Firmware
Avvio della CPU Principale
Scrittura dell'Immagine sulla SPI Flash
Preparazione del Cavo di Debug USB
Applicazione di Patch ai File di Configurazione di OpenIPC
Decrittazione dei File di Configurazione di OpenIPC
Aggiunta del Core LMT alla Configurazione
Impostazione della Variabile d'Ambiente IPC_PATH
Verifica Iniziale del Funzionamento del JTAG
Visualizzazione del Thread ME della CPU
Arresto dei Core
Debug di ME: Avvio Rapido
Lettura di Memoria Arbitraria
Lettura della ROM
Perché TXE?
Elenco delle Piattaforme Testate
Autori
Licenza
La vulnerabilità INTEL-SA-00086 consente di attivare il JTAG per il core Intel Management Engine. Abbiamo sviluppato la nostra PoC JTAG per la piattaforma Gigabyte Brix GP-BPCE-3350C. Sebbene consigliamo agli aspiranti ricercatori di utilizzare la stessa piattaforma, anche le piattaforme di altri produttori basate sul chipset Intel Apollo Lake dovrebbero supportare la PoC (per la versione TXE 3.0.1.1107).
La vulnerabilità INTEL-SA-00086 comporta un buffer overflow durante la gestione di un file archiviato su MFS (il file system interno di ME). Il percorso completo del file è /home/bup/ct. Dovrai integrarlo nel firmware di ME utilizzando Intel Flash Image Tool (FIT), uno degli Intel System Tools forniti da Intel agli OEM di hardware basato su chipset Intel PCH. Ecco la struttura della directory root del pacchetto Intel System Tools:

Le utility Intel ME (TXE, SPS) System Tools non sono destinate agli utenti finali—quindi non è possibile trovarle sul sito web ufficiale di Intel. Tuttavia, alcuni OEM le pubblicano come parte degli aggiornamenti software insieme ai driver di periferica. Quindi, per integrare la nostra PoC è necessario Intel TXE System Tools versione 3.x, che può essere trovato online.
È necessario installare Intel System Studio, la cui versione di prova può essere scaricata dal sito di Intel. Nei nostri esperimenti abbiamo utilizzato Intel System Studio 2018.
La PoC prende di mira il firmware Intel TXE versione 3.0.1.1107. L'immagine SPI Flash per Gigabyte GB-BPCE-3350C versione F5 contiene la versione necessaria del firmware.
Tutti i nostri script sono scritti in Python. Consigliamo di utilizzare Python 2.7 Inoltre gli script richiedono il pacchetto pycrypto. Per installare pycrypto, esegui il seguente comando:
pip install pycrypto
Questa utility è necessaria solo se devi avviare la CPU.
EFI Human Interface Infrastructure (HII) è un meccanismo speciale per creare un'interfaccia utente nell'UEFI, oltre che per elaborare e gestire l'input dell'utente. EFI HII identifica i valori predefiniti per tutte le opzioni, incluse quelle nascoste. Una volta trovata l'opzione relativa a DCI, è possibile attivarla per la configurazione predefinita e DCI può essere abilitato ripristinando le impostazioni di fabbrica del BIOS. Per avviare la CPU principale è necessario AMI BIOS Configuration Program versione 5.xx, che può essere trovato anch'esso online.
Esegui lo script me_exp_bxtp.py:
me_exp_bxtp.py -f <file_name>
Lo script genera i dati necessari e li esporta nel file specificato (indica il percorso completo del file oppure, nella directory corrente, semplicemente un nome, ct.bin per impostazione predefinita). Questo file verrà utilizzato in seguito da FIT.
Esegui lo script me_utok_bxtp.py:
me_utok_bxtp.py -f <file_name>
Lo script genera i dati necessari e li esporta nel file specificato (indica il percorso completo del file oppure, nella directory corrente, semplicemente un nome, utok.bin per impostazione predefinita). Questo file verrà utilizzato in seguito da FIT.
Salta questo passaggio se non devi avviare la CPU.
Per attivare l'opzione DCI Enable, esegui l'utility AMIBCP e usala per aprire l'immagine del firmware SPI fornita con la tua piattaforma. Per la Gigabyte Brix GP-BPCE-3350C, apri il file scaricato dal link Gigabyte indicato sopra (percorso del file immagine nell'archivio: F5/image.bin).

Ora dobbiamo abilitare l'opzione HDCIEN nella scheda Setup Configuration.
Per integrare i file ct.bin e utok.bin, esegui l'utility FIT (fit.exe) e usala per aprire l'immagine del firmware SPI.

Se stai utilizzando un'altra piattaforma hardware e non hai accesso a TXE 3.0.1.1107, puoi scaricare un'immagine SPI Flash per Gigabyte GB-BPCE-3350C versione F5 ed estrarre la sezione TXE tramite FIT. FIT estrae diverse sezioni dell'immagine SPI complessiva (SPI descriptor, firmware UEFI/BIOS, firmware Intel ME e Unlock Token) quando l'immagine viene aperta e le salva nella cartella *"image_name"/Decomp *.

Quindi puoi trovare il file con il firmware Intel TXE necessario in /Decomp/TXE Region.bin Successivamente, in FIT, apri l'immagine SPI per la tua piattaforma specifica e sostituisci il file contenente il firmware Intel TXE con la versione ottenuta dall'immagine GB Brix 3350c ("Intel(R) TXE Binary File" nella scheda Flash Layout):

Ora dobbiamo indicare in FIT i file che abbiamo generato per /home/bup/ct e Unlock Token. Nella scheda Debug di FIT, puoi specificare il Trace Hub Binary e l'Unlock Token da integrare nel firmware. Questi dovrebbero essere i file che abbiamo già generato.

È sufficiente rimuovere il campo OEM Public Key Hash da FIT:

Crea l'immagine selezionando Build Image nel menu Build.

Ignora il messaggio relativo alle impostazioni BootGuard (fai clic su "Yes"):

Se tutto è stato eseguito correttamente fino a questo punto, il processo di build dovrebbe avere successo e FIT produrrà un messaggio di console simile al seguente:

Salta questo passaggio se non devi avviare la CPU.
Per avviare la CPU è necessario attivare la modalità HAP. Il bit 0 del byte all'offset +0x102 deve essere impostato:

Per scrivere l'immagine sulla SPI flash, consigliamo vivamente di utilizzare un programmatore SPI.
Assicurati di eseguire il backup del firmware originale così da poterlo ripristinare se qualcosa va storto!
Dovrai procurarti un cavo di debug USB 3.0 per collegarti alla piattaforma. Puoi acquistarne uno appositamente realizzato per questo scopo oppure costruirne uno tuo partendo da un cavo USB 3.0 AM–AM isolando i contatti D+, D- e Vcc.

Intel sviluppa e fornisce agli utenti due pacchetti software che possono essere utilizzati per il debug JTAG delle piattaforme e della CPU principale: DAL (DFx Abstraction Layer) e OpenIPC. Sia DAL che OpenIPC fanno parte di Intel System Studio. Dopo l'installazione di Intel System Studio 2018, OpenIPC compare nella seguente directory:
Windows
C:\Intel\OpenIPC_1.1740.2381.100
Linux
/opt/intel/system_studio_2018/system_debugger_2018/debugger/openipc
La configurazione di OpenIPC è crittografata e non supporta il core TXE. Quindi decritta la configurazione e aggiungi una descrizione TXE.
Per decrittare i file di configurazione, estrai la chiave dalla libreria StructuredData (linux: libStructuredData_x64.so, Windows: StructuredData_x64.dll) in OpenIPC/Bin utilizzando lo script IDA Pro openipc_key_extract.py. Passa la chiave (nel nostro caso, 4504fb02be0a9c4c84df2a89cf508bc3) allo script config_decryptor.py con il percorso della directory OpenIPC.
config_decryptor.py –k 4504fb02be0a9c4c84df2a89cf508bc3 –p C:\Intel\OpenIPC
La versione fornita di OpenIPC non contiene le informazioni necessarie sul core TXE. Quindi dobbiamo applicare una patch (patch.diff) ai file di configurazione OpenIPC decrittati. Ecco come fare:
patch -p2 < patch.diff
Dopo la decrittazione e l'applicazione della patch, imposta la variabile d'ambiente IPC_PATH sulla nuova directory di OpenIPC in modo che ipccli utilizzi la versione modificata di OpenIPC. Per esempio:
Windows
set IPC_PATH=c:\Intel\OpenIPC\Bin
L'activator blocca il caricamento successivo mantenendo il processo BUP in un loop dopo l'attivazione del JTAG. Dopo l'avvio, la piattaforma non mostrerà alcun segno di vita (il monitor non si accende, gli indicatori della tastiera non si illuminano e non viene emesso alcun suono di POST del BIOS). Quindi dovrai verificare tramite il debug DCI che la piattaforma si sia "bloccata" nel modulo BUP.
Come DAL, la libreria OpenIPC include un'interfaccia a riga di comando (CLI), scritta in Python e fornita come libreria Python come parte di Intel System Studio, che può essere installata sul sistema con l'aiuto di pip. Il pacchetto di installazione per ipccli si trova al seguente percorso: Windows
<Program Files(x86)>\IntelSWTools\system_debugger_2018\debugger\ipccli\ ipccli-1.1740.544.100-py2.py3-none-any.whl
Linux
/opt/intel/system_studio_2018/system_debugger_2018/debugger/ipccli/ipccli-1.1811.727.100-py2.py3-none-any.whl
Per installare ipccli, esegui il seguente comando console:
pip install ipccli-1.1740.544.100-py2.py3-none-any.whl
Una volta installato, ipccli è disponibile nell'ambiente di esecuzione della versione di Python corrispondente (quella da cui è stato invocato pip). Per iniziare a lavorare con OpenIPC, esegui i seguenti comandi nella console Python:
import ipccli
ipc = ipccli.baseaccess()
Viene avviato il meccanismo di connessione alla piattaforma di destinazione tramite DCI, con il seguente output di console:

Quando non viene stabilita alcuna connessione—ad esempio, se la piattaforma non è alimentata o non è fisicamente collegata tramite DCI—i messaggi saranno simili ai seguenti:

Se la connessione DCI ha successo, assicurati che il registro PERSONALITY del dispositivo DFX_AGGRAGATOR sia uguale a 3. Il registro PERSONALITY ha un codice IR (Instruction Register) di 0x54. Per leggerlo, esegui i seguenti comandi:
dfx_agg = ipc.devs.mdu_dfx_agg_tap0
ipc.irdrscan(dfx_agg, 0x54, 32)
Ecco come dovrebbe apparire il risultato di quel comando:

L'utility ipccli è fornita con una documentazione HTML piuttosto dettagliata, che può essere trovata in una cartella del pacchetto Python ipccli:
<Python Dir>\Lib\site-packages\ipccli\html\Index.html
Se i passaggi precedenti sono stati eseguiti correttamente, quando viene stabilita una connessione alla piattaforma tramite ipccli, il core TXE è accessibile tramite CSE Tap e ipccli consente di accedervi applicando il seguente percorso ipccli:
ipc.devs.cse_c0.threads[0]
Ma poiché la PoC blocca il caricamento della piattaforma finché la CPU principale non viene inizializzata, i suoi core sono inaccessibili tramite JTAG e il core ME può essere raggiunto tramite il seguente comando:
ipc.threads[0]
Per arrestare le istruzioni del processore ME, esegui il seguente comando:
me = ipc.devs.cse_c0.threads[0]
me.halt()
Per arrestare le istruzioni del processore CPU, esegui il seguente comando:
core = ipc.threads[0]
core.halt()

La console visualizza l'indirizzo logico dell'istruzione in cui è stato effettuato l'arresto.
OpenIPC consente di leggere la memoria dopo l'arresto, ad esempio:
ipc.threads[0].mem("0xf0080004P", 4)
Puoi specificare un indirizzo logico (sel:offset), un indirizzo lineare (modificatore L) o un indirizzo fisico (modificatore P).
L'agente di sistema ME (MISA) consente di ottenere l'indirizzo fisico iniziale della regione ROM, che include il vettore di reset di ME. Puoi ottenere l'indirizzo ROM tramite il registro Hunit ROM Memory Base (HROMMB) all'offset 0xe20 MISA MMIO (0xf0000000P):

ROM risiede sempre da ROMBASE a 0xffffffff Per copiare la ROM in un file, esegui il seguente comando:
ipc.threads[0].memsave("<file path>", "0xfffe0000p", 0x20001)
È importante specificare la dimensione come 0x20001, anziché 0x20000 (altrimenti OpenIPC incontra problemi a causa di difficoltà con l'accesso a 64 bit, che non è possibile per il core ME a 32 bit). L'ultimo byte del file può essere scartato, poiché non fa parte della ROM.
La piattaforma offre maggiori opportunità di debug senza un adattatore speciale Intel CCA-SVT e consente di eseguire il debug delle primissime fasi del core TXE tramite un normale cavo di debug USB.
Intel ME: The Way of the Static Analysis
Intel ME: Flash File System Explained
How to Hack a Turned-Off Computer or Running Unsigned Code in Intel Management Engine
Inside Intel Management Engine
Disabling Intel ME 11 via undocumented mode
Mark Ermolov (@_markel___)
Maxim Goryachy (@h0t_max)
Mark Ermolov (@_markel___)
Maxim Goryachy (@h0t_max)
Dmitry Sklyarov (@_Dmit)
Copyright (c) 2018 Mark Ermolov, Maxim Goryachy presso Positive Technologies
Con la presente si concede, gratuitamente, a chiunque ottenga una copia di questo software e dei relativi file di documentazione (il "Software"), il diritto di utilizzare il Software senza alcuna restrizione, inclusi, a titolo esemplificativo ma non esaustivo, i diritti di utilizzare, copiare, modificare, fondere, pubblicare, distribuire, concedere in sottolicenza e/o vendere copie del Software, e di consentire alle persone a cui il Software è fornito di fare altrettanto, alle seguenti condizioni:La suddetta nota sul copyright e questa nota di autorizzazione devono essere incluse in tutte le copie o parti sostanziali del Software.
IL SOFTWARE È FORNITO "COSÌ COM'È", SENZA GARANZIA DI ALCUN TIPO, ESPRESSA O IMPLICITA, IVI INCLUSE, A TITOLO ESEMPLIFICATIVO MA NON ESAUSTIVO, LE GARANZIE DI COMMERCIABILITÀ, IDONEITÀ PER UN PARTICOLARE SCOPO E NON VIOLAZIONE. IN NESSUN CASO GLI AUTORI O I TITOLARI DEL COPYRIGHT SARANNO RESPONSABILI PER QUALSIASI RECLAMO, DANNO O ALTRA RESPONSABILITÀ, SIA IN UN'AZIONE CONTRATTUALE, ILLECITO CIVILE O ALTRO, DERIVANTE DA, O IN CONNESSIONE CON, IL SOFTWARE O DALL'USO O DA ALTRE OPERAZIONI NEL SOFTWARE.