Chargement de Schrödinger approuvé. Intel Boot Guard

Chargement de Schrödinger approuvé. Intel Boot Guard
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 ZeroNights 2016 et de la 29e rĂ©union DefCon Russia (les deux prĂ©sentations ici).

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.

Chargement de Schrödinger approuvé. Intel Boot Guard
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.

Chargement de Schrödinger approuvé. Intel Boot Guard
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. 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

  1. Protection physique du contenu de la mémoire flash SPI par un cavalier write-protect;
  2. Protection de la projection de la région UEFI BIOS dans l'espace d'adressage du CPU à l'aide des registres PRx du chipset;
  3. 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;
  4. 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 cet article. Nous recommandons aux intĂ©ressĂ©s de consulter l'ensemble du cycle d'articles sur la sĂ©curitĂ© du BIOS UEFI de CodeRush.

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 :

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. deux articleMalgré 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.

Chargement de Schrödinger approuvé. Intel Boot Guard

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 :

Chargement de Schrödinger approuvé. Intel Boot Guard

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

  1. 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;
  2. 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.

Chargement de Schrödinger approuvé. Intel Boot Guard

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.

Chargement de Schrödinger approuvé. Intel Boot Guard

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 :

  1. À 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) ;
  2. 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.

Chargement de Schrödinger approuvé. Intel Boot Guard
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;
};

Chargement de Schrödinger approuvé. Intel Boot Guard
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;
};

Chargement de Schrödinger approuvé. Intel Boot Guard
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];
};

Chargement de Schrödinger approuvé. Intel Boot Guard
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];
};

Chargement de Schrödinger approuvé. Intel Boot Guard
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;
};

Chargement de Schrödinger approuvé. Intel Boot Guard
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.

Chargement de Schrödinger approuvé. Intel Boot Guard
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 a publié un patch.

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 de trouver l'Intel STK). 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.

Chargement de Schrödinger approuvé. Intel Boot Guard
2. Lire le contenu de la mémoire flash à l'aide de l'outil Flash Programming Tool.

Chargement de Schrödinger approuvé. Intel Boot Guard
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.

Chargement de Schrödinger approuvé. Intel Boot Guard
Chargement de Schrödinger approuvé. Intel Boot Guard
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).

Chargement de Schrödinger approuvé. Intel Boot Guard
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.

Chargement de Schrödinger approuvé. Intel Boot Guard
6. Fermer le mode manufacturing mode avec Flash Programming Tool.

Chargement de Schrödinger approuvé. Intel Boot Guard
7. Le systÚme redémarrera, aprÚs quoi MEinfo permettra de s'assurer que les FPF sont maintenant programmés.

Chargement de Schrödinger approuvé. Intel Boot Guard
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).

Chargement de Schrödinger approuvé. Intel Boot Guard
Chargement de Schrödinger approuvé. Intel Boot Guard
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

  1. 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é.
  2. Un scénario d'attaque a été présenté, permettant de créer un rootkit indélete dans le systÚme.
  3. Nous avons vu que les processeurs Intel modernes peuvent exĂ©cuter de nombreux codes propriĂ©taires avant mĂȘme le dĂ©marrage du BIOS.
  4. 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

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster