Dados de configuração de inicialização (BCD)¶
O que é o repositório BCD¶
O Windows Vista e versões posteriores mantêm sua configuração de inicialização em um hive do Registro, o repositório BCD:
\Boot\BCD em sistemas BIOS, \EFI\Microsoft\Boot\BCD na partição de sistema EFI de sistemas
UEFI. O bcdedit e o instalador do Windows o editam; o gerenciador de inicialização o lê a cada inicialização.
O repositório contém objetos, cada um nomeado por um GUID:
- o gerenciador de inicialização do Windows (
{bootmgr}), com a entrada padrão, a ordem de exibição e o tempo limite do menu; em sistemas UEFI, também o gerenciador de inicialização do firmware ({fwbootmgr}) com a ordem de inicialização do firmware; - um carregador de inicialização do Windows por instalação do Windows (incluindo o ambiente de recuperação), um aplicativo de retomada (hibernação) e o testador de memória;
- objetos de configurações herdadas (
{globalsettings},{bootloadersettings}, …) cujas configurações os demais herdam; - objetos de dispositivo (opções de ramdisk do ambiente de recuperação).
Cada objeto tem elementos: uma descrição, um dispositivo e um caminho, e configurações como
recoveryenabled, bootstatuspolicy, testsigning, nointegritychecks e safeboot.
Dois tipos de ataque os alteram:
- Ransomware desativa a recuperação para que o sistema não possa ser reparado:
bcdedit /set {default} recoveryenabled Noebcdedit /set {default} bootstatuspolicy ignoreallfailures. Algumas famílias definemsafebootpara que o Windows reinicie no modo de segurança, no qual os produtos de segurança não são executados. - Rootkits e drivers não assinados podem usar
testsigning onounointegritychecks onpara enfraquecer as verificações durante a inicialização. Essas configurações, por si sós, não provam que um rootkit foi executado.
Melhor conclusão: no momento da coleta, esta entrada de inicialização tinha esta configuração. O horário da última gravação da chave do elemento é quando a configuração foi gravada pela última vez.
Localização¶
\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
O tipo de um elemento tem 8 dígitos hexadecimais: sua classe (1 todos os aplicativos, 2 um tipo de
aplicativo, 3 dispositivos), seu formato (1 dispositivo, 2 cadeia de caracteres, 3 objeto, 4 lista de objetos, 5
inteiro, 6 booleano, 7 lista de inteiros) e seu número. O comando nomeia os elementos como
a Microsoft os documenta (BcdLibraryBoolean_AutoRecoveryEnabled).
As ferramentas de coleta muitas vezes não copiam o repositório: a partição de sistema EFI não está montada, e \Boot
é oculto. Colete-o explicitamente ou monte a partição. -d também lê BCD-Template
(HiveType indica qual é); o modelo é o ponto de partida do Windows, não o repositório com o qual ele inicializa.
Cuidados para o analista¶
- As configurações são herdadas. Um carregador de inicialização herda dos objetos em sua
BcdLibraryObjectList_InheritedObjects(geralmente{bootloadersettings}, que herda{globalsettings}).RecoveryEnabled,TestSigning,NoIntegrityChecks,SafeBooteBootStatusPolicysão valores armazenados resolvidos (próprios ou, na falta deles, herdados), eInheritedindica quais vêm de outro objeto. A herança é seguida por no máximo oito níveis, com ciclos limitados. Um objeto referenciado pode estar ausente de um repositório parcial. Campos vazios não estabelecem um padrão efetivo do Windows. O firmware e o Secure Boot também podem impedir que uma opção armazenada tenha efeito. - Não definido não é desativado. Um
RecoveryEnabledvazio significa que o elemento não existe; aplica-se o padrão do Windows. - Os horários são por elemento. O horário da chave de cada elemento (
key_last_writtenemElements) é quando ele foi gravado pela última vez. O Windows regrava alguns elementos em atualizações e upgrades; compare com os horários dos outros elementos. - Os dispositivos são parcialmente decodificados. Uma partição GPT é indicada pelos GUIDs da partição e do disco;
um ramdisk, pelo seu objeto de opções. Outros dispositivos mantêm apenas seus bytes (
data_raw). - Elementos não documentados (
0x15000065, a classe0x4…) não têm nome e mantêm seus bytes.
Analisar com o 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)'
O resumo lista a entrada padrão de cada repositório e todas as configurações de assinatura de teste, verificação de integridade, recuperação,
política de status de inicialização (qualquer Ignore…) e modo de segurança, com o horário em que foram definidas ou o objeto
do qual são herdadas.
Campos de saída¶
| Campo | Interpretação |
|---|---|
Host, SourcePath, HiveType |
Host, o hive e BCD ou BCD-Template. |
ObjectGUID, ObjectType, ObjectTypeName |
O GUID do objeto, seu tipo (0x10200003) e o que ele é (Windows boot loader, inherited settings for Windows boot loader, …). |
Description, Path, Device |
A descrição, o caminho do aplicativo e seu dispositivo (uma partição e um disco GPT, ou o objeto de opções de um ramdisk). |
IsDefault, DisplayOrder |
Se o gerenciador de inicialização do Windows o inicializa por padrão e sua posição no menu de inicialização. |
RecoveryEnabled, TestSigning, NoIntegrityChecks |
recoveryenabled, testsigning, nointegritychecks, conforme resolvidos a partir do repositório. |
SafeBoot, BootStatusPolicy |
safeboot (Minimal, Network, DsRepair) e bootstatuspolicy (IgnoreAllFailures, …), com o número. |
Inherited |
Quais dessas configurações vêm de outro objeto, e de qual. |
Elements |
Todos os elementos: tipo, nome, valor, bytes (para dispositivos, tipos não documentados e dados que não são decodificados) e horário da chave. |
KeyLastWrittenUTC |
A última gravação da chave do objeto. |
TransactionLogStatus, LogsApplied |
Contexto de recuperação do Registro. |
Problems |
Objetos sem tipo, elementos cujos dados não correspondem ao seu formato. |
Estratégia de investigação¶
- Verifique a entrada padrão e todos os carregadores de inicialização quanto a
TestSigning,NoIntegrityChecks,RecoveryEnabled = false, umaBootStatusPolicyIgnore…eSafeBoot. - Use os horários dos elementos para datar a alteração e correlacione com
bcdedit.exeno Prefetch, no Amcache, nos eventos de criação de processos (4688, Sysmon 1) e no log de eventos System. - Procure entradas de inicialização ou dispositivos que não deveriam existir (outro caminho de carregador, um ramdisk) e uma entrada padrão ou ordem de exibição alteradas.
- Compare o repositório com
BCD-Templatee com outro sistema da mesma build.