Contornando o BitLocker no Windows 11 com dump de memória
(noinitrd.github.io)- Demonstração em um ambiente Windows 11 24H2 que usa Memory-Dump-UEFI para fazer dump da RAM, encontrar a FVEK, a chave de criptografia de volume completo, e acessar um volume protegido pelo BitLocker
- Se um invasor tiver acesso físico ao dispositivo, pode mirar na chave que permanece na RAM logo após uma reinicialização, mas quanto maior for o tempo sem energia, maior o risco de corrupção do conteúdo da RAM
- A demonstração usou um curto nos pinos de reset (reset pins) da placa-mãe para reiniciar sem perda de energia, e deixou casos de bypass do Secure Boot fora do escopo da demo
- Nos dumps do Windows 11, a FVEK foi encontrada sob as tags
dFVEeNone, em vez deFVEcdo Windows 7 eCngbdo Windows 8.1/10 - Mesmo que a Microsoft tente destruir chaves com funções como
SymCryptSessionDestroy, a chave pode permanecer no heap; por isso, a depuração em nível de kernel é a abordagem mais direta para analisar a implementação do BitLocker
Escopo da demonstração de bypass do BitLocker no Windows 11
- O alvo é o Windows 11 version 24H2, e o método extrai da memória a FVEK, a chave de criptografia de volume completo do BitLocker
- Foi usado o aplicativo UEFI Memory-Dump-UEFI para fazer dump do conteúdo da RAM
- A premissa central é que o invasor consiga ter acesso físico ao dispositivo
Condições para que o dump da RAM funcione
- A RAM de uma instância do Windows executada recentemente pode conter informações sensíveis como a FVEK
- Quando a energia é cortada, o conteúdo da RAM se corrompe rapidamente; portanto, é preciso minimizar o tempo em que o computador fica totalmente desligado durante a reinicialização
- Métodos para reduzir a corrupção da RAM incluem resfriamento físico ou manutenção de uma fonte de alimentação externa; na demonstração, os pinos de reset da placa-mãe foram colocados em curto para reiniciar sem perda de energia
- Secure Boot é um padrão de segurança que restringe o que pode ser executado na inicialização do dispositivo, mas já houve casos de bypass com shim e similares; esta demo não aborda isso em detalhes
Preparação do USB bootável e criação do dump
- O USB bootável precisa de um dispositivo de armazenamento maior que a capacidade de RAM do sistema-alvo
- O script
flashimage.shsimplifica a preparação do aplicativo bootável - Os procedimentos para criar e usar o aplicativo de boot estão documentados em MemoryDumpUEFI
- A maior probabilidade de encontrar a FVEK ocorreu ao reiniciar quando o Windows estava carregando, mas antes de a tela de login aparecer
- Após inicializar imediatamente pelo dispositivo USB com Memory-Dump-UEFI, execute
app.efino UEFI shell- O modo de execução tem etapas adicionais no README do aplicativo
- O tempo de dump varia conforme a quantidade de RAM e a velocidade do dispositivo USB
- Para evitar gravação no drive errado, é melhor desconectar outros dispositivos de armazenamento USB
Processamento dos arquivos de dump e ferramentas de busca
- O Memory-Dump-UEFI pode criar vários arquivos de dump
- Para estar em conformidade com a especificação UEFI, é necessário usar o sistema de arquivos FAT32, que tem limite de tamanho de arquivo de 4 GB
concatDumps, no diretóriotools, combina vários dumps em um único arquivo em ordem cronológica- Como o dump contém os dados brutos que estavam na memória naquele momento, é possível inspecioná-lo de forma mais legível com ferramentas como
xxd searchMempesquisa padrões hexadecimais dentro do dump e permite ir até o offset do local encontrado
Pool tags e localização da FVEK
- Pool tag é um identificador de 4 caracteres que indica a qual pool de memória do kernel do Windows algo pertence
- Pools de memória alocados pelo kernel do Windows podem ser bons locais para procurar informações sensíveis
pooltag.txtcontém uma lista de pool tags e informações sobre a finalidade de cada uma- Em versões anteriores do Windows, a localização da chave do BitLocker era diferente
- No Windows 7, era possível recuperar a chave na pool tag
FVEc, correspondente a alocações de criptografia defvevol.sys - No Windows 8.1 e no Windows 10, a chave podia ser encontrada na pool de memória com a tag
Cngb, correspondente ao móduloksecdd.sys
- No Windows 7, era possível recuperar a chave na pool tag
- Nos dumps do Windows 11, a chave não foi encontrada em
FVEcnem emCngb; em vez disso, a FVEK foi encontrada em dois locais- O primeiro fica sob a pool tag
dFVE, que representa memória alocada pordumpfve.sys dumpfve.sysestá relacionado ao filtro de crash dump de criptografia de volume completo do BitLocker drive encryption- A localização
dFVEfoi o ponto em que a chave foi encontrada de forma mais fácil e consistente - Nesse local, a chave era precedida por
0x0480, que indica o tipo de criptografia e, no ambiente da demonstração, significa XTS-AES-128 - O segundo fica sob a tag
None, relacionada a chamadasExAllocatePool - Nesse local, a primeira metade da chave aparecia duas vezes, e a segunda metade uma vez
- O primeiro fica sob a pool tag
Acessando o volume BitLocker com a FVEK
- A chave obtida deve ser precedida pelo valor do algoritmo de criptografia em uso
- No exemplo, o valor do algoritmo
0x8004foi prefixado à chave no formato little endian, como0480 - O valor resultante pode ser salvo em um arquivo e usado como
output.fvek - O conjunto de ferramentas dislocker é recomendado para verificar o algoritmo e os valores necessários e para desbloquear a partição protegida pelo BitLocker
- Se o procedimento estiver correto, é possível acessar os dados do volume protegido pelo BitLocker com
output.fvek
Análise da implementação do BitLocker e chaves remanescentes no heap
- A forma mais direta de entender a implementação do BitLocker é a depuração em nível de kernel usando
windbg - A depuração de kernel pode ser feita de maneira relativamente simples com uma máquina virtual ou com um cabo USB 3.0 A/A cruzado
- Acompanhar passo a passo o processo de boot do Windows e observar o comportamento do BitLocker ajudou a encontrar a chave
- A Microsoft tenta destruir chaves com funções como
SymCryptSessionDestroy, mas a chave pode permanecer no heap, de modo que nem todas as chaves são removidas
Links de referência
- recovering-bitlocker-keys-on-windows-8-1-and-10: material sobre recuperação de chaves do BitLocker no Windows 8.1 e Windows 10
- dislocker: conjunto de ferramentas usado para acessar volumes BitLocker
- SymCrypt: biblioteca de criptografia da Microsoft
- libbde: biblioteca relacionada ao BitLocker Drive Encryption
- pooltag.txt: lista de pool tags do Windows
- An Introduction to Pool Tags: material introdutório da Microsoft sobre pool tags
1 comentários
Opiniões no Hacker News
Vejo o BitLocker como tendo sua maior vantagem ao usar TPM (PCR 7+11)+PIN
Sem o PIN, não deveria ser possível ler a FVEK, então isso poderia mitigar esse ataque; e, se o BitLocker foi implementado corretamente, quando o PIN é digitado errado muitas vezes, o TPM entra em modo de bloqueio contra ataques de dicionário
Há meses venho tentando fazer a mesma configuração no Linux, mas systemd-cryptsetup/cryptenroll é para LUKS, e meu caso é criptografar alguns diretórios sensíveis (chaves de secure boot e /home) com fscrypt em um eMMC interno lento
Quando se passa do básico, sinto que programar TPM é extremamente difícil: vincular ao PCR 7, vincular ao PCR 11 que muda a cada atualização de kernel/init/cmdline, usar PIN em vez de AuthValue, usar a mesma política de autorização para zerar o contador de bloqueio DA no login, mantendo também uma senha longa/AuthValue para redefinição manual, e ainda fazer bater a assinatura do PCR 11 e a chave pública fornecidas pelo systemd-stub
Fora guias básicos de TPM, quase não há material; se houver algum especialista, eu gostaria de ajuda. É um projeto pessoal, mas se um dia eu terminar, pretendo escrever sobre isso
Vale considerar esse método como mecanismo de recuperação
Um dos motivos de haver pouca gente mexendo com TPM open source por hobby é que existem muitas alternativas que resolvem desejos parecidos com muito menos dificuldade
Se você quer vincular chaves criptográficas importantes ao hardware, basta comprar uma Yubikey; se a senha de criptografia de disco do notebook é incômoda, use o modo de espera ao fechar a tampa em vez de desligar completamente
Se a senha de login incomoda, há leitores de impressão digital ou Yubikeys com autenticação biométrica; e, se for preciso inicializar sem senha, como em um quiosque sem supervisão ou laboratório de informática de escola, coloque o equipamento em uma caixa de metal resistente e prenda-o à parede com uma corrente
Se um servidor de datacenter precisa inicializar sem supervisão, leve-o para um datacenter com segurança física confiável; e, se ainda estiver preocupado, faça com que ele só inicialize quando estiver na rede correta, usando Dropbear ou Tang
Se você está mexendo com TPM em um homelab por hobby, é bom verificar se trabalhar com TPM é mesmo divertido; é bem provável que descubra que não é
Caso contrário, não seria preciso digitar o PIN toda vez que um bloco de disco fosse descriptografado? O impacto de desempenho de chamar o TPM a cada operação de disco também seria grande
Como esse ataque lê a chave da RAM, não entendo como o PIN do TPM seria uma mitigação
Se você digitar uma senha antes da inicialização e essa senha tiver de ser combinada com uma chave do TPM para abrir a unidade, isso ajuda em um cenário posterior em que a chave do TPM seja descoberta
Dito isso, é difícil ter certeza de quanto cada medida ajudaria contra esse ataque. Para o SO manter acesso de leitura/gravação à unidade, ele precisa guardar a chave em algum lugar; então, se apenas mudarmos onde a chave fica, a recuperação desse tipo de dado da RAM será possível na maioria dos cenários
Pelo que lembro, nos dispositivos Apple a chave não sai da área segura (enclave), então eles provavelmente não são vulneráveis a esse ataque. O TPM 3.0 parece precisar ficar muito mais próximo disso
Em ThinkPads, é possível usar impressão digital em vez de senha de power-on, e isso pode tornar o aparelho praticamente inútil para um ladrão, então prefiro essa configuração ao PIN do BitLocker
Claro que a senha de power-on e a autenticação por impressão digital são tão fortes quanto o TPM, mas o BitLocker TPM+PIN também não é assim?
A migração para TPM depois de softwares de criptografia open source bem-sucedidos me parece estranha. Soa como: existe um armazenamento superseguro fornecido por grandes empresas, então não se preocupem nem façam perguntas
Suspeito que necessariamente exista um backdoor que permita a agências de inteligência baixar todos os PINs e senhas e acessar os dados
Fundamentalmente, não entendo muito bem o modelo de segurança do BitLocker
Na maioria das instalações, parece que basta apertar o botão de energia para inicializar no Windows
Então, se alguém roubar um dispositivo com um disco rígido criptografado, basta ligá-lo? Imagino que não seja assim, mas ao mesmo tempo não sei como esse ataque específico é impedido
Acho que devo presumir que o tráfego do barramento SPI é criptografado e que a chave não pode ser despejada desse jeito, mas, de qualquer forma, parece que a máquina entrega a chave com bastante facilidade
O LUKS pelo menos tem um prompt de senha para desbloquear a unidade
Curiosamente, a Microsoft não usa criptografia de parâmetros do TPM e, por isso, a cada um ou dois anos algum pesquisador de segurança monta e demonstra um dispositivo de sniffing de TPM
O LUKS também depende da configuração. O Linux também pode ser configurado aqui da mesma forma que o Windows, e eu configurei assim meu servidor doméstico de segurança por vídeo porque ele precisa reiniciar silenciosamente. Sei que ele fica vulnerável a ataques de boot a quente/frio e à superfície de ataque de software, mas, se alguém simplesmente retirar a unidade, ela estará segura
O Windows também pode ser configurado para exigir uma senha ou para usar uma chave selada pelo TPM com autenticação por PIN
Tirando a criptografia de parâmetros e o problema de sniffing do barramento, o BitLocker desloca o limite de “qualquer um consegue ler a unidade” para “é preciso fazer um ataque em nível de plataforma para obter o conteúdo da memória ou hackear serviços que rodam na tela de login”
Como ele impede muito bem situações como roubo de dados financeiros de discos rígidos reutilizados aleatoriamente, na prática é uma melhoria de segurança bem razoável
É preciso algum desvio, como uma vulnerabilidade de execução remota de código ou inicializar com um bootloader antigo e vulnerável do Windows. Como a unidade está bloqueada, aquele desvio comum de “trocar o teclado virtual por cmd.exe” não funciona
Sem BitLocker, você pode conectar a unidade do Windows em outro PC e ver todos os arquivos. Com BitLocker, é preciso lidar com software vulnerável da Microsoft, falhas, memória despejada e coisas do tipo — e mesmo assim nem sempre funciona
Se configurar o BitLocker no modo TPM+PIN, nem isso dá para fazer, porque não há senha para abrir o TPM. Também é possível deixar o BitLocker em modo somente senha, mas isso é muito mais vulnerável a força bruta
O LUKS é parecido: hoje em dia, a maioria das distribuições Linux oferece suporte a TPM e TPM+PIN
Se você tentar reiniciar em modo de segurança, em outro SO, em um utilitário de atualização de firmware etc., será necessário informar a chave de recuperação do BitLocker
Não sei bem como funciona internamente o caso de “hackear” um sensor de impressão digital ou uma webcam de reconhecimento facial
É preciso assumir que o TPM não tem vulnerabilidade de extração de chave
O ponto central é quando ele está desligado
Em criptografia de unidade de uso geral, o TPM é lento demais para descriptografar os dados em massa de fato; no fim, o SO acaba tendo uma chave que pode ser extraída
Na edição Pro, também é possível exigir uma etapa interativa na inicialização via Política de Grupo. Funciona mesmo sem TPM e, nesse caso, pede a senha a cada inicialização
Isto pode ser completamente impedido por https://trustedcomputinggroup.org/resource/pc-client-work-gr...
Quando ativado, se o SO não foi encerrado normalmente e portanto não teve chance de apagar as chaves de criptografia, o firmware para antes da próxima inicialização e limpa a RAM
Fico curioso se o Windows não usa isso ou se o sistema testado não o implementava
Lá diz que “o BitLocker usa a TCG Reset Attack Mitigation, também conhecida como bit MOR (Memory Overwrite Request), antes de extrair chaves para a memória”
Dito isso, não confio nem um pouco na maioria das implementações de plataforma. Nunca vi uma plataforma UEFI que chegasse perto de implementar isso direito, de qualquer forma
Seria interessante saber qual plataforma esse pesquisador usou e se ela afirma oferecer suporte ao bit MOR
Basta ver como a Team Tweezers explorou o Wii original
A mitigação de verdade é o recurso de criptografia de memória das CPUs modernas. Como fica dentro do die, uma pinça não alcança; basta apagar a chave, então a remoção é instantânea e é muito difícil interferir mesmo que ela tenha sobrevivido a um ciclo de energia
Idealmente, a chave deveria permanecer apenas dentro do cache SRAM da CPU e nunca sair do die da CPU
Sou a pessoa que escreveu o post. Se tiverem perguntas, podem me mandar mensagem por esta conta
Foi um trabalho muito divertido, e agradeço pelo grande interesse
Apresentação da 38C3 relacionada ao bypass do BitLocker no Windows 11: https://media.ccc.de/v/38c3-windows-bitlocker-screwed-withou...
É bastante sabido que o BitLocker só protege adequadamente um computador desligado, e mesmo assim apenas quando está configurado para exigir uma senha de inicialização
[0] https://en.wikipedia.org/wiki/BitLocker#TPM_alone_is_not_eno...
O Windows tem uma opção de criptografia de memória proposta junto com a compactação de memória
Tanto a Intel quanto a AMD estão trabalhando para colocar esse recurso nas CPUs
Porém, o alvo parece ser servidores que executam várias máquinas virtuais, não notebooks
Não seria surpreendente se, em breve, “máquinas virtuais” criptografadas fossem usadas como meio de armazenar esses segredos. O que falta é suporte de hardware amplamente comum em plataformas de consumo
No entanto, ataques anteriores por canal lateral em CPUs mostraram que até memória criptografada pode ser atacada (https://www.usenix.org/conference/usenixsecurity21/presentat...). Eles miram o cache quando a CPU descriptografa a memória para operar normalmente
Isso ajudaria a neutralizar dumps de memória, mas RAM criptografada não acabaria com o despejo de chaves da memória. Especialmente contra atacantes pacientes ou altamente qualificados
https://techcommunity.microsoft.com/blog/windowsosplatform/m...
A compactação de memória existe há muito tempo, pelo menos desde o Windows 10 RTM. Todos os principais sistemas operacionais implementaram esse recurso, mas ele não tem relação com segurança
Artigo relacionado: burlando o BitLocker em notebooks Lenovo com um analisador lógico barato
https://news.ycombinator.com/item?id=37249623
Em ataques que dependem de ler o dump de memória da máquina-alvo, fico curioso sobre o quão realista seria, com acesso físico, usar um dispositivo interposer que copiasse ou modificasse os dados que entram e saem da RAM
Penso em algo como o antigo “Action Replay” para Gameboy, que permitia cheats modificando a memória carregada ou executada do cartucho do jogo para o sistema. Você encaixava o cartucho no Action Replay e o Action Replay no Gameboy
Seria possível fazer algo parecido entre a RAM e a placa-mãe? Encaixar a RAM no dispositivo, encaixar o dispositivo na placa-mãe e então observar leituras/gravações de memória para capturar o estado da memória em um momento arbitrário
Assim seria possível evitar o incômodo de desligar manualmente e torcer para que os dados necessários ainda estejam lá
Não sou engenheiro elétrico, então talvez a proposta seja completamente impossível. As limitações de espaço físico e largura de banda certamente parecem grandes, mas seria possível?
É difícil esperar que surja uma solução pronta de mercado
Pouca gente sabe que CPUs Intel/AMD lançadas nos últimos anos dão suporte à criptografia total de memória transparente
O conteúdo da RAM é criptografado com uma chave aleatória armazenada dentro do controlador de memória da CPU e gerada no reset
Normalmente isso vem desativado no BIOS, porque há uma pequena perda de desempenho de memória (0,1%~1%)
Mas esse ataque poderia ser bloqueado completamente