
Intel Management Engine JTAG Proof of Concept
Alle Informationen dienen ausschließlich zu Bildungszwecken. Die Befolgung dieser Anweisungen erfolgt auf eigene Gefahr. Weder die Autoren noch ihr Arbeitgeber sind für direkte oder indirekte Schäden oder Verluste verantwortlich, die aus Handlungen oder Unterlassungen einer Person oder Organisation auf der Grundlage der auf dieser Seite enthaltenen Informationen entstehen.
Einführung
Erforderliche Software
Erzeugen des Payloads
Erzeugen des Unlock-Tokens
Vorbereiten des SPI-Flash-Images
Integrieren von Dateien in das Firmware-Image
Deaktivieren der OEM-Signierung
Erstellen des Firmware-Images
Hochfahren der Haupt-CPU
Schreiben des Images auf den SPI-Flash
Vorbereiten des USB-Debug-Kabels
Patchen der OpenIPC-Konfigurationsdateien
Entschlüsseln der OpenIPC-Konfigurationsdateien
Hinzufügen des LMT-Cores zur Konfiguration
Festlegen der Umgebungsvariable IPC_PATH
Durchführen einer ersten Überprüfung der JTAG-Funktionsfähigkeit
ME-Thread anzeigen
Cores anhalten
ME-Debugging: Schnellstart
Beliebigen Speicher lesen
ROM lesen
Warum TXE?
Liste der getesteten Plattformen
Autoren
Lizenz
Die Schwachstelle INTEL-SA-00086 ermöglicht es, JTAG für den Intel Management Engine-Core zu aktivieren. Wir haben unseren JTAG-PoC für die Plattform Gigabyte Brix GP-BPCE-3350C entwickelt. Obwohl wir angehenden Forschern empfehlen, dieselbe Plattform zu verwenden, sollten auch Plattformen anderer Hersteller mit dem Intel Apollo Lake-ChIP-Satz den PoC unterstützen (für TXE-Version 3.0.1.1107).
Die Schwachstelle INTEL-SA-00086 beinhaltet einen Pufferüberlauf bei der Verarbeitung einer auf MFS (dem internen ME-Dateisystem) gespeicherten Datei. Der vollständige Dateipfad ist /home/bup/ct. Sie müssen sie mithilfe von Intel Flash Image Tool (FIT) in die ME-Firmware integrieren – eines der Intel-Systemtools, die Intel an OEMs von Hardware auf Basis von Intel-PCH-Chipsätzen bereitstellt. Hier ist die Struktur des Stammverzeichnisses des Intel-Systemtools-Pakets:

Die Dienstprogramme der Intel-ME- (TXE, SPS)-Systemtools sind nicht für Endbenutzer bestimmt – daher finden Sie sie nicht auf der offiziellen Intel-Website. Einige OEMs veröffentlichen sie jedoch als Teil von Software-Updates zusammen mit Gerätetreibern. Für die Integration unseres PoC benötigen Sie also Intel TXE System Tools Version 3.x, die online zu finden ist.
Sie müssen Intel System Studio installieren; eine Testversion kann von der Intel-Website heruntergeladen werden. In unseren Experimenten verwendeten wir Intel System Studio 2018.
Der PoC zielt auf Intel-TXE-Firmware-Version 3.0.1.1107. Das SPI-Flash-Image für Gigabyte GB-BPCE-3350C Version F5 enthält die erforderliche Firmware-Version.
Alle unsere Skripte sind in Python geschrieben. Wir empfehlen die Verwendung von Python 2.7. Die Skripte benötigen außerdem das Paket pycrypto. Um pycrypto zu installieren, führen Sie den folgenden Befehl aus:
pip install pycrypto
Dieses Dienstprogramm wird nur benötigt, wenn Sie die CPU hochfahren müssen.
Die EFI Human Interface Infrastructure (HII) ist ein spezieller Mechanismus zum Erstellen einer Benutzeroberfläche im UEFI sowie zum Verarbeiten und Verwalten von Benutzereingaben. EFI HII identifiziert Standardwerte für alle Optionen, einschließlich der verborgenen. Sobald die Option im Zusammenhang mit DCI gefunden ist, kann sie für die Standardkonfiguration aktiviert werden, und DCI kann durch Wiederherstellen der BIOS-Werkseinstellungen aktiviert werden. Zum Hochfahren der Haupt-CPU benötigen Sie AMI BIOS Configuration Program Version 5.xx, die ebenfalls online zu finden ist.
Führen Sie das Skript me_exp_bxtp.py aus:
me_exp_bxtp.py -f <dateiname>
Das Skript erzeugt die erforderlichen Daten und exportiert sie in die angegebene Datei (geben Sie entweder den vollständigen Dateipfad oder, innerhalb des aktuellen Verzeichnisses, einfach einen Namen an – standardmäßig ct.bin). Diese Datei wird später von FIT verwendet.
Führen Sie das Skript me_utok_bxtp.py aus:
me_utok_bxtp.py -f <dateiname>
Das Skript erzeugt die erforderlichen Daten und exportiert sie in die angegebene Datei (geben Sie entweder den vollständigen Dateipfad oder, innerhalb des aktuellen Verzeichnisses, einfach einen Namen an – standardmäßig utok.bin). Diese Datei wird später von FIT verwendet.
Überspringen Sie diesen Schritt, wenn Sie die CPU nicht hochfahren müssen.
Um die Option DCI Enable zu aktivieren, führen Sie das Dienstprogramm AMIBCP aus und öffnen Sie damit das mit Ihrer Plattform gelieferte SPI-Firmware-Image. Öffnen Sie für den Gigabyte Brix GP-BPCE-3350C die Datei, die über den oben angegebenen Gigabyte-Link heruntergeladen wurde (Pfad zur Imagedatei im Archiv: F5/image.bin).

