Données de configuration de démarrage (BCD)¶
Qu'est-ce que le magasin BCD ?¶
Windows Vista et les versions ultérieures conservent leur configuration de démarrage dans une ruche du Registre, le magasin BCD :
\Boot\BCD sur les systèmes BIOS, \EFI\Microsoft\Boot\BCD sur la partition système EFI des systèmes
UEFI. bcdedit et le programme d'installation de Windows le modifient ; le gestionnaire de démarrage le lit à chaque démarrage.
Le magasin contient des objets, chacun nommé d'après un GUID :
- le gestionnaire de démarrage Windows (
{bootmgr}), avec l'entrée par défaut, l'ordre d'affichage et le délai d'attente du menu ; sur les systèmes UEFI, également le gestionnaire de démarrage du firmware ({fwbootmgr}) avec l'ordre de démarrage du firmware ; - un chargeur de démarrage Windows par installation de Windows (y compris l'environnement de récupération), une application de reprise (hibernation) et le testeur de mémoire ;
- des objets de paramètres hérités (
{globalsettings},{bootloadersettings}, …) dont les paramètres sont hérités par les autres ; - des objets périphérique (options ramdisk de l'environnement de récupération).
Chaque objet possède des éléments : une description, un périphérique et un chemin, ainsi que des paramètres tels que
recoveryenabled, bootstatuspolicy, testsigning, nointegritychecks et safeboot.
Deux types d'attaques les modifient :
- Les ransomwares désactivent la récupération afin que le système ne puisse pas être réparé :
bcdedit /set {default} recoveryenabled Noetbcdedit /set {default} bootstatuspolicy ignoreallfailures. Certaines familles définissentsafebootafin que Windows redémarre en mode sans échec, où les produits de sécurité ne s'exécutent pas. - Les rootkits et pilotes non signés peuvent utiliser
testsigning onounointegritychecks onpour affaiblir les contrôles au démarrage. Ces paramètres ne prouvent pas à eux seuls qu'un rootkit s'est exécuté.
Meilleure conclusion : au moment de la collecte, cette entrée de démarrage avait ce paramètre. L'heure de dernière écriture de la clé de l'élément correspond au moment où le paramètre a été écrit pour la dernière fois.
Emplacement¶
\Boot\BCD BIOS systems (the system partition)
\EFI\Microsoft\Boot\BCD UEFI systems (the EFI system partition)
C:\Windows\System32\config\BCD-Template the template new stores are made from
Objects\{GUID}\Description Type
Objects\{GUID}\Elements\<type> Element
Le type d'un élément est composé de 8 chiffres hexadécimaux : sa classe (1 toutes les applications, 2 un type
d'application, 3 périphériques), son format (1 périphérique, 2 chaîne, 3 objet, 4 liste d'objets, 5
entier, 6 booléen, 7 liste d'entiers) et son numéro. La commande nomme les éléments tels que
Microsoft les documente (BcdLibraryBoolean_AutoRecoveryEnabled).
Les outils de collecte ne copient souvent pas le magasin : la partition système EFI n'est pas montée et \Boot
est masqué. Collectez-le explicitement ou montez la partition. -d lit également BCD-Template
(HiveType indique lequel) ; le modèle est ce à partir de quoi Windows démarre, et non le magasin avec lequel il amorce.
Précautions d'analyse¶
- Les paramètres sont hérités. Un chargeur de démarrage hérite des objets de sa
BcdLibraryObjectList_InheritedObjects(généralement{bootloadersettings}, qui hérite de{globalsettings}).RecoveryEnabled,TestSigning,NoIntegrityChecks,SafeBootetBootStatusPolicysont des valeurs stockées résolues (propres, sinon héritées), etInheritedindique lesquelles proviennent d'un autre objet. L'héritage est suivi sur huit niveaux au maximum, les cycles étant bornés. Un objet référencé peut être absent d'un magasin partiel. Des champs vides n'établissent pas une valeur par défaut effective de Windows. Le firmware et Secure Boot peuvent également empêcher une option stockée de prendre effet. - Non défini ne signifie pas désactivé. Un
RecoveryEnabledvide signifie que l'élément n'est pas présent ; la valeur par défaut de Windows s'applique. - Les horodatages sont propres à chaque élément. L'heure de la clé de chaque élément (
key_last_writtendansElements) correspond au moment où il a été écrit pour la dernière fois. Windows réécrit certains éléments lors des mises à jour et des mises à niveau ; comparez avec les horodatages des autres éléments. - Les périphériques sont partiellement décodés. Une partition GPT est indiquée par les GUID de sa partition et de son disque ;
un ramdisk par son objet d'options. Les autres périphériques ne conservent que leurs octets (
data_raw). - Les éléments non documentés (
0x15000065, la classe0x4…) n'ont pas de nom et conservent leurs octets.
Analyser avec Juntei¶
Usage: juntei parse-registry bcd <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find BCD hives and BCD-Template
-f, --file <FILE> Parse one BCD hive
--log1/--log2 Supply transaction logs explicitly
--no-logs Do not replay logs
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry bcd -f BCD -o bcd.csv
juntei parse-registry bcd -d evidence/ -t jsonl \
| jq 'select(.TestSigning == true or .NoIntegrityChecks == true or .RecoveryEnabled == false)'
Le résumé répertorie l'entrée par défaut de chaque magasin ainsi que chaque paramètre de signature de test, de contrôle d'intégrité, de récupération,
de stratégie d'état de démarrage (tout Ignore…) et de mode sans échec, avec l'heure à laquelle il a été défini ou l'objet
dont il est hérité.
Champs de sortie¶
| Champ | Interprétation |
|---|---|
Host, SourcePath, HiveType |
L'hôte, la ruche, et BCD ou BCD-Template. |
ObjectGUID, ObjectType, ObjectTypeName |
Le GUID de l'objet, son type (0x10200003) et sa nature (Windows boot loader, inherited settings for Windows boot loader, …). |
Description, Path, Device |
La description, le chemin de l'application et son périphérique (une partition et un disque GPT, ou l'objet d'options d'un ramdisk). |
IsDefault, DisplayOrder |
Si le gestionnaire de démarrage Windows le démarre par défaut, et sa position dans le menu de démarrage. |
RecoveryEnabled, TestSigning, NoIntegrityChecks |
recoveryenabled, testsigning, nointegritychecks, tels que résolus à partir du magasin. |
SafeBoot, BootStatusPolicy |
safeboot (Minimal, Network, DsRepair) et bootstatuspolicy (IgnoreAllFailures, …), avec le numéro. |
Inherited |
Lesquels de ces paramètres proviennent d'un autre objet, et de quel objet. |
Elements |
Chaque élément : son type, son nom, sa valeur, ses octets (pour les périphériques, les types non documentés et les données qui ne se décodent pas) et l'heure de sa clé. |
KeyLastWrittenUTC |
La dernière écriture de la clé de l'objet. |
TransactionLogStatus, LogsApplied |
Contexte de récupération du Registre. |
Problems |
Objets sans type, éléments dont les données ne correspondent pas à leur format. |
Stratégie d'investigation¶
- Vérifiez l'entrée par défaut et chaque chargeur de démarrage pour
TestSigning,NoIntegrityChecks,RecoveryEnabled = false, uneBootStatusPolicyde typeIgnore…etSafeBoot. - Utilisez les horodatages des éléments pour dater la modification, et corrélez avec
bcdedit.exedans Prefetch, Amcache, les événements de création de processus (4688, Sysmon 1) et le journal d'événements System. - Recherchez des entrées de démarrage ou des périphériques qui ne devraient pas être présents (un autre chemin de chargeur, un ramdisk), ainsi qu'une modification de l'entrée par défaut ou de l'ordre d'affichage.
- Comparez le magasin avec
BCD-Templateet avec un autre système de la même build.