
Nous vous proposons de redescendre Ă un niveau fondamental et de parler de la sĂ©curitĂ© des firmwares sur les plateformes informatiques compatibles x86. Cette fois-ci, l'ingrĂ©dient principal de notre Ă©tude est Intel Boot Guard (Ă ne pas confondre avec Intel BIOS Guard !) â une technologie de dĂ©marrage sĂ©curisĂ© prise en charge par le matĂ©riel, que le fabricant du systĂšme informatique peut activer ou dĂ©sactiver de maniĂšre permanente lors de la production. Quant Ă notre recette d'analyse, elle est dĂ©jĂ familiĂšre : dĂ©couper avec prĂ©cision l'implĂ©mentation de cette technologie par le biais de l'ingĂ©nierie inverse, dĂ©crire sa structure, l'enrichir de dĂ©tails non documentĂ©s, assaisonner avec des vecteurs d'attaques, et mĂ©langer le tout. Ajoutons un peu de piquant avec une discussion sur la maniĂšre dont une faille de fabrication clonĂ©e pendant des annĂ©es chez plusieurs fabricants permet Ă un attaquant potentiel d'utiliser cette technologie pour crĂ©er un rootkit cachĂ© dans le systĂšme, indĂ©tectable mĂȘme par un programmateur.
Au fait, cet article sâinspire des prĂ©sentations intitulĂ©es « Ă la dĂ©fense des rootkits : Intel BootGuard » faites lors de la confĂ©rence et de la 29e rĂ©union (les deux prĂ©sentations ).
Firmware de la plateforme informatique avec architecture Intel 64
Pour commencer, répondons à la question : qu'est-ce qui constitue le firmware d'une plateforme informatique moderne avec architecture Intel 64 ? Bien sûr, c'est le BIOS UEFI. Mais cette réponse ne serait pas tout à fait exacte. Regardons plutÎt le schéma qui montre la version de bureau (ou portable) de cette architecture.

La base est un ensemble :
- Un processeur (CPU, UnitĂ© Centrale de Traitement) qui, en plus des cĆurs principaux, intĂšgre un cĆur graphique (pas dans tous les modĂšles), et comprend un contrĂŽleur de mĂ©moire (IMC, ContrĂŽleur de MĂ©moire IntĂ©grĂ©) ;
- Un chipset (PCH, ContrÎleur de Plateforme) qui contient divers contrÎleurs pour interagir avec les périphériques et gérer les sous-systÚmes. Parmi eux se trouve le fameux Intel Management Engine (ME), qui a également son propre firmware (firmware Intel ME).
Les ordinateurs portables, en plus de tout ce qui précÚde, supposent la présence d'un contrÎleur intégré (ACPI EC, ContrÎleur Embeddé de l'Interface Avancée de ContrÎle et d'Alimentation), qui est responsable du bon fonctionnement des systÚmes d'alimentation, du pavé tactile, du clavier, des touches Fn (luminosité de l'écran, volume, rétroéclairage du clavier, etc.) et bien d'autres. Et lui aussi a son propre firmware.
Ainsi, l'ensemble des firmwares mentionnés ci-dessus constitue le firmware de la plate-forme informatique (system firmware), qui est stocké dans une mémoire flash SPI partagée. Pour éviter que les utilisateurs de cette mémoire ne se mélangent les pinceaux, le contenu de cette mémoire est divisé en plusieurs régions (comme indiqué sur l'image) :
- UEFI BIOS ;
- firmware ACPI EC (une région distincte a été introduite avec l'architecture de microprocesseur Skylake en 2015, mais jusqu'à présent, nous n'avons pas vu d'exemples d'utilisation dans la nature, donc le firmware du contrÎleur intégré fait toujours partie de l'UEFI BIOS) ;
- firmware Intel ME ;
- configuration (adresse MAC, etc.) de l'adaptateur réseau intégré GbE (Gigabit Ethernet) ;
- descripteurs Flash (Flash Descriptors) â la rĂ©gion principale de la mĂ©moire flash, qui contient des pointeurs vers les autres rĂ©gions ainsi que des autorisations d'accĂšs Ă celles-ci.