Nun müssen wir die Option HDCIEN auf der Registerkarte Setup Configuration aktivieren.
Um die Dateien ct.bin und utok.bin zu integrieren, führen Sie das Dienstprogramm FIT (fit.exe) aus und öffnen Sie damit das SPI-Firmware-Image.

Wenn Sie eine andere Hardware-Plattform verwenden und keinen Zugriff auf TXE 3.0.1.1107 haben, können Sie ein SPI-Flash-Image für Gigabyte GB-BPCE-3350C Version F5 herunterladen und den TXE-Abschnitt über FIT extrahieren. FIT extrahiert beim Öffnen des Images verschiedene Abschnitte des gesamten SPI-Images (SPI-Descriptor, UEFI/BIOS-Firmware, Intel-ME-Firmware und Unlock Token) und speichert sie im Ordner *"image_name"/Decomp *.

Sie finden die Datei mit der erforderlichen Intel-TXE-Firmware also unter /Decomp/TXE Region.bin. Öffnen Sie dann in FIT das SPI-Image für Ihre jeweilige Plattform und ersetzen Sie die Datei, die die Intel-TXE-Firmware enthält, durch die aus dem GB-Brix-3350c-Image gewonnene Version ("Intel(R) TXE Binary File" auf der Registerkarte Flash-Layout):

Nun müssen wir in FIT die Dateien angeben, die wir für /home/bup/ct und Unlock Token erzeugt haben. Auf der Registerkarte Debug in FIT können Sie die Trace-Hub-Binärdatei und den Unlock Token angeben, die in die Firmware integriert werden sollen. Dabei sollte es sich um die bereits erzeugten Dateien handeln.

Entfernen Sie einfach das Feld OEM Public Key Hash aus FIT:

Erstellen Sie das Image, indem Sie im Menü Build die Option Build Image auswählen.

Ignorieren Sie die Meldung zu den BootGuard-Einstellungen (klicken Sie auf "Ja"):

Wenn bisher alles korrekt durchgeführt wurde, sollte der Build-Prozess erfolgreich sein und FIT gibt eine Konsolenmeldung wie die folgende aus:

Überspringen Sie diesen Schritt, wenn Sie die CPU nicht hochfahren müssen.
Sie müssen den HAP-Modus aktivieren, um die CPU hochzufahren. Bit 0 des Bytes am Offset +0x102 sollte gesetzt werden:

Zum Schreiben des Images auf den SPI-Flash empfehlen wir dringend die Verwendung eines SPI-Programmers.
Sichern Sie unbedingt die Original-Firmware, damit Sie sie im Fehlerfall wiederherstellen können!
Sie benötigen ein USB-3.0-Debug-Kabel, um die Verbindung zur Plattform herzustellen. Sie können entweder ein speziell dafür hergestelltes Kabel kaufen oder sich aus einem USB-3.0-AM–AM-Kabel selbst eines basteln, indem Sie die Kontakte D+, D- und Vcc isolieren.

