
Preuve de concept JTAG Intel Management Engine - Instructions 2022
Toutes les informations sont fournies à des fins éducatives uniquement. Suivez ces instructions à vos propres risques. Ni les auteurs ni leur employeur ne sont responsables des dommages directs ou indirects ou des pertes résultant de toute personne ou organisation agissant ou s'abstenant d'agir sur la base des informations contenues dans cette page.
Introduction
Logiciels requis
Génération du payload
Génération du jeton de déverrouillage
Préparation de l'image SPI Flash
Intégration des fichiers dans l'image du firmware
Désactivation de la signature OEM
Construction de l'image du firmware
BringUP du processeur principal
Écriture de l'image sur la SPI Flash
Préparation du câble de débogage USB
Application des correctifs aux fichiers de configuration OpenIPC
Déchiffrement des fichiers de configuration OpenIPC
Ajout du cœur LMT à la configuration
Définition de la variable d'environnement IPC_PATH
Vérification initiale du fonctionnement du JTAG
Afficher le thread ME du processeur
Arrêt des cœurs
Débogage ME : démarrage rapide
Lecture de mémoire arbitraire
Lecture de la ROM
Pourquoi TXE ?
Liste des plateformes testées
Auteurs
Licence
La vulnérabilité INTEL-SA-00086 permet d'activer le JTAG pour le cœur de l'Intel Management Engine. Nous avons développé notre [preuve de concept JTAG][8] pour la plateforme Gigabyte Brix GP-BPCE-3350C. Bien que nous recommandions aux chercheurs potentiels d'utiliser la même plateforme, les plateformes d'autres fabricants équipées du chipset Intel Apollo Lake devraient également prendre en charge la preuve de concept (pour la version TXE 3.0.1.1107).
Étant donné que la Gigabyte Brix GP-BPCE-3350C n'est plus largement disponible dans le commerce, ces instructions ont été mises à jour pour cibler à la place l'AAEON UP Squared SKU UPS-APLX7-A20-0864 (Intel Atom® x7-E3950). Si vous achetez cette carte, assurez-vous également d'obtenir l'alimentation électrique, l'adaptateur série et un adaptateur USB-vers-série. De plus, l'UP Squared ne nécessite qu'un simple câble de débogage USB pour effectuer le débogage DCI. Le câble de débogage USB doit être connecté au port où le câble USB jaune est indiqué ici.
La vulnérabilité INTEL-SA-00086 implique un débordement de tampon lors du traitement d'un fichier stocké sur MFS (le [système de fichiers interne de ME][6]). Le chemin complet du fichier est /home/bup/ct. Vous devrez intégrer une version de ce fichier exploitant la vulnérabilité dans le firmware ME en utilisant Intel Flash Image Tool (FIT), l'un des outils système Intel fournis par Intel aux OEM de matériel basé sur les chipsets Intel PCH.
Les utilitaires des outils système Intel ME (TXE, SPS) ne sont pas destinés aux utilisateurs finaux—vous ne pouvez donc pas les trouver sur le site officiel d'Intel. Cependant, certains OEM les publient dans le cadre de mises à jour logicielles accompagnées de pilotes de périphériques. Ainsi, pour intégrer notre preuve de concept, vous avez besoin de "CSTXE System Tools v3", que vous pouvez trouver ici.
Vous devez installer Intel System Studio pour effectuer le débogage JTAG. Dans nos expériences initiales, nous avons utilisé Intel System Studio 2018. Ces instructions ont été mises à jour pour Intel System Studio 2020, qui peut être obtenu ici.
La preuve de concept cible la version 3.0.1.1107 du firmware Intel TXE. Le référentiel d'images "CSTXE 3.0" sur les forums Win-Raid contient la version nécessaire du firmware TXE.
Tous nos scripts sont écrits en Python. Nous recommandons d'utiliser Python 2.7 Les scripts nécessitent également le paquet pycrypto. Pour installer pycrypto, exécutez la commande suivante :``` pip install pycrypto
## Effectuer un débogage x86 de référence via DCI
Bien que l’objectif de ce guide soit de permettre le débogage JTAG dans le ME via un exploit, il est de bonne pratique de commencer par une vérification de cohérence et de vous assurer que vous pouvez effectuer un débogage JTAG normal de la carte UP Squared via DCI. AAEON n’expédie plus ses BIOS avec DCI activé, car la société a indiqué sur ses forums que cela entraînait des instabilités. (Et les versions plus anciennes du BIOS antérieures à la v5.0 qui avaient DCI activé ne fonctionneront plus avec le nouveau matériel, en raison d’un changement matériel du fournisseur de DRAM.) Par conséquent, pour activer le JTAG DCI sur l’UP Squared, vous devez effectuer 3 étapes :
1) Effectuez le patch binaire décrit par Satoshi Tanda [ici](https://forum.up-community.org/discussion/comment/12877#Comment_12877) (bien qu’il devrait être indiqué d’utiliser UEFITool 0.28 et non 2.8).
2) Activez DCI via le menu de configuration du BIOS en appuyant sur F7 au démarrage, en saisissant le mot de passe UP par défaut (*upassw0rd*), puis, depuis le menu principal, descendez jusqu’à « CRB Setup » -> « CSB Chipset » -> « South Cluster Configuration » -> « Miscellaneous Configuration » -> « DCI Enable (HDCIEN) » et réglez-le sur activé. Quittez ensuite le menu de configuration du BIOS, enregistrez la modification de configuration et redémarrez le système.
3) Ouvrez « C:\IntelSWTools\system_studio_2020\system_debugger_2020\target_indicator\bin\TargetIndicator.exe » et confirmez que lorsque vous avez ce système branché à l’UP Squared via le câble de débogage, un indicateur bleu s’affiche indiquant que DCI est possible, comme ci-dessous :

Vous pouvez ensuite lancer « :\Program Files (x86)\IntelSWTools\sw_dev_tools\system_debugger_2020\system_debug_legacy\xdb.bat », vous connecter à la cible, l’interrompre, puis exécuter pas à pas pour confirmer que vous disposez de capacités de débogage de base.
(Vous pouvez également suivre la série de blogs d’Alan Sguigna [ici](https://www.asset-intertech.com/resources/blog/2020/05/open-source-firmware-explorations-using-dci-on-the-aaeon-up-squared-board/) sur la façon de construire la version Debug du code open source pour cette plateforme, qui sera débogable via DCI à partir du vecteur de réinitialisation. Cependant, notez qu’en raison d’un changement matériel pour la DRAM, ce code compilé à partir des sources ne démarrera plus complètement sur le nouveau matériel - il restera bloqué au démarrage comme indiqué [ici](https://forum.up-community.org/discussion/comment/12877). Les mainteneurs d’Intel TianoCore ont refusé de corriger cela.)
# Génération du payload
Exécutez le script **me_exp_bxtp.py**:```
me_exp_bxtp.py -f <file_name>
Le script génère les données nécessaires et les exporte vers le fichier spécifié (indiquez soit le chemin complet du fichier, soit, dans le répertoire courant, simplement un nom, ct.bin par défaut). Ce fichier sera utilisé plus tard par FIT.
Exécutez le script utock_gen.py :``` utock_gen.py -f <file_name>
Le script génère les données nécessaires et les exporte vers le fichier spécifié (indiquez soit le chemin complet du fichier, soit, dans le répertoire courant, simplement un nom, *utok.bin* par défaut). Ce fichier sera utilisé ultérieurement par *FIT*.
# Préparation de l'image Flash SPI
## Intégrer le payload
Pour intégrer les fichiers *ct.bin* et *utok.bin*, exécutez l'utilitaire *FIT* (*fit.exe*) obtenu depuis *CSTXE System Tools v3*. Utilisez-le d'abord pour ouvrir votre image BIOS UP Squared dont le DCI est activé (par ex. « UPA1AM61_DCI_Enabled.bin »)

*FIT* extrait différentes sections de l'image SPI globale (descripteur SPI, firmware UEFI/BIOS, firmware Intel ME et Unlock Token) lorsque l'image est ouverte et les enregistre dans le dossier *"image_name"/Decomp* dans le même répertoire local que FIT.

Après cela, enregistrez le XML de configuration (par ex. « UPA1AM61_DCI_Enabled.xml ») et quittez fit.exe.
Afin de rétrograder le firmware Intel TXE vers la version vulnérable **3.0.1.1107**, nous devons remplacer le fichier <image name>/Decomp/TXE Region.bin par le fichier « 3.0.1.1107_B_PRD_RGN.bin ». Pour ce faire, renommez le fichier d'origine en « TXE Region.bin.orig », puis renommez « 3.0.1.1107_B_PRD_RGN.bin » en « TXE Region.bin ».
Rouvrez fit.exe et rechargez votre configuration à partir de votre fichier XML enregistré. Si vous avez correctement remplacé le fichier sur le système de fichiers, dans la zone « Intel(R) TXE Binary File » de l'onglet Flash Layout, vous devriez voir la version 3.0.1.1107 affichée au lieu de celle d'origine :

# Intégration des fichiers d'exploit dans l'image du firmware
Nous devons maintenant indiquer dans *FIT* les fichiers que nous avons générés pour */home/bup/ct* (**ct.bin**) et *Unlock Token* (**utok.bin**). Sous l'onglet *Debug* de *FIT*, vous pouvez spécifier le fichier Trace Hub Binary et le fichier Unlock Token à intégrer dans le firmware. Il s'agit des fichiers que nous avons déjà générés.

# Désactivation de la signature OEM
Un hash de clé publique OEM est présent sous l'onglet Platform Protection. Supprimez-le en saisissant 32 zéros :```
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Sélectionnez Build Settings

Par défaut, cela ressemble à ceci :

Mettez-le à jour en changeant outimage.bin pour qu'il porte le même nom que votre fichier d'entrée. Réglez également "Enable Boot Guard warning message at build time" sur No,
et "Verify manifest signing keys against the OEM Key Manifest" sur No. Cela devrait alors ressembler à ceci :

Construisez l'image en sélectionnant Build Image dans le menu Build.

Si tout a été fait correctement jusqu'à présent, le processus de construction devrait aboutir et FIT affiche un message console similaire à celui-ci :

Vous devez activer le mode HAP pour que cet exploit fonctionne. L'index de bit 0 de l'octet situé à l'offset +0x102 doit être défini manuellement à 1 via un éditeur hexadécimal dans le fichier de sortie généré par fit.exe :

À la fin du processus, vous devriez obtenir un fichier similaire au fichier d'exemple fourni ici, bien que celui-ci concerne la version 5.2 du BIOS UP, alors que les instructions précédentes concernent la version 6.1.
Pour écrire l'image dans la flash SPI, nous recommandons fortement d'utiliser un programmateur SPI (comme le Dediprog SF600Plus).
Assurez-vous de sauvegarder le firmware d'origine afin de pouvoir le restaurer en cas de problème !
Vous aurez besoin d'un USB 3.0 debug cable pour vous connecter à la plateforme. Vous pouvez soit acheter un câble spécialement conçu à cet effet, soit en fabriquer un vous-même à partir d'un câble USB 3.0 AM–AM en isolant les contacts D+, D- et Vcc.

Intel développe et fournit aux utilisateurs deux paquets logiciels qui peuvent être utilisés pour le débogage JTAG des plateformes et du CPU principal : DAL (DFx Abstraction Layer) et OpenIPC. DAL et OpenIPC font tous deux partie d'Intel System Studio. Après l'installation d'Intel System Studio 2020, OpenIPC apparaît dans le répertoire suivant :
Windows``` C:\IntelSWTools\system_studio_2020\tools\OpenIPC_1.2035.4868.100
La configuration *OpenIPC* est chiffrée et ne prend pas en charge le cœur TXE. Déchiffrez donc la configuration et ajoutez-y une description TXE.
## Déchiffrement des fichiers de configuration OpenIPC
Pour déchiffrer les fichiers de configuration, extrayez la clé de la bibliothèque *StructuredData* (*StructuredData_x64.dll*) dans *OpenIPC/Bin* à l'aide du script [IDA Pro](https://www.hex-rays.com/products/ida/support/download_freeware.shtml) *openipc_key_extract.py*. Si le script ne fonctionne pas, vous pouvez simplement ouvrir le fichier dans IDA Pro, rechercher la chaîne "Logging.xml", puis récupérer les 16 octets qui suivent après le prochain alignement. (Il y aura 4 octets supplémentaires, puis 4 zéros après les 16 octets qui vous intéressent.) Transmettez la clé (dans notre cas, *F820AD4F6CC2E9EE050C43DEBF631F59*) au script *config_decryptor.py* avec le chemin du répertoire OpenIPC.```
config_decryptor.py –k F820AD4F6CC2E9EE050C43DEBF631F59 –p C:\IntelSWTools\system_studio_2020\tools\OpenIPC_1.2035.4868.100
La version fournie d'OpenIPC ne contient pas les informations nécessaires sur le cœur TXE. Nous devons donc appliquer un correctif (patch.diff) aux fichiers de configuration OpenIPC déchiffrés. Voici comment procéder :``` patch -p2 < patch.diff
# Définition de la variable d’environnement IPC_PATH
Après déchiffrement et correction, définissez la variable d’environnement *IPC_PATH* sur le nouveau répertoire *OpenIPC* afin que *ipccli* utilise la version modifiée d’*OpenIPC*. Par exemple :
Windows```
set IPC_PATH=C:\IntelSWTools\system_studio_2020\tools\OpenIPC_1.2035.4868.100\Bin
L'activator bloque le chargement ultérieur en maintenant le processus BUP dans une boucle après l'activation de JTAG. Après le lancement, la plateforme ne montrera aucun signe de vie (le moniteur ne s'allume pas, les voyants du clavier ne s'allument pas et aucun son POST du BIOS n'est émis). Vous devrez donc vérifier via le débogage DCI que la plateforme est "bloquée" dans le module BUP.
Comme DAL, la bibliothèque OpenIPC comprend une interface en ligne de commande (CLI), écrite en Python et fournie comme bibliothèque Python dans le cadre d'Intel System Studio, qui peut être installée sur le système à l'aide de pip. Le package d'installation pour ipccli se trouve au chemin suivant : Windows``` C:\IntelSWTools\system_studio_2020\system_debugger_2020\debugger\ipccli\ipccli-1.2035.1920.100-py2.py3-none-any.whl
Pour installer ipccli, exécutez la commande console suivante :```
pip install ipccli-1.2035.1920.100-py2.py3-none-any.whl
Une fois installé, ipccli est disponible dans l’environnement d’exécution de la version de Python correspondante (celle à partir de laquelle pip a été invoqué). Pour commencer avec OpenIPC, exécutez les commandes suivantes dans la console Python à partir d’une invite de commandes Administrateur :``` import ipccli ipc = ipccli.baseaccess()
Le mécanisme de connexion à la plateforme cible via DCI se lance, produisant la sortie console suivante :

Lorsqu'aucune connexion n'est établie—par exemple, si la plateforme n'est pas sous tension ou n'est pas physiquement connectée via DCI—les messages ressembleront à ce qui suit :

Si la connexion *DCI* réussit, vérifiez que le registre *PERSONALITY* du dispositif *DFX_AGGRAGATOR* est égal à 3.
Le registre *PERSONALITY* possède un code *IR* (*Instruction Register*) de *0x54*. Pour le lire, exécutez les commandes suivantes :```
dfx_agg = ipc.devs.mdu_dfx_agg_tap0
ipc.irdrscan(dfx_agg, 0x54, 32)
Voici à quoi devrait ressembler le résultat de cette commande:

L'utilitaire ipccli est fourni avec une documentation HTML assez détaillée, qui se trouve dans un dossier du paquet Python ipccli:``` \Lib\site-packages\ipccli\html\Index.html
## Afficher le thread CPU ME
Si les étapes précédentes ont été effectuées correctement, lorsqu'une connexion à la plateforme est établie via *ipccli*, le cœur *TXE* est accessible via *CSE Tap* et *ipccli* permet d'y accéder en appliquant le chemin *ipccli* suivant :```
ipc.devs.cse_c0.threads[0]
Mais comme le PoC bloque le chargement de la plateforme jusqu'à ce que le CPU principal soit initialisé, ses cœurs sont inaccessibles via JTAG et le cœur ME est accessible via la commande suivante :``` ipc.threads[0]
## Arrêt des cœurs
Pour arrêter les instructions du processeur ME, exécutez la commande suivante :```
me = ipc.devs.cse_c0.threads[0]
me.halt()
Pour arrêter les instructions du processeur, exécutez la commande suivante :``` core = ipc.threads[0] core.halt()

La console affiche l'adresse logique de l'instruction à laquelle l'arrêt a été effectué.
## Lecture de mémoire arbitraire
*OpenIPC* permet de lire la mémoire après l'arrêt, par exemple :```
ipc.threads[0].mem("0xf0080004P", 4)
Vous pouvez spécifier une adresse logique (sel:offset), une adresse linéaire (modificateur L) ou une adresse physique (modificateur P).
L'agent système du ME (MISA) permet d'obtenir l'adresse physique initiale de la région ROM, qui inclut le vecteur de réinitialisation du ME. Vous pouvez obtenir l'adresse ROM via le registre Hunit ROM Memory Base (HROMMB) à l'offset 0xe20 MISA MMIO (0xf0000000P) :

ROM réside toujours de ROMBASE à 0xffffffff Pour copier la ROM dans un fichier, exécutez la commande suivante :``` ipc.threads[0].memsave("", "0xfffe0000p", 0x20001)
Il est important de spécifier la taille comme *0x20001*, et non *0x20000* (sinon *OpenIPC* rencontre des problèmes liés à l'accès 64 bits, ce qui n'est pas possible pour le cœur ME 32 bits). Le dernier octet du fichier peut être écarté, car il ne fait pas partie de la *ROM*.
# Pourquoi TXE ?
La plateforme offre davantage d'opportunités de débogage sans adaptateur [Intel CCA-SVT](https://designintools.intel.com/Silicon_View_Technology_Closed_Chassis_Adapter_p/itpxdpsvt.htm) spécial et permet de déboguer les tout premiers stades du cœur TXE via un *câble de débogage USB* ordinaire.
## URLs associées :
[Intel ME : la voie de l'analyse statique][4]
[Les secrets d'Intel DCI][5]
[Intel ME : le système de fichiers flash expliqué][6]
[Comment pirater un ordinateur éteint ou exécuter du code non signé dans le moteur de gestion Intel][7]
[À l'intérieur du moteur de gestion Intel][8]
[Désactivation d'Intel ME 11 via un mode non documenté][9]
## Liste des plateformes testées
* Gigabyte Mini-PC Barebone (BRIX) GB-BPCE-3350C (rev:1.1, 1.2)
* Beelink M1
* [MinisForum N33](https://github.com/HackingThings/MinisForum_N33_JTAG) Mini PC - 2021
* UP Squared Intel Atom® x7-E3950 [SKU UPS-APLX7-A20-0864](https://up-shop.org/up-squared-series.html) - 2022
* UP 4000 Intel Atom® x7-E3950 [SKU UP-APL03X7F-A10-0464](https://up-shop.org/up4000series.html) - 2022
# Auteurs
Mark Ermolov ([@\_markel___][1])
Maxim Goryachy ([@h0t_max][2])
### Mise à jour du README.md pour Intel System Studio 2020 et le matériel UP Squared
Xeno Kovah ([@XenoKovah][10])
# Équipe de recherche
Mark Ermolov ([@\_markel___][1])
Maxim Goryachy ([@h0t_max][2])
Dmitry Sklyarov ([@_Dmit][3])
# Licence
Copyright (c) 2018 Mark Ermolov, Maxim Goryachy chez Positive Technologies
La permission est accordée, à titre gratuit, à toute personne obtenant une copie de ce logiciel et des fichiers de documentation associés (le « Logiciel »), de traiter le Logiciel sans restriction, y compris sans limitation les droits d'utiliser, de copier, de modifier, de fusionner, de publier, de distribuer, de sous-licencier et/ou de vendre des copies du Logiciel, et de permettre aux personnes auxquelles le Logiciel est fourni de le faire, sous réserve des conditions suivantes : L'avis de copyright ci-dessus et cet avis de permission doivent être inclus dans toutes les copies ou parties substantielles du Logiciel.
LE LOGICIEL EST FOURNI « TEL QUEL », SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE, Y COMPRIS MAIS SANS S'Y LIMITER LES GARANTIES DE QUALITÉ MARCHANDE, D'ADÉQUATION À UN USAGE PARTICULIER ET D'ABSENCE DE CONTREFAÇON. EN AUCUN CAS, LES AUTEURS OU TITULAIRES DU COPYRIGHT NE SERONT RESPONSABLES DE TOUTE RÉCLAMATION, DOMMAGE OU AUTRE RESPONSABILITÉ, QUE CE SOIT DANS UNE ACTION CONTRACTUELLE, DÉLICTUELLE OU AUTRE, DÉCOULANT DE, OU EN RELATION AVEC LE LOGICIEL OU SON UTILISATION OU D'AUTRES TRANSACTIONS DANS LE LOGICIEL.
[1]: https://twitter.com/_markel___
[2]: https://twitter.com/h0t_max
[3]: https://twitter.com/_Dmit
[4]: https://www.troopers.de/troopers17/talks/772-intel-me-the-way-of-the-static-analysis/
[5]: http://conference.hitb.org/hitbsecconf2017ams/sessions/commsec-intel-dci-secrets/
[6]: https://www.blackhat.com/docs/eu-17/materials/eu-17-Sklyarov-Intel-ME-Flash-File-System-Explained-wp.pdf
[7]: https://www.blackhat.com/docs/eu-17/materials/eu-17-Goryachy-How-To-Hack-A-Turned-Off-Computer-Or-Running-Unsigned-Code-In-Intel-Management-Engine-wp.pdf
[8]: https://github.com/ptresearch/IntelME-JTAG
[9]: http://blog.ptsecurity.com/2017/08/disabling-intel-me.html
[10]: https://twitter.com/XenoKovah