La gestion de l'accĂšs aux rĂ©gions (selon les autorisations dĂ©finies) est assurĂ©e par le contrĂŽleur maĂźtre du bus SPI â un contrĂŽleur SPI intĂ©grĂ© dans le chipset, par lequel l'accĂšs Ă cette mĂ©moire est effectuĂ©. Si les autorisations sont dĂ©finies aux valeurs recommandĂ©es (pour des raisons de sĂ©curitĂ©) par Intel, alors chaque utilisateur de la mĂ©moire flash SPI a un accĂšs complet (lecture/Ă©criture) uniquement Ă sa rĂ©gion. Les autres sont soit en lecture seule, soit inaccessibles. Il est bien connu que sur de nombreux systĂšmes, le CPU a un accĂšs complet Ă l'UEFI BIOS et Ă GbE, un accĂšs en lecture seulement aux descripteurs flash, et il n'y a pas d'accĂšs Ă la rĂ©gion Intel ME. Pourquoi sur de nombreux systĂšmes et pas sur tous ? Ce qui est recommandĂ© n'est pas forcĂ©ment obligatoire. Nous expliquerons cela en dĂ©tail dans l'article suivant.
Mécanismes de protection du firmware de la plate-forme informatique contre les modifications
Il est Ă©vident que le firmware de la plate-forme informatique doit ĂȘtre protĂ©gĂ© contre toute compromission, qui permettrait Ă un potentiel attaquant de s'y ancrer (de survivre aux mises Ă jour/rĂ©installations du systĂšme d'exploitation), d'exĂ©cuter son code dans les modes les plus privilĂ©giĂ©s, etc. Et les limites d'accĂšs aux rĂ©gions de la mĂ©moire flash SPI ne suffisent Ă©videmment pas. Par consĂ©quent, divers mĂ©canismes spĂ©cifiques Ă chaque environnement d'exĂ©cution sont utilisĂ©s pour protĂ©ger le firmware contre les modifications.
Ainsi, le firmware Intel ME est signé pour contrÎler l'intégrité et l'authenticité, et est vérifié par le contrÎleur ME à chaque chargement en mémoire ME UMA. Ce processus de vérification a déjà été abordé dans l'un de nos articles. , dédiée au sous-systÚme Intel ME.
La mise Ă jour du firmware ACPI EC est gĂ©nĂ©ralement contrĂŽlĂ©e uniquement pour l'intĂ©gritĂ©. Cependant, Ă©tant donnĂ© que ce binaire est inclus dans le BIOS UEFI, il est presque toujours soumis aux mĂȘmes mĂ©canismes de protection que ceux utilisĂ©s par le BIOS UEFI. Discutons-en.
Ces mĂ©canismes peuvent ĂȘtre classĂ©s en deux catĂ©gories.
Protection en écriture de la région UEFI BIOS
- Protection physique du contenu de la mémoire flash SPI par un cavalier write-protect;
- Protection de la projection de la région UEFI BIOS dans l'espace d'adressage du CPU à l'aide des registres PRx du chipset;
- Blocage des tentatives d'écriture dans la région UEFI BIOS par la génération et le traitement d'une interruption SMI correspondante en activant les bits BIOS_WE/BLE et SMM_BWP dans les registres du chipset;
- Une variante plus avancée de cette protection est Intel BIOS Guard (PFAT).
En plus de ces mécanismes, les fabricants peuvent développer et appliquer leurs propres mesures de sécurité (par exemple, la signature des capsules de mises à jour UEFI BIOS).
Il est important de noter que certains de ces mĂ©canismes de protection peuvent ne pas ĂȘtre appliquĂ©s sur un systĂšme particulier (cela dĂ©pend du fabricant), peuvent ne pas ĂȘtre appliquĂ©s du tout ou peuvent ĂȘtre implĂ©mentĂ©s de maniĂšre vulnĂ©rable. Pour plus de dĂ©tails sur ces mĂ©canismes et la situation de leur mise en Ćuvre, vous pouvez lire en . Nous recommandons aux intĂ©ressĂ©s de consulter l'ensemble du cycle d'articles sur la sĂ©curitĂ© du BIOS UEFI de .
Vérification de l'authenticité du BIOS UEFI
Lorsque nous parlons de technologies de dĂ©marrage sĂ©curisĂ©, la premiĂšre chose qui vient Ă l'esprit est Secure Boot. Cependant, il est architecturĂ©ment destinĂ© Ă vĂ©rifier l'authenticitĂ© des composants externes par rapport au BIOS UEFI (drivers, chargeurs, etc.), et non du firmware lui-mĂȘme.
C'est pourquoi Intel a mis en Ćuvre un Secure Boot matĂ©riel non dĂ©sactivable (Verified Boot) dans ses SoC avec l'architecture Bay Trail (2012), qui n'a rien Ă voir avec la technologie Secure Boot mentionnĂ©e ci-dessus. Plus tard (en 2013), ce mĂ©canisme a Ă©tĂ© amĂ©liorĂ© et lancĂ© sous le nom d'Intel Boot Guard pour les ordinateurs de bureau avec l'architecture Haswell.
Avant de dĂ©crire Intel Boot Guard, examinons les environnements d'exĂ©cution de l'architecture Intel 64, qui sont par la mĂȘme occasion les racines de confiance pour cette technologie de dĂ©marrage sĂ©curisĂ©.
Intel CPU
Kép suggÚre que le processeur est le principal environnement d'exécution de l'architecture Intel 64. Pourquoi est-il aussi la racine de confiance ? En fait, c'est parce qu'il possÚde les éléments suivants :
- Le microcode ROM est une mémoire non volatile et non réinscriptible destinée à stocker le microcode. On considÚre que le microcode est l'implémentation du systÚme d'instructions du processeur sous forme d'instructions élémentaires. Des bogues peuvent également survenir dans le microcode. la clé AES pour déchiffrer le contenu des mises à jour de microcode ;
- le hash de la clé publique RSA, qui vérifie la signature des mises à jour de microcode ;
- le hash de la clé publique RSA, qui vérifie la signature des modules de code authentifiés ACM (Authenticated Code Module) développés par Intel, que le CPU peut exécuter avant le démarrage du BIOS (salutations au microcode) ou pendant son fonctionnement, en réponse à certains événements.
- Intel ME
Nous avons consacré un article entier à ce sous-systÚme dans notre blog.
Rappelons que cet environnement exécutable est basé sur un microcontrÎleur intégré dans le chipset et est le plus caché et privilégié dans le systÚme. Malgré cette discrétion, Intel ME est également la racine de confiance, car elle possÚde :
la ROM ME â une mĂ©moire non volatile et non rĂ©inscriptible (aucun moyen de mise Ă jour n'est prĂ©vu), contenant le code de dĂ©marrage, ainsi qu'un hash SHA256 de la clĂ© publique RSA, qui vĂ©rifie la signature du firmware Intel ME ;
- une clé AES pour stocker des informations secrÚtes ;
- un accÚs à un ensemble de fusibles programmables sur le terrain (FPFs, Field Programmable Fuses) intégré dans le chipset pour le stockage permanent de certaines informations, y compris celles fournies par le fournisseur du systÚme informatique.
- Intel Boot Guard 1.x
Un petit avertissement. Les numéros de version de la technologie Intel Boot Guard, que nous utilisons dans cet article, sont conditionnels et peuvent n'avoir aucun rapport avec la numérotation utilisée dans la documentation interne d'Intel. De plus, les informations fournies ici sur l'implémentation de cette technologie ont été obtenues par reverse engineering et peuvent contenir des inexactitudes par rapport à la spécification d'Intel Boot Guard, qui ne sera probablement jamais publiée.
Un petit avertissement. Les numéros de version de la technologie Intel Boot Guard mentionnés dans cet article sont provisoires et peuvent ne pas correspondre à ceux utilisés dans la documentation interne d'Intel. De plus, les informations fournies ici sur l'implémentation de cette technologie ont été obtenues par rétro-ingénierie et peuvent contenir des inexactitudes par rapport à la spécification d'Intel Boot Guard, qui ne sera probablement jamais publiée.
Ainsi, Intel Boot Guard (BG) est une technologie de vérification d'authenticité du BIOS UEFI, prise en charge matériellement. D'aprÚs sa brÚve description dans le livre [Platform Embedded Security Technology Revealed, chapitre Boot with Integrity, or Not Boot], elle fonctionne comme une chaßne de confiance pour le démarrage. Le premier maillon de cette chaßne est le code de démarrage (microcode) à l'intérieur du CPU, qui se lance lors d'un événement RESET (à ne pas confondre avec le vecteur RESET dans le BIOS !). Le CPU trouve dans la mémoire flash SPI un module de code (Intel BG startup ACM) conçu et signé par Intel, le charge dans son cache, vérifie (il a été noté que le CPU possÚde le hachage de la clé publique utilisée pour vérifier la signature de l'ACM) et l'exécute.

Ce module de code est responsable de la vĂ©rification d'une petite partie de dĂ©marrage du BIOS UEFI â le Initial Boot Block (IBB), qui contient Ă son tour la fonctionnalitĂ© nĂ©cessaire Ă la vĂ©rification de la partie principale du BIOS UEFI. Ainsi, Intel BG permet de garantir l'authenticitĂ© du BIOS avant le dĂ©marrage du systĂšme d'exploitation (qui peut ĂȘtre exĂ©cutĂ© sous la surveillance de la technologie Secure Boot).
La technologie Intel BG prĂ©voit deux modes de fonctionnement (chaque mode n'interfĂšre pas avec l'autre, c'est-Ă -dire que les deux modes peuvent ĂȘtre activĂ©s sur le systĂšme, ou les deux peuvent ĂȘtre dĂ©sactivĂ©s).
Mesured Boot
En mode Measured Boot (MB), chaque composant de démarrage (à partir du CPU boot ROM) "mesure" le suivant, en utilisant les capacités du TPM (Trusted Platform Module). Pour ceux qui ne sont pas familiers, voici une explication.
Le TPM dispose de PCR (Platform Configuration Registers), dans lesquelles est enregistré le résultat de l'opération de hachage selon la formule :

C'est-à -dire que la valeur actuelle des PCR dépend de la précédente, et ces registres ne sont réinitialisés qu'à un RESET du systÚme.
Ainsi, en mode MB, Ă un certain moment, les PCR reflĂštent un identifiant unique (dans les limites des capacitĂ©s de l'opĂ©ration de hachage) du code ou des donnĂ©es qui ont Ă©tĂ© "mesurĂ©s". Les valeurs des PCR peuvent ĂȘtre utilisĂ©es lors de l'opĂ©ration de chiffrement de certaines donnĂ©es (TPM_Seal). Par la suite, leur dĂ©chiffrement (TPM_Unseal) ne sera possible que si les valeurs des PCR n'ont pas changĂ© durant le dĂ©marrage (c'est-Ă -dire qu'aucun composant "mesurĂ©" n'a Ă©tĂ© modifiĂ©).
Verified Boot
Le mode le plus redouté par les amateurs de modifications du BIOS UEFI est le Verified Boot (VB), dans lequel chaque composant de démarrage vérifie cryptographiquement l'intégrité et l'authenticité du suivant. En cas d'erreur de vérification, il se produit (une des):
- arrĂȘt par timeout de 1 Ă 30 minutes (pour que l'utilisateur puisse comprendre pourquoi son ordinateur ne dĂ©marre pas et, si possible, tente de restaurer le BIOS);
- arrĂȘt immĂ©diat (pour que l'utilisateur ne comprenne rien et, encore moins, ne puisse agir);
- continuer Ă travailler avec un air impassible (ce cas oĂč la sĂ©curitĂ© n'est pas une prioritĂ©, car il y a des affaires plus importantes).
Le choix de l'action dépend de la configuration Intel BG (c'est-à -dire de la dite enforcement policy), qui est enregistrée de maniÚre permanente par le fournisseur de la plateforme informatique dans un espace de stockage spécialement conçu - les fusions du chipset (FPF). Nous reviendrons sur ce point plus tard.
En plus de la configuration, le fournisseur génÚre deux clés RSA 2048 et crée deux structures de données (illustrées sur l'image) :
- Le manifeste de la clé racine du fournisseur (KEYM, OEM Root Key Manifest), qui contient le SVN (Security Version Number) de ce manifeste, le hash SHA256 de la clé publique du manifeste suivant, la clé publique RSA (c'est-à -dire la partie publique de la clé racine du fournisseur) pour vérifier la signature de ce manifeste, ainsi que la propre signature;
- Le manifeste IBB (IBBM, Initial Boot Block Manifest), qui contient le SVN de ce manifeste, le hash SHA256 de l'IBB, la clé publique pour vérifier la signature de ce manifeste et la propre signature.
Le hash SHA256 de la clé publique de la clé racine OEM est enregistré de maniÚre permanente dans les fusions du chipset (FPF), tout comme la configuration Intel BG. Si la configuration Intel BG prévoit l'activation de cette technologie, alors à partir de ce moment, sur ce systÚme, seul le détenteur de la partie privée de la clé racine OEM peut mettre à jour le BIOS (c'est-à -dire avoir la possibilité de recalculer ces manifestes), c'est-à -dire le fournisseur.

En regardant l'image, on peut douter de la nécessité d'une telle chaßne de vérification prolongée - on aurait pu utiliser un seul manifeste. Pourquoi compliquer les choses?
En réalité, Intel permet ainsi au fournisseur d'utiliser différentes clés IBB pour différentes gammes de ses produits et une seule comme clé racine. Si la partie privée de la clé IBB (qui signe le deuxiÚme manifeste) fuit, l'incident n'affectera qu'une seule gamme de produits et uniquement jusqu'à ce que le fournisseur génÚre une nouvelle paire et inclue les manifestes recalculés dans la prochaine mise à jour du BIOS.
Mais si la clé racine (avec laquelle le premier manifeste est signé) est compromise, il sera impossible de la remplacer, car il n'existe pas de procédure de révocation, étant donné que le hachage de la partie publique de cette clé est programmé dans les FPF une fois pour toutes.
Configuration d'Intel Boot Guard
Passons maintenant en détail sur la configuration d'Intel BG et le processus de sa création. Si l'on regarde l'onglet correspondant dans l'interface graphique de l'outil Flash Image Tool du kit d'outils Intel System Tool Kit (STK), on peut constater que la configuration d'Intel BG inclut le hachage de la partie publique de la clé racine du fournisseur, une paire de valeurs peu claires et le profil dit Intel BG.

La structure de ce profil :
typedef struct BG_PROFILE
{
unsigned long Force_Boot_Guard_ACM : 1;
unsigned long Verified_Boot : 1;
unsigned long Measured_Boot : 1;
unsigned long Protect_BIOS_Environment : 1;
unsigned long Enforcement_Policy : 2; // 00b â ne rien faire
// 01b â extinction avec un dĂ©lai
// 11b â extinction immĂ©diate
unsigned long : 26;
};En général, la configuration d'Intel BG est une entité trÚs flexible. Prenons par exemple le drapeau Force_Boot_Guard_ACM. Lorsqu'il est désactivé, si le module BG startup ACM n'est pas trouvé dans la mémoire flash SPI, il n'y aura aucune confiance dans le démarrage. Ce sera un démarrage non sécurisé.
Nous avons dĂ©jĂ mentionnĂ© ci-dessus que la politique d'exĂ©cution pour le mode VB peut ĂȘtre configurĂ©e de sorte qu'en cas d'erreur de vĂ©rification, un dĂ©marrage non sĂ©curisĂ© se produise Ă nouveau.
Laisser de telles choses à la discrétion des fournisseurs...
L'interface graphique de l'outil propose les profils « prĂȘts Ă l'emploi » suivants :
Numéro
Mode
Description
0
No_FVME
la technologie Intel BG est désactivée
1
VE
le mode VB est activé, extinction par délai
2
VME
les deux modes (VB et MB) sont activés, extinction par délai
3
VM
les deux modes sont activés, sans extinction du systÚme
4
FVE
le mode VB est activé, extinction immédiate
5
FVME
les deux modes sont activés, extinction immédiate
Comme dĂ©jĂ mentionnĂ©, la configuration d'Intel BG doit ĂȘtre une fois pour toutes Ă©crite par le fournisseur du systĂšme dans les fusions du chipset (FPF) â un petit (selon des informations non vĂ©rifiĂ©es, seulement 256 octets) espace de stockage matĂ©riel d'informations Ă l'intĂ©rieur du chipset, qui peut ĂȘtre programmĂ© en dehors des capacitĂ©s de production de la sociĂ©tĂ© Intel (c'est donc Field Programmable Fuses).
Il est parfaitement adapté pour stocker la configuration, car :
- il a une zone programmable une seule fois pour le stockage de donnĂ©es (exactement lĂ oĂč la configuration d'Intel BG est enregistrĂ©e);
- seule Intel ME peut le lire et le programmer.
Ainsi, pour configurer la technologie Intel BG sur un systÚme particulier, le fournisseur effectue les étapes suivantes lors de la fabrication :
- à l'aide de l'outil Flash Image Tool (de Intel STK), il crée une image de firmware avec la configuration Intel BG sous forme de variables dans la région Intel ME (un soi-disant miroir temporaire pour les FPF) ;
- Avec l'outil Flash Programming Tool (de Intel STK), il écrit cette image sur la mémoire flash SPI du systÚme et ferme le soi-disant mode de fabrication (en envoyant une commande correspondante à Intel ME).
à la suite de ces opérations, Intel ME commite les valeurs spécifiées du miroir pour les FPF dans la région ME, définit les permissions dans les descripteurs de la mémoire flash SPI aux valeurs recommandées par Intel (décrit au début de l'article) et effectue un RESET du systÚme.
Analyse de l'implémentation d'Intel Boot Guard
Pour analyser la mise en Ćuvre de cette technologie sur un exemple concret, nous avons vĂ©rifiĂ© les systĂšmes suivants pour la prĂ©sence de traces de la technologie Intel BG :
Le systĂšme
Remarque
Gigabyte GA-H170-D3H
Skylake, prise en charge
Gigabyte GA-Q170-D3H
Skylake, prise en charge
Gigabyte GA-B150-HD3
Skylake, prise en charge
MSI H170A Gaming Pro
Skylake, pas de prise en charge
Lenovo ThinkPad 460
Skylake, prise en charge, technologie activée
Lenovo Yoga 2 Pro
Haswell, pas de prise en charge
Lenovo U330p
Haswell, pas de prise en charge
Par "prise en charge", nous entendons la présence du module Intel BG startup ACM, des manifestes mentionnés ci-dessus et du code correspondant dans le BIOS, c'est-à -dire l'implémentation pour analyse.
Par exemple, prenons l'image de la mémoire flash SPI téléchargée depuis le site officiel du fournisseur pour le Gigabyte GA-H170-D3H (version F4).
Intel CPU boot ROM
Tout d'abord, parlons des actions du processeur en cas d'activation de la technologie Intel BG.
Aucun Ă©chantillon de microcode dĂ©chiffrĂ© n'a pu ĂȘtre trouvĂ©, donc la maniĂšre dont les actions dĂ©crites ci-dessous sont rĂ©alisĂ©es (dans le microcode ou matĂ©riellement) reste une question ouverte. NĂ©anmoins, le fait que les processeurs Intel modernes soient capables d'effectuer ces actions est un fait.
AprÚs le passage à l'état RESET, le processeur (dans l'espace d'adressage duquel le contenu de la mémoire flash est déjà mappé) trouve la table FIT (Firmware Interface Table). Il est facile de la trouver, un pointeur vers celle-ci est enregistré à l'adresse FFFF FFC0h.

Dans l'exemple considĂ©rĂ©, cette adresse contient la valeur FFD6 9500h. En accĂ©dant Ă cette adresse, le processeur voit la table FIT, dont le contenu est divisĂ© en enregistrements. Le premier enregistrement est l'en-tĂȘte de la structure suivante :
typedef struct FIT_HEADER
{
char Tag[8]; // â_FIT_ â
unsigned long NumEntries; // y compris l'entrĂ©e de l'en-tĂȘte FIT
unsigned short Version; // 1.0
unsigned char EntryType; // 0
unsigned char Checksum;
}; 
Pour une raison inconnue, le checksum n'est pas toujours calculé dans ces tableaux (le champ est laissé à zéro).
Les autres enregistrements pointent vers diffĂ©rents binaires qui doivent ĂȘtre analysĂ©s/exĂ©cutĂ©s avant l'exĂ©cution du BIOS, c'est-Ă -dire avant le passage au vecteur RESET hĂ©ritĂ© (FFFF FFF0h). La structure de chaque enregistrement est la suivante :
typedef struct FIT_ENTRY
{
unsigned long BaseAddress;
unsigned long : 32;
unsigned long Size;
unsigned short Version; // 1.0
unsigned char EntryType;
unsigned char Checksum;
}; 
Le champ EntryType indique le type de bloc auquel cet enregistrement fait référence. Nous connaissons plusieurs types :
enum FIT_ENTRY_TYPES
{
FIT_HEADER = 0,
MICROCODE_UPDATE,
BG_ACM,
BIOS_INIT = 7,
TPM_POLICY,
BIOS_POLICY,
TXT_POLICY,
BG_KEYM,
BG_IBBM
};Il est maintenant Ă©vident qu'un des enregistrements indique l'emplacement du binaire Intel BG startup ACM. La structure de l'en-tĂȘte de ce binaire est typique des modules de code dĂ©veloppĂ©s par Intel (ACM, mises Ă jour du microcode, sections de code Intel ME, âŠ).
typedef struct BG_ACM_HEADER
{
unsigned short ModuleType; // 2
unsigned short ModuleSubType; // 3
unsigned long HeaderLength; // en dwords
unsigned long : 32;
unsigned long : 32;
unsigned long ModuleVendor; // 8086h
unsigned long Date; // au format BCD
unsigned long TotalSize; // en dwords
unsigned long unknown1[6];
unsigned long EntryPoint;
unsigned long unknown2[16];
unsigned long RsaKeySize; // en dwords
unsigned long ScratchSize; // en dwords
unsigned char RsaPubMod[256];
unsigned long RsaPubExp;
unsigned char RsaSig[256];
}; 
Le processeur charge ce binaire dans son cache, le vérifie et l'exécute.
Intel BG startup ACM
L'analyse du fonctionnement de cet ACM a révélé qu'il effectue les actions suivantes :
- il reçoit de Intel ME la configuration Intel BG, enregistrée dans les fusions du chipset (FPF) ;
- il localise les manifestes KEYM et IBBM, les vérifie.
Pour localiser ces manifestes, l'ACM utilise également la table FIT, qui prévoit deux types d'enregistrements pour indiquer les données des structures (voir FIT_ENTRY_TYPES ci-dessus).
Concentrons-nous sur les manifestes. Dans la structure du premier manifeste, nous voyons plusieurs constantes peu claires, un hachage de la clé publique du second manifeste et la clé publique OEM Root Key avec une signature sous forme de structure imbriquée :
typedef struct KEY_MANIFEST
{
char Tag[8]; // â__KEYM__â
unsigned char : 8; // 10h
unsigned char : 8; // 10h
unsigned char : 8; // 0
unsigned char : 8; // 1
unsigned short : 16; // 0Bh
unsigned short : 16; // 20h == taille du hachage ?
unsigned char IbbmKeyHash[32]; // SHA256 d'une clé publique IBBM
BG_RSA_ENTRY OemRootKey;
};
typedef struct BG_RSA_ENTRY
{
unsigned char : 8; // 10h
unsigned short : 16; // 1
unsigned char : 8; // 10h
unsigned short RsaPubKeySize; // 800h
unsigned long RsaPubExp;
unsigned char RsaPubKey[256];
unsigned short : 16; // 14
unsigned char : 8; // 10h
unsigned short RsaSigSize; // 800h
unsigned short : 16; // 0Bh
unsigned char RsaSig[256];
}; 
Pour la vérification de la clé publique OEM Root Key, rappelons qu'un hachage SHA256 des fusibles est utilisé, qui a déjà été obtenu de Intel ME.
Passons au second manifeste. Il se compose de trois structures :
typedef struct IBB_MANIFEST
{
ACBP Acbp; // Politiques de démarrage
IBBS Ibbs; // Description IBB
IBB_DESCRIPTORS[];
PMSG Pmsg; // Signature IBBM
};Dans le premier, il y a des constantes :
typedef struct ACBP
{
char Tag[8]; // â__ACBP__â
unsigned char : 8; // 10h
unsigned char : 8; // 1
unsigned char : 8; // 10h
unsigned char : 8; // 0
unsigned short : 16; // x & F0h = 0
unsigned short : 16; // 0 < x <= 400h
};Dans le second se trouve le hachage SHA256 de l'IBB et le nombre de descripteurs qui décrivent le contenu de l'IBB (c'est-à -dire ce à quoi le hachage se réfÚre) :
typedef struct IBBS
{
char Tag[8]; // â__IBBS__â
unsigned char : 8; // 10h
unsigned char : 8; // 0
unsigned char : 8; // 0
unsigned char : 8; // x <= 0Fh
unsigned long : 32; // x & FFFFFFF8h = 0
unsigned long Unknown[20];
unsigned short : 16; // 0Bh
unsigned short : 16; // 20h == taille du hachage ?
unsigned char IbbHash[32]; // SHA256 d'un IBB
unsigned char NumIbbDescriptors;
};Les descripteurs IBB suivent cette structure, les uns aprĂšs les autres. Leur contenu a le format suivant :
typedef struct IBB_DESCRIPTOR
{
unsigned long : 32;
unsigned long BaseAddress;
unsigned long Size;
};C'est simple : chaque descripteur contient l'adresse/ la taille d'un morceau d'IBB. Par consĂ©quent, la concatĂ©nation des blocs que ces descripteurs pointent (dans l'ordre oĂč se trouvent les descripteurs eux-mĂȘmes) constitue l'IBB. En gĂ©nĂ©ral, l'IBB est un ensemble de tous les modules des phases SEC et PEI.
Le second manifeste se termine par une structure contenant la clé publique IBB (vérifiée par le hachage SHA256 du premier manifeste) et la signature de ce manifeste :
typedef struct PMSG
{
char Tag[8]; // â__PMSG__â
unsigned char : 8; // 10h
BG_RSA_ENTRY IbbKey;
}; 
Ainsi, mĂȘme avant le dĂ©marrage du BIOS UEFI, le processeur lancera l'ACM, qui vĂ©rifiera l'authenticitĂ© des contenus des sections de code des phases SEC et PEI. Ensuite, le processeur sort de l'ACM, passe par le vecteur de RESET et commence Ă exĂ©cuter le BIOS.
La section PEI vĂ©rifiĂ©e doit contenir un module qui vĂ©rifiera le reste du BIOS (code DXE). Ce module est dĂ©jĂ dĂ©veloppĂ© par l'IBV (Independent BIOS Vendor) ou par le fournisseur du systĂšme lui-mĂȘme. Comme les systĂšmes compatibles Intel BG Ă notre disposition Ă©taient uniquement ceux de Lenovo et de Gigabyte, examinons le code extrait prĂ©cisĂ©ment de ces systĂšmes.
Module UEFI BIOS LenovoVerifiedBootPei
Dans le cas de Lenovo, il s'agit du module LenovoVerifiedBootPei {B9F2AC77-54C7-4075-B42E-C36325A9468D}, développé par Lenovo.
Son rÎle consiste à rechercher (par GUID) la table de hachage pour DXE et à vérifier DXE.
if (EFI_PEI_SERVICES->GetBootMode() != BOOT_ON_S3_RESUME)
{
if (!FindHashTable())
return EFI_NOT_FOUND;
if (!VerifyDxe())
return EFI_SECURITY_VIOLATION;
}La table de hachage {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} a le format suivant :
typedef struct HASH_TABLE
{
char Tag[8]; // â$HASHTBLâ
unsigned long NumDxeDescriptors;
DXE_DESCRIPTORS[];
};typedef struct DXE_DESCRIPTOR
{
unsigned char BlockHash[32]; // SHA256
unsigned long Offset;
unsigned long Size;
};Module UEFI BIOS BootGuardPei
Dans le cas de Gigabyte, il s'agit du module BootGuardPei {B41956E1-7CA2-42DB-9562-168389F0F066}, développé par AMI, ce qui signifie qu'il est présent dans tout BIOS AMI compatible avec Intel BG.
Son algorithme de fonctionnement est quelque peu différent, mais reste similaire :
int bootMode = EFI_PEI_SERVICES->GetBootMode();
if (bootMode != BOOT_ON_S3_RESUME &&
bootMode != BOOT_ON_FLASH_UPDATE &&
bootMode != BOOT_IN_RECOVERY_MODE)
{
HOB* h = CreateHob();
if (!FindHashTable())
return EFI_NOT_FOUND;
WriteHob(&h, VerifyDxe());
return h;
}La table de hachage {389CC6F2-1EA8-467B-AB8A-78E769AE2A15}, qu'il recherche, a le format suivant :
typedef HASH_TABLE DXE_DESCRIPTORS[];
typedef struct DXE_DESCRIPTOR
{
unsigned char BlockHash[32]; // SHA256
unsigned long BaseAddress;
unsigned long Size;
};Intel Boot Guard 2.x
Parlons briĂšvement d'une autre implĂ©mentation d'Intel Boot Guard, qui a Ă©tĂ© trouvĂ©e dans un systĂšme plus rĂ©cent basĂ© sur un SoC Intel avec une microarchitecture Apollo Lake â ASRock J4205-IT.
Bien que cette version ne sera appliquĂ©e qu'aux SoC (de nouveaux systĂšmes avec l'architecture de processeur Kaby Lake continuent d'utiliser Intel Boot Guard 1.x), elle est d'un grand intĂ©rĂȘt pour l'Ă©tude d'un nouveau variant d'architecture pour les plateformes basĂ©es sur Intel SoC, qui ont connu des changements significatifs, par exemple :
- les régions BIOS et Intel ME (plus précisément Intel TXE, selon la terminologie pour Intel SoC) sont désormais une seule région IFWI;
- bien que la plateforme ait inclus Intel BG, des structures telles que FIT, KEYM, IBBM n'ont pas été trouvées dans la mémoire flash;
- en plus des cĆurs TXE et ISH (x86), le chipset a ajoutĂ© un troisiĂšme cĆur (encore ARC, d'ailleurs) â PMC (Power Management Controller), liĂ© Ă l'alimentation et Ă la surveillance de la performance.

Le contenu de la nouvelle région IFWI est un ensemble des modules suivants :
Décalage
Nom
Description
0000 2000h
SMIP
une certaine configuration de la plateforme, signée par le vendeur
0000 6000h
RBEP
section de code du firmware Intel TXE, x86, signée par Intel
0001 0000h
PMCP
section de code du firmware Intel PMC, ARC, signée par Intel
0002 0000h
FTPR
section de code du firmware Intel TXE, x86, signée par Intel
0007 B000h
UCOD
mises à jour de microcode pour CPU, signées par Intel
0008 0000h
IBBP
UEFI BIOS, phases SEC/PEI, x86, signée par le vendeur
0021 8000h
ISHC
section de code du firmware Intel ISH, x86, signée par le vendeur
0025 8000h
NFTP
section de code du firmware Intel TXE, x86, signée par Intel
0036 1000h
IUNP
inconnu
0038 1000h
OBBP
UEFI BIOS, phase DXE, x86, non signée
L'analyse du firmware TXE a rĂ©vĂ©lĂ© qu'aprĂšs un RESET, TXE maintient le processeur dans cet Ă©tat jusqu'Ă ce qu'il prĂ©pare le contenu de base de l'espace d'adressage pour le CPU (FIT, ACM, vecteur RESET âŠ). TXE place ces donnĂ©es dans sa SRAM, puis fournit temporairement un accĂšs au processeur avant de le libĂ©rer du RESET.
Sur la garde des rootkits
Et maintenant, parlons de "chaud". Un jour, nous avons découvert que sur de nombreux systÚmes, les descripteurs flash SPI contenaient des autorisations d'accÚs aux régions de la mémoire flash SPI de sorte que tous les utilisateurs de cette mémoire pouvaient écrire et lire n'importe quelle région. Autrement dit, cela ne sert à rien.
AprÚs vérification avec l'utilitaire MEinfo (d'Intel STK), nous avons constaté que le mode de fabrication sur ces systÚmes n'était pas désactivé, par conséquent, les fusibles du chipset (FPF) ont été laissés dans un état indéfini. Oui, Intel BG n'est ni activé ni désactivé dans de tels cas.
Il s'agit des systÚmes suivants (en ce qui concerne Intel BG et ce qui sera exposé par la suite dans l'article, nous parlerons de systÚmes avec une microarchitecture processeur Haswell et supérieure) :
- tous les produits Gigabyte;
- tous les produits MSI;
- 21 modĂšles de ordinateurs portables Lenovo et 4 modĂšles de serveurs Lenovo.
Bien sûr, nous avons signalé cette découverte à ces vendeurs ainsi qu'à la société Intel.
Une réponse adéquate n'a suivi que de Lenovo, qui a reconnu le problÚme et .
Gigabyte semble avoir reçu l'information concernant la vulnérabilité, mais n'a pas commenté.
Communication avec MSI cela a complÚtement stagné sur notre demande d'envoyer sa clé PGP ouverte (afin d'envoyer la notification de sécurité de maniÚre chiffrée). Ils ont déclaré qu'ils "sont un fabricant de matériel, et ne produisent pas de clés PGP".
Mais passons aux choses sĂ©rieuses. Ătant donnĂ© que les fusibles sont laissĂ©s dans un Ă©tat non dĂ©fini, l'utilisateur (ou un attaquant) peut les programmer lui-mĂȘme (la partie la plus complexe est ). Pour ce faire, il faut effectuer les actions suivantes.
1. DĂ©marrer sous Windows (en fait, les actions dĂ©crites ci-dessous peuvent Ă©galement ĂȘtre effectuĂ©es sous Linux, si une alternative Ă l'Intel STK est dĂ©veloppĂ©e pour le systĂšme d'exploitation requis). En utilisant l'outil MEinfo, s'assurer que les fusibles sur ce systĂšme ne sont pas programmĂ©s.

2. Lire le contenu de la mémoire flash à l'aide de l'outil Flash Programming Tool.

3. Ouvrir l'image lue avec n'importe quel éditeur de BIOS UEFI, apporter les modifications nécessaires (par exemple, implémenter un rootkit), créer/modifier les structures KEYM et IBBM existantes dans la région ME.


Sur l'image, la partie publique de la clé RSA est mise en surbrillance, dont le hachage sera programmé dans les fusibles du chipset avec le reste de la configuration Intel BG.
4. Utiliser Flash Image Tool pour construire une nouvelle image du firmware (en définissant la configuration Intel BG).

5. Ăcrire la nouvelle image dans la mĂ©moire flash Ă l'aide de Flash Programming Tool, s'assurer avec MEinfo que la rĂ©gion ME contient maintenant la configuration Intel BG.

6. Fermer le mode manufacturing mode avec Flash Programming Tool.

7. Le systÚme redémarrera, aprÚs quoi MEinfo permettra de s'assurer que les FPF sont maintenant programmés.

Ces actions activeront dĂ©finitivement Intel BG sur ce systĂšme. Cela ne pourra pas ĂȘtre annulĂ©, ce qui signifie que :
- la mise Ă jour du BIOS UEFI sur ce systĂšme ne pourra ĂȘtre effectuĂ©e que par le dĂ©tenteur de la partie privĂ©e de la clĂ© racine (c'est-Ă -dire celui qui a activĂ© Intel BG);
- si on restaure ce systĂšme avec le firmware d'origine, par exemple, Ă l'aide d'un programmateur, il ne s'allumera mĂȘme pas (rĂ©sultat de la politique d'application en cas d'erreur de vĂ©rification);
- pour se débarrasser de ce BIOS UEFI, il faut remplacer le chipset avec les FPF programmés par un "propre" (c'est-à -dire ressouder le chipset, si vous avez accÚs à une station de soudage infrarouge coûteuse comme une voiture, ou simplement remplacer la carte mÚre).
Pour comprendre ce qu'un tel rootkit peut causer, il faut Ă©valuer ce qui permet l'exĂ©cution de son propre code dans l'environnement UEFI BIOS. Par exemple, dans le mode le plus privilĂ©giĂ© du processeur â SMM. Un tel rootkit peut avoir les propriĂ©tĂ©s suivantes :
- s'exécuter parallÚlement au systÚme d'exploitation (il est possible de configurer un traitement basé sur la génération d'une interruption SMI, qui sera déclenchée par un minuteur) ;
- avoir tous les avantages d'ĂȘtre en mode SMM (accĂšs complet au contenu de la mĂ©moire vive et aux ressources matĂ©rielles, invisibilitĂ© par rapport au systĂšme d'exploitation) ;
- le code logiciel du rootkit peut ĂȘtre en forme chiffrĂ©e et ĂȘtre dĂ©chiffrĂ© lors du lancement en mode SMM. Comme clĂ© pour le chiffrement, on peut utiliser n'importe quelles donnĂ©es accessibles uniquement en mode SMM. Par exemple, le hachage dâun ensemble dâadresses dans le SMRAM. Pour obtenir cette clĂ©, il faudra accĂ©der au SMM. Cela peut ĂȘtre fait de deux maniĂšres. Trouver un RCE dans le code SMM et lâexploiter, ou ajouter son propre module SMM dans le BIOS, ce qui est impossible, car nous avons activĂ© Boot Guard.
Ainsi, cette vulnérabilité permet à un attaquant :
- de créer un rootkit caché, indétectable et de destination inconnue dans le systÚme ;
- d'exĂ©cuter son code sur l'un des cĆurs de la puce Ă l'intĂ©rieur d'Intel SoC, Ă savoir, sur Intel ISH (jetons un Ćil Ă l'image).


Bien que les capacités du sous-systÚme Intel ISH ne soient pas encore pleinement explorées, il représente un vecteur d'attaque intéressant sur Intel ME.
Conclusions
- L'étude a permis de produire une description technique du fonctionnement de la technologie Intel Boot Guard. Un inconvénient de quelques mystÚres dans le modÚle Intel de sécurité par l'obscurité.
- Un scénario d'attaque a été présenté, permettant de créer un rootkit indélete dans le systÚme.
- Nous avons vu que les processeurs Intel modernes peuvent exĂ©cuter de nombreux codes propriĂ©taires avant mĂȘme le dĂ©marrage du BIOS.
- Les plates-formes basĂ©es sur l'architecture Intel 64 deviennent de moins en moins adaptĂ©es Ă l'exĂ©cution de logiciels libres : vĂ©rification matĂ©rielle, nombre croissant de technologies et sous-systĂšmes propriĂ©taires (trois cĆurs dans la puce SoC : x86 ME, x86 ISH et ARC PMC).
Atténuations
Les fournisseurs qui laissent intentionnellement le mode manufacturing ouvert doivent impĂ©rativement le fermer. Pour lâinstant, ils ferment les yeux et les nouveaux systĂšmes Kaby Lake le montrent.
Les utilisateurs peuvent dĂ©sactiver eux-mĂȘmes Intel BG sur leurs systĂšmes (qui sont sujets Ă cette vulnĂ©rabilitĂ©) en exĂ©cutant l'outil Flash Programming Tool avec le paramĂštre -closemnf. Au prĂ©alable, il convient de s'assurer (Ă l'aide de MEinfo) que la configuration d'Intel BG dans la rĂ©gion ME prĂ©voit bien la dĂ©sactivation de cette technologie aprĂšs programmation dans les FPF.
Source : habr.com