Intel entwickelt und stellt Benutzern zwei Softwarepakete zur Verfügung, die für das JTAG-Debugging von Plattformen und der Haupt-CPU verwendet werden können: DAL (DFx Abstraction Layer) und OpenIPC. Sowohl DAL als auch OpenIPC sind Teil von Intel System Studio. Nach der Installation von Intel System Studio 2018 erscheint OpenIPC im folgenden Verzeichnis:
Windows
C:\Intel\OpenIPC_1.1740.2381.100
Linux
/opt/intel/system_studio_2018/system_debugger_2018/debugger/openipc
Die OpenIPC-Konfiguration ist verschlüsselt und unterstützt den TXE-Core nicht. Entschlüsseln Sie daher die Konfiguration und fügen Sie ihr eine TXE-Beschreibung hinzu.
Um die Konfigurationsdateien zu entschlüsseln, extrahieren Sie den Schlüssel aus der Bibliothek StructuredData (Linux: libStructuredData_x64.so, Windows: StructuredData_x64.dll) in OpenIPC/Bin mithilfe des IDA-Pro-Skripts openipc_key_extract.py. Übergeben Sie den Schlüssel (in unserem Fall 4504fb02be0a9c4c84df2a89cf508bc3) mit dem Pfad zum OpenIPC-Verzeichnis an das Skript config_decryptor.py.
config_decryptor.py –k 4504fb02be0a9c4c84df2a89cf508bc3 –p C:\Intel\OpenIPC
Die mitgelieferte Version von OpenIPC enthält nicht die erforderlichen Informationen über den TXE-Core. Daher müssen wir einen Patch (patch.diff) auf die entschlüsselten OpenIPC-Konfigurationsdateien anwenden. So geht's:
patch -p2 < patch.diff
Setzen Sie nach der Entschlüsselung und dem Patchen die Umgebungsvariable IPC_PATH auf das neue OpenIPC-Verzeichnis, damit ipccli die modifizierte OpenIPC-Version verwendet. Zum Beispiel:
Windows
set IPC_PATH=c:\Intel\OpenIPC\Bin
Der Aktivator blockiert das anschließende Laden, indem er den BUP-Prozess nach der Aktivierung von JTAG in einer Schleife hält. Nach dem Start zeigt die Plattform keine Lebenszeichen (der Monitor schaltet sich nicht ein, die Tastaturindikatoren leuchten nicht auf und kein BIOS-POST-Sound wird abgespielt). Sie müssen also über das DCI-Debugging prüfen, ob die Plattform im BUP-Modul "hängengeblieben" ist.
Wie DAL enthält die OpenIPC-Bibliothek eine Befehlszeilenschnittstelle (CLI), die in Python geschrieben und als Python-Bibliothek im Rahmen von Intel System Studio bereitgestellt wird und mit Hilfe von pip auf dem System installiert werden kann. Das Installationspaket für ipccli befindet sich unter folgendem Pfad: 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
Um ipccli zu installieren, führen Sie den folgenden Konsolenbefehl aus:
pip install ipccli-1.1740.544.100-py2.py3-none-any.whl
Nach der Installation ist ipccli in der Laufzeitumgebung der entsprechenden Python-Version verfügbar (derjenigen, aus der pip aufgerufen wurde). Führen Sie die folgenden Befehle in der Python-Konsole aus, um mit OpenIPC zu beginnen:
import ipccli
ipc = ipccli.baseaccess()
Der Mechanismus zum Verbinden mit der Zielplattform über DCI wird gestartet, was zu der folgenden Konsolenausgabe führt:

Wenn keine Verbindung hergestellt wird – z. B. wenn die Plattform nicht eingeschaltet oder nicht physisch über DCI verbunden ist – ähneln die Meldungen der folgenden:

Wenn die DCI-Verbindung erfolgreich ist, stellen Sie sicher, dass das Register PERSONALITY des Geräts DFX_AGGRAGATOR gleich 3 ist. Das Register PERSONALITY hat einen IR-Code (Instruction Register) von 0x54. Um es zu lesen, führen Sie die folgenden Befehle aus:
dfx_agg = ipc.devs.mdu_dfx_agg_tap0
ipc.irdrscan(dfx_agg, 0x54, 32)
So sollte das Ergebnis dieses Befehls aussehen:

Das Dienstprogramm ipccli wird mit einer recht ausführlichen HTML-Dokumentation geliefert, die in einem Ordner des Python-Pakets ipccli zu finden ist:
<Python Dir>\Lib\site-packages\ipccli\html\Index.html
Wenn die vorherigen Schritte korrekt durchgeführt wurden, ist der TXE-Core bei einer Verbindung zur Plattform über ipccli über CSE Tap zugänglich, und ipccli ermöglicht den Zugriff über den folgenden ipccli-Pfad:
ipc.devs.cse_c0.threads[0]
Da der PoC das Laden der Plattform jedoch blockiert, bis die Haupt-CPU initialisiert ist, sind die Cores über JTAG nicht zugänglich, und auf den ME-Core kann über den folgenden Befehl zugegriffen werden:
ipc.threads[0]
Um die ME-Prozessor-Ausführung anzuhalten, führen Sie den folgenden Befehl aus:
me = ipc.devs.cse_c0.threads[0]
me.halt()
Um die CPU-Prozessor-Ausführung anzuhalten, führen Sie den folgenden Befehl aus:
core = ipc.threads[0]
core.halt()

Die Konsole zeigt die logische Adresse des Befehls an, an dem angehalten wurde.
OpenIPC ermöglicht das Lesen des Speichers nach dem Anhalten, zum Beispiel:
ipc.threads[0].mem("0xf0080004P", 4)
Sie können eine logische Adresse (sel:offset), eine lineare Adresse (L-Modifikator) oder eine physische Adresse (P-Modifikator) angeben.
Der ME-Systemagent (MISA) ermöglicht es, die anfängliche physische Adresse des ROM-Bereichs zu erhalten, die den ME-Reset-Vektor enthält. Sie können die ROM-Adresse über das Register Hunit ROM Memory Base (HROMMB) am Offset 0xe20 der MISA-MMIO (0xf0000000P) ermitteln:

ROM liegt immer von ROMBASE bis 0xffffffff Um das ROM in eine Datei zu kopieren, führen Sie den folgenden Befehl aus:
ipc.threads[0].memsave("<dateipfad>", "0xfffe0000p", 0x20001)
Es ist wichtig, die Größe als 0x20001 anzugeben, nicht als 0x20000 (andernfalls bekommt OpenIPC Probleme aufgrund von Schwierigkeiten mit dem 64-Bit-Zugriff, der für den 32-Bit-ME-Core nicht möglich ist). Das letzte Byte der Datei kann verworfen werden, da es nicht Teil des ROM ist.
Die Plattform bietet mehr Möglichkeiten für das Debugging ohne einen speziellen Intel-CCA-SVT-Adapter und ermöglicht das Debuggen der frühesten Phasen des TXE-Cores über ein gewöhnliches USB-Debug-Kabel.
Intel ME: Der Weg der statischen Analyse
Intel ME: Flash-Dateisystem erklärt
Im Inneren der Intel Management Engine
Deaktivieren von Intel ME 11 über den undokumentierten Modus
Mark Ermolov (@_markel___)
Maxim Goryachy (@h0t_max)
Mark Ermolov (@_markel___)
Maxim Goryachy (@h0t_max)
Dmitry Sklyarov (@_Dmit)
Copyright (c) 2018 Mark Ermolov, Maxim Goryachy bei Positive Technologies
Hiermit wird jeder Person, die eine Kopie dieser Software und der zugehörigen Dokumentationsdateien (die "Software") erhält, kostenlos die Erlaubnis erteilt, uneingeschränkt mit der Software zu handeln, einschließlich und ohne Einschränkung der Rechte zur Nutzung, zum Kopieren, Modifizieren, Zusammenführen, Veröffentlichen, Verteilen, Unterlizenzieren und/oder Verkaufen von Kopien der Software, und Personen, denen die Software zur Verfügung gestellt wird, dies unter den folgenden Bedingungen zu gestatten: Der obige Urheberrechtshinweis und dieser Genehmigungshinweis müssen in allen Kopien oder wesentlichen Teilen der Software enthalten sein.
DIE SOFTWARE WIRD "WIE BESEHEN" BEREITGESTELLT, OHNE JEGLICHE GEWÄHRLEISTUNG, AUSDRÜCKLICH ODER IMPLIZIT, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GEWÄHRLEISTUNG DER MARKTGÄNGIGKEIT, DER EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND DER NICHTVERLETZUNG VON RECHTEN. IN KEINEM FALL SIND DIE AUTOREN ODER URHEBERRECHTSINHABER HAFTBAR FÜR ANSPRÜCHE, SCHÄDEN ODER ANDERE HAFTUNG, OB AUS VERTRAG, UNERLAUBTER HANDLUNG ODER ANDERWEITIG, DIE SICH AUS DER SOFTWARE ODER DER NUTZUNG ODER ANDEREN GESCHÄFTEN MIT DER SOFTWARE ERGEBEN.