Contourner BitLocker sur Windows 11 avec un dump mémoire
(noinitrd.github.io)- Démonstration consistant à dumper la RAM dans un environnement Windows 11 24H2 avec Memory-Dump-UEFI afin de retrouver la FVEK, la clé de chiffrement complète du volume, et d’accéder à un volume protégé par BitLocker
- Si un attaquant peut accéder physiquement à l’appareil, il peut viser les clés encore présentes en RAM juste après un redémarrage, mais le risque de corruption du contenu de la RAM augmente à mesure que la coupure d’alimentation se prolonge
- La démonstration a utilisé une méthode consistant à court-circuiter les broches de reset (reset pins) de la carte mère pour redémarrer sans perte d’alimentation, et laisse hors du périmètre de la démo les cas de contournement de Secure Boot
- Dans le dump de Windows 11, la FVEK a été trouvée sous les tags
dFVEetNone, au lieu deFVEcsur Windows 7 etCngbsur Windows 8.1/10 - Même si Microsoft tente de détruire les clés avec des fonctions comme
SymCryptSessionDestroy, des clés peuvent rester dans le heap, ce qui fait du debugging au niveau noyau l’approche la plus directe pour analyser l’implémentation de BitLocker
Périmètre de la démonstration de contournement de BitLocker sur Windows 11
- La cible est Windows 11 version 24H2, avec une méthode consistant à extraire depuis la mémoire la FVEK, la clé de chiffrement complète du volume de BitLocker
- L’application UEFI Memory-Dump-UEFI est utilisée pour dumper le contenu de la RAM
- Le point clé est que l’attaquant doit avoir un accès physique à l’appareil
Conditions nécessaires au dump de la RAM
- La RAM de l’instance Windows exécutée récemment peut encore contenir des informations sensibles comme la FVEK
- Comme le contenu de la RAM se dégrade rapidement lorsque l’alimentation est coupée, il faut minimiser le temps pendant lequel l’ordinateur est totalement éteint durant le redémarrage
- Pour réduire cette dégradation, on peut refroidir physiquement la RAM ou maintenir une alimentation externe ; dans cette démonstration, le redémarrage est réalisé en court-circuitant les broches de reset de la carte mère sans perte d’alimentation
- Secure Boot est un standard de sécurité qui limite ce qui peut être exécuté au démarrage de l’appareil, mais il existe des cas de contournement via shim, qui ne sont pas détaillés dans cette démo
Préparation de la clé USB de démarrage et création du dump
- La clé USB de démarrage doit disposer d’une capacité de stockage supérieure à la quantité de RAM du système ciblé
- Le script
flashimage.shsimplifie la préparation de l’application bootable - La procédure de création et d’utilisation de l’application de démarrage est décrite dans MemoryDumpUEFI
- Les chances de trouver la FVEK étaient les plus élevées lorsque le redémarrage avait lieu pendant le chargement de Windows, mais avant l’apparition de l’écran de connexion
- Après avoir démarré immédiatement sur le périphérique USB avec Memory-Dump-UEFI, il faut exécuter
app.efidans le shell UEFI- Le mode d’exécution comporte des étapes supplémentaires dans le README de l’application
- Le temps nécessaire au dump dépend de la capacité de la RAM et de la vitesse du périphérique USB
- Pour éviter d’écrire sur le mauvais lecteur, mieux vaut débrancher les autres périphériques de stockage USB
Traitement des fichiers de dump et outils de recherche
- Memory-Dump-UEFI peut générer plusieurs fichiers de dump
- Pour respecter la spécification UEFI, il faut utiliser un système de fichiers FAT32, qui impose une limite de taille de fichier de 4 Go
concatDumps, dans le répertoiretools, fusionne plusieurs dumps en un seul dans l’ordre chronologique- Comme les dumps sont des données brutes présentes en mémoire à l’instant T, des outils comme
xxdpermettent de les examiner plus facilement searchMempermet de rechercher des motifs hexadécimaux dans le dump et de se déplacer jusqu’à l’offset où ils sont trouvés
Tags de pool et emplacement de la FVEK
- Un tag de pool (pool tag) est un identifiant de 4 caractères indiquant à quelle zone du pool mémoire noyau de Windows appartient un bloc
- Les pools mémoire alloués par le noyau Windows peuvent être de bons emplacements pour rechercher des informations sensibles
pooltag.txtcontient une liste de tags de pool ainsi que des informations sur leur usage respectif- L’emplacement des clés BitLocker différait selon les anciennes versions de Windows
- Sur Windows 7, il était possible de récupérer la clé depuis le tag de pool
FVEc, correspondant à des allocations de chiffrement defvevol.sys - Sur Windows 8.1 et Windows 10, on pouvait trouver la clé dans le pool mémoire du tag
Cngb, associé au moduleksecdd.sys
- Sur Windows 7, il était possible de récupérer la clé depuis le tag de pool
- Dans les dumps Windows 11, la clé n’a pas été trouvée sous
FVEcniCngb, mais la FVEK a été identifiée à deux endroits- Le premier est sous le tag de pool
dFVE, qui représente de la mémoire allouée pardumpfve.sys dumpfve.sysest lié au filtre de crash dump de chiffrement complet de volume de BitLocker drive encryption- L’emplacement
dFVEétait celui où la clé était trouvée le plus facilement et le plus régulièrement - À cet emplacement, la clé était précédée de
0x0480, qui indique le type de chiffrement et correspondait dans l’environnement de démonstration à XTS-AES-128 - Le second emplacement se trouvait sous le tag
None, lié à des appelsExAllocatePool - À cet emplacement, la première moitié de la clé apparaissait deux fois, et la seconde moitié une fois
- Le premier est sous le tag de pool
Accéder à un volume BitLocker avec la FVEK
- La clé récupérée doit être préfixée par la valeur de l’algorithme de chiffrement utilisé
- Dans l’exemple, la valeur d’algorithme
0x8004est ajoutée devant la clé au format little endian, soit0480 - La valeur ainsi construite peut être enregistrée dans un fichier pour être utilisée sous la forme
output.fvek - La suite d’outils dislocker est recommandée pour vérifier l’algorithme et les valeurs nécessaires, puis déverrouiller la partition protégée par BitLocker
- Si la procédure est correcte,
output.fvekpermet d’accéder aux données du volume protégé par BitLocker
Analyse de l’implémentation de BitLocker et clés résiduelles dans le heap
- La manière la plus directe de comprendre l’implémentation de BitLocker est d’utiliser
windbgpour faire du debugging au niveau noyau - Le debugging noyau peut être mis en place assez facilement dans une machine virtuelle ou via un câble USB 3.0 A/A croisé
- Suivre pas à pas le processus de démarrage de Windows et observer le fonctionnement de BitLocker a aidé à localiser les clés
- Microsoft essaie de détruire les clés avec des fonctions comme
SymCryptSessionDestroy, mais des clés peuvent rester dans le heap, ce qui empêche leur suppression complète
Liens de référence
- recovering-bitlocker-keys-on-windows-8-1-and-10 : documentation sur la récupération de clés BitLocker sur Windows 8.1 et Windows 10
- dislocker : suite d’outils utilisée pour accéder à un volume BitLocker
- SymCrypt : bibliothèque de chiffrement de Microsoft
- libbde : bibliothèque liée à BitLocker Drive Encryption
- pooltag.txt : liste des tags de pool Windows
- An Introduction to Pool Tags : introduction de Microsoft aux tags de pool
1 commentaires
Avis de Hacker News
Je pense que BitLocker est surtout avantageux quand on utilise TPM (PCR 7+11)+PIN
Sans le PIN, il ne devrait pas être possible de lire la FVEK, ce qui peut atténuer cette attaque, et si BitLocker l’a correctement implémenté, le TPM passe en mode de verrouillage anti-attaque par dictionnaire après trop de PIN erronés
Depuis des mois, j’essaie de mettre en place la même configuration sous Linux, mais systemd-cryptsetup/cryptenroll est destiné à LUKS, alors que je cherche à chiffrer quelques répertoires sensibles avec fscrypt (les clés de secure boot et /home) sur un eMMC interne lent
Dès qu’on dépasse les bases, le codage avec TPM me semble extrêmement difficile : se lier au PCR 7, se lier au PCR 11 qui change à chaque mise à jour du kernel/init/cmdline, utiliser un PIN plutôt qu’une AuthValue, utiliser la même politique d’autorisation pour réinitialiser le compteur de verrouillage DA à la connexion tout en conservant aussi un long mot de passe/AuthValue pour la réinitialisation manuelle, et faire correspondre la signature PCR 11 fournie par systemd-stub ainsi que la clé publique
En dehors des guides TPM de base, il y a très peu de documentation ; s’il y a des experts, j’aimerais avoir de l’aide. C’est un projet personnel, mais si je le termine un jour, je compte en faire un article
Cela vaut la peine d’envisager cette approche comme mécanisme de récupération
L’une des raisons pour lesquelles peu de gens bricolent l’open source autour de TPM comme hobby, c’est qu’il existe beaucoup d’alternatives qui répondent à des besoins similaires bien plus facilement
Si vous voulez lier des clés de chiffrement importantes au matériel, vous pouvez acheter une Yubikey ; si le mot de passe de chiffrement du disque d’un ordinateur portable est pénible, vous pouvez utiliser la veille à la fermeture du capot plutôt que l’arrêt complet
Si le mot de passe de connexion est gênant, il y a les lecteurs d’empreintes ou les Yubikey avec authentification biométrique ; et si une borne sans surveillance ou une salle informatique d’école doit démarrer sans mot de passe, vous pouvez la mettre dans un solide boîtier métallique et l’enchaîner au mur
Si un serveur de datacenter doit démarrer sans intervention, déplacez-le dans un datacenter doté d’une sécurité physique fiable, et si cela vous inquiète encore, utilisez Dropbear ou Tang pour qu’il ne démarre que lorsqu’il se trouve sur le bon réseau
Si vous manipulez TPM comme hobby dans un homelab, il vaut mieux vérifier si travailler avec TPM est vraiment amusant, et il y a de fortes chances que vous découvriez que non
Sinon, il faudrait saisir le PIN à chaque déchiffrement d’un bloc disque, non ? L’impact en performances d’un appel au TPM pour chaque opération disque serait aussi énorme
Comme cette attaque lit la clé en RAM, je ne vois pas en quoi un PIN TPM constitue une atténuation
Si l’on saisit un mot de passe avant le démarrage et que ce mot de passe doit être combiné avec une clé TPM pour ouvrir le lecteur, cela aide dans le cas où la clé TPM serait découverte par la suite
Cela dit, il est difficile de savoir dans quelle mesure telle ou telle contre-mesure aiderait face à cette attaque. Pour que l’OS conserve l’accès en lecture/écriture au lecteur, il doit garder la clé quelque part ; donc, dans la plupart des scénarios, ce type de récupération de données en RAM restera possible, il suffira de changer l’endroit où chercher la clé
Si je me souviens bien, sur les appareils Apple, la clé ne sort pas de l’enclave sécurisée, donc ils ne devraient pas être vulnérables à ce type d’attaque. TPM 3.0 devra, semble-t-il, se rapprocher beaucoup plus de ce modèle
Sur les ThinkPad, on peut utiliser l’empreinte digitale à la place du mot de passe de mise sous tension, et comme cela rend l’appareil presque inutilisable pour un voleur, je préfère cette configuration à un PIN BitLocker
Bien sûr, le mot de passe de mise sous tension et l’authentification par empreinte ne sont pas plus solides que le TPM, mais n’est-ce pas aussi le cas de BitLocker TPM+PIN ?
Après le succès des logiciels de chiffrement open source, le mouvement vers TPM me paraît étrange. Cela ressemble à : « il existe un coffre-fort ultra-sécurisé fourni par de grandes entreprises, ne vous inquiétez pas et ne posez pas de questions »
Je soupçonne fortement qu’il existe forcément une porte dérobée permettant aux agences de renseignement de télécharger tous les PIN et mots de passe et d’accéder aux données
Je ne comprends fondamentalement pas très bien le modèle de sécurité de BitLocker
Dans la plupart des installations, on dirait qu’il suffit d’appuyer sur le bouton d’alimentation pour démarrer Windows
Donc, si quelqu’un vole une machine avec un disque dur chiffré, il lui suffit de l’allumer ? Ce n’est sûrement pas le cas, mais en même temps je ne vois pas comment cette attaque précise est empêchée
Je suppose qu’il faut partir du principe que le trafic du bus SPI est chiffré et qu’on ne peut pas extraire la clé de cette façon, mais quoi qu’il en soit la machine semble donner la clé assez facilement
LUKS, au moins, affiche une invite de mot de passe pour déverrouiller le disque
Curieusement, Microsoft n’utilise pas le chiffrement des paramètres du TPM, et donc tous les un ou deux ans un chercheur en sécurité fabrique et démontre un dispositif de sniffing du TPM
LUKS dépend aussi de la configuration. Linux peut être configuré ici de la même manière que Windows, et mon serveur de vidéosurveillance domestique est réglé ainsi parce qu’il doit redémarrer sans intervention. Je sais qu’il est vulnérable aux attaques par démarrage à chaud/à froid et à la surface d’attaque logicielle, mais si quelqu’un se contente de retirer le disque, il est protégé
Windows peut aussi être configuré pour demander un mot de passe ou pour utiliser une clé scellée par le TPM avec authentification par PIN
Si l’on met de côté le chiffrement des paramètres et le problème du sniffing de bus, BitLocker déplace la frontière de « n’importe qui peut lire le disque » vers « il faut mener une attaque au niveau de la plateforme pour obtenir le contenu de la mémoire, ou compromettre un service qui tourne sur l’écran de connexion »
Comme il empêche très bien des scénarios du type vol de données financières sur des disques durs recyclés au hasard, c’est en pratique une amélioration de sécurité assez correcte
Il faut un contournement du type vulnérabilité d’exécution de code à distance, ou démarrage avec un ancien bootloader Windows vulnérable. Comme le disque est verrouillé, le contournement classique consistant à remplacer le clavier logiciel par cmd.exe ne fonctionne pas
Sans BitLocker, on peut brancher le disque Windows sur un autre PC et voir tous les fichiers. Avec BitLocker, il faut se débattre avec des logiciels Microsoft vulnérables, des failles, de la mémoire extraite, etc., et ça ne marche pas toujours
Si BitLocker est configuré en mode TPM+PIN, on ne peut même pas faire cela, puisqu’il n’y a pas de mot de passe pour ouvrir le TPM. On peut aussi laisser BitLocker en mode mot de passe seul, mais il est beaucoup plus vulnérable à la force brute
De même pour LUKS : la plupart des distributions Linux récentes prennent en charge TPM et TPM+PIN
Si vous essayez de redémarrer en mode sans échec, ou sur un autre OS, un utilitaire de mise à jour du firmware, etc., vous devez saisir la clé de récupération BitLocker
Je ne sais pas très bien comment fonctionnent en interne les cas où l’on « pirate » le capteur d’empreintes ou la webcam de reconnaissance faciale
Il faut supposer que le TPM n’a pas de vulnérabilité permettant d’extraire la clé
Le point essentiel, c’est quand la machine est hors tension
Pour le chiffrement de disque généraliste, le TPM est trop lent pour déchiffrer réellement les grandes quantités de données, donc l’OS finit par détenir une clé extractible
Dans l’édition Pro, on peut aussi exiger une étape interactive au démarrage via une stratégie de groupe. Cela fonctionne même sans TPM ; dans ce cas, un mot de passe est demandé à chaque démarrage
Cela peut être entièrement bloqué par https://trustedcomputinggroup.org/resource/pc-client-work-gr...
Lorsque cette fonction est activée, si l’OS ne s’est pas arrêté correctement et n’a pas eu l’occasion d’effacer les clés de chiffrement, le firmware s’arrête avant le démarrage suivant et efface la RAM
Je me demande si Windows ne l’utilise pas, ou si le système testé ne l’implémentait pas
Il est indiqué que « BitLocker utilise la TCG Reset Attack Mitigation, aussi appelée MOR bit (Memory Overwrite Request), avant d’extraire la clé en mémoire »
Cela dit, je ne fais absolument pas confiance à la plupart des implémentations de plateformes. Je n’ai jamais vu de plateforme UEFI qui se rapproche vraiment d’une implémentation correcte, sous quelque forme que ce soit
Il serait intéressant de savoir quelle plateforme ce chercheur a utilisée, et si cette plateforme prétend prendre en charge le MOR bit
Il suffit de regarder comment Team Tweezers a attaqué la Wii originale
La vraie mesure d’atténuation, ce sont les fonctions de chiffrement de la mémoire des CPU modernes. Comme c’est dans le die, les pincettes ne peuvent pas l’atteindre ; il suffit d’effacer la clé, ce qui est instantané, et même si elle survit à un cycle d’alimentation, il est très difficile d’interférer
Idéalement, la clé devrait rester uniquement dans le cache SRAM du CPU et ne jamais sortir du die du CPU
Je suis l’auteur du billet. Si vous avez des questions, vous pouvez m’écrire avec ce compte
Le travail a été vraiment amusant, et merci pour tout l’intérêt suscité
Présentation du 38C3 liée au contournement de BitLocker sous Windows 11 : https://media.ccc.de/v/38c3-windows-bitlocker-screwed-withou...
Il est assez bien connu que BitLocker ne protège correctement que les ordinateurs éteints, et encore seulement lorsque BitLocker est configuré pour demander un mot de passe au démarrage
[0] https://en.wikipedia.org/wiki/BitLocker#TPM_alone_is_not_eno...
Windows dispose d’une option de chiffrement de la mémoire proposée en même temps que la compression mémoire
Intel comme AMD travaillent à intégrer cette fonctionnalité dans leurs CPU
Cela dit, la cible semble être les serveurs faisant tourner plusieurs machines virtuelles, plutôt que les ordinateurs portables
Il ne serait pas surprenant que des « machines virtuelles » chiffrées soient bientôt utilisées comme moyen de stocker ce type de secrets. Ce qu’il faut, c’est une prise en charge matérielle largement généralisée sur les plateformes grand public
Cela dit, de précédentes attaques par canal auxiliaire sur les CPU ont montré que même la mémoire chiffrée pouvait être attaquée (https://www.usenix.org/conference/usenixsecurity21/presentat...). Elles ciblent le cache lorsque le CPU déchiffre la mémoire pour fonctionner normalement
Cela aiderait à neutraliser les dumps mémoire, mais la RAM chiffrée ne mettra pas fin à l’extraction de clés depuis la mémoire. C’est particulièrement vrai face à des attaquants patients ou très qualifiés
https://techcommunity.microsoft.com/blog/windowsosplatform/m...
La compression mémoire existe depuis longtemps, au moins depuis Windows 10 RTM. Tous les grands systèmes d’exploitation l’ont implémentée, mais elle n’a rien à voir avec la sécurité
Article connexe : contourner BitLocker sur un ordinateur portable Lenovo avec un analyseur logique bon marché
https://news.ycombinator.com/item?id=37249623
Dans une attaque qui repose sur la lecture du dump mémoire de la machine cible, avec un accès physique, je me demande dans quelle mesure un dispositif interposeur copiant ou modifiant les données qui entrent et sortent de la RAM serait réaliste
Je pense à quelque chose comme l’« Action Replay » pour les anciens Game Boy, qui permettait de tricher en modifiant la mémoire chargée ou exécutée depuis la cartouche de jeu vers le système. On branchait la cartouche dans l’Action Replay, puis l’Action Replay dans la Game Boy
Pourrait-on faire quelque chose de similaire entre la RAM et la carte mère ? Brancher la RAM dans un dispositif, brancher ce dispositif sur la carte mère, puis observer les lectures/écritures mémoire pour capturer l’état de la mémoire à un instant arbitraire
Cela éviterait la contrainte d’éteindre manuellement la machine en espérant que les données nécessaires soient encore présentes
Je ne suis pas ingénieur électricien, donc c’est peut-être une proposition totalement impossible. Les contraintes d’espace physique et de bande passante semblent clairement importantes, mais est-ce faisable ?
Il est difficile de s’attendre à voir apparaître une solution prête à l’emploi
Peu de gens savent que les CPU Intel/AMD sortis ces dernières années prennent en charge le chiffrement intégral de la mémoire transparent
Le contenu de la RAM est chiffré avec une clé aléatoire conservée dans le contrôleur mémoire du CPU et générée à la réinitialisation
En général, c’est désactivé dans le BIOS, car il y a une légère perte de performances mémoire (0,1 % à 1 %)
Mais cela peut bloquer complètement cette attaque