Usando gerenciadores de inicialização assinados para ignorar a proteção UEFI Secure Boot

Versão russa deste artigo.

1. Introdução

O firmware das placas-mãe dos computadores modernos funciona de acordo com a especificação UEFI e, desde 2013, eles suportam a tecnologia de autenticação de programas baixados e drivers de Inicialização Segura, projetados para proteger o computador de bootkits . O Secure Boot bloqueia a execução de código de programa não assinado ou não confiável: arquivos .efi de programas e gerenciadores de inicialização de sistemas operacionais, firmware de equipamento adicional (placas de vídeo OPROM, adaptadores de rede).
O Secure Boot pode ser desativado em qualquer placa-mãe da loja, mas um requisito físico para alterar suas configurações é uma presença física no computador. Você precisa acessar as configurações de UEFI quando o computador inicializar e somente então será possível desativar a tecnologia ou alterar suas configurações.

A maioria das placas-mãe é fornecida apenas com as chaves da Microsoft como confiáveis, e é por isso que os criadores do software de inicialização são obrigados a entrar em contato com a Microsoft para a assinatura dos gerenciadores de inicialização, passam por um procedimento de auditoria e justificam a necessidade de uma assinatura global do arquivo, se quiserem que a unidade ou a unidade flash funcione desnecessariamente. desative a Inicialização segura ou adicione manualmente sua chave em cada computador.
A Microsoft precisa assinar downloaders para desenvolvedores de distribuições Linux, hipervisores, discos de inicialização antivírus e programas de recuperação de computadores.

Eu queria criar uma unidade flash USB inicializável com vários softwares de recuperação de computador que inicializassem sem desativar o Secure Boot. Vamos ver como isso pode ser implementado.

Downloaders de Bootloader assinados

Portanto, para inicializar o Linux com o Secure Boot ativado, você precisa de um carregador de inicialização assinado. A Microsoft proibiu a assinatura de software licenciado sob a GPLv3 devido à proibição de tivoização pelas regras da licença, portanto o GRUB não poderá assinar .
Em resposta, a Linux Foundation lançou o PreLoader , e Matthew Garrett escreveu shim , pequenos gerenciadores de inicialização que verificam a assinatura ou o hash do próximo download. O PreLoader e o shim não usam certificados UEFI db , mas contêm um banco de dados de hashes permitidos (PreLoader) ou certificados (shim) dentro de si.
Ambos os programas, além de baixar automaticamente arquivos confiáveis, permitem baixar arquivos não confiáveis ​​anteriormente no modo Inicialização segura, mas exigem a presença física do usuário: na primeira inicialização, você precisa selecionar o certificado ou arquivo hash adicionado na interface gráfica, após o qual os dados são inseridos em uma variável NVRAM especial uma placa-mãe que não está disponível para alteração em um sistema operacional carregado. Os arquivos se tornam confiáveis ​​apenas para esses pré-carregadores de inicialização, e não para a Inicialização segura em geral, e você ainda não pode executá-los sem o PreLoader / shim.

Ações necessárias para executar um programa não confiável através do shim.
Ações necessárias ao iniciar um programa não confiável pela primeira vez através do shim.

Todas as atuais distribuições populares do Linux usam shim, devido ao suporte ao certificado, o que facilita a atualização do próximo carregador de inicialização sem a necessidade de interação do usuário. Normalmente, o shim é usado para executar o GRUB2, o carregador de inicialização mais popular no Linux.

GRUB2

Para impedir que os invasores façam negócios silenciosamente com a ajuda de um gerenciador de inicialização assinado de algum kit de distribuição, a Red Hat fez patches para o GRUB2 bloqueando as funções "perigosas" quando o Secure Boot foi ativado: insmod / rmmod, appleloader, linux (substituído por linuxefi), inicialização múltipla, xnu, memrw, iorw. O módulo chainloader, que carrega arquivos .efi arbitrários, foi complementado com seu próprio carregador .efi (PE), sem usar os comandos UEFI LoadImage / StartImage, bem como o código de validação dos arquivos baixados via shim, para que a capacidade de baixar arquivos confiáveis ​​para shim mas não confiáveis em termos de UEFI. Por que eles fizeram exatamente isso não está claro; O UEFI permite que você redefina (gancho) a função de verificar imagens baixadas, é assim que o PreLoader funciona e o calço próprio possui essa função , mas é desativado por padrão.

De uma forma ou de outra, o uso de um GRUB assinado de alguma distribuição Linux falhará. Existem duas maneiras de criar uma unidade flash USB inicializável universal que não requer a adição das chaves de cada arquivo baixado aos confiáveis:

  • Usando um GRUB modificado que baixa arquivos EFI por conta própria, sem verificar uma assinatura digital e sem bloquear módulos;
  • Usando seu próprio pré-carregador (segundo) que substitui as funções de verificação de assinatura digital UEFI (EFI_SECURITY_ARCH_PROTOCOL.FileAuthenticationState, EFI_SECURITY2_ARCH_PROTOCOL.FileAuthentication)

A segunda opção é preferível - os programas não confiáveis ​​baixados também poderão baixar programas não confiáveis ​​(por exemplo, você pode baixar arquivos através do UEFI Shell) e, na primeira versão, somente o GRUB pode baixar tudo. Modificamos o PreLoader , removendo o código extra e permitindo o lançamento de qualquer arquivo.

Total, a arquitetura da unidade flash é a seguinte:
______ ______ ______ ╱│ │ ╱│ │ ╱│ │ /_│ │ → /_│ │ → /_│ │ │ │ → │ │ → │ │ │ EFI │ → │ EFI │ → │ EFI │ │_______│ │_______│ │_______│ BOOTX64.efi grubx64.efi grubx64_real.efi (shim) (FileAuthentication (GRUB2) override) ↓↓↓ ↑ ↑ ______ ↑ ╱│ │ ║ /_│ │ ║ │ │ ═══════════╝ │ EFI │ │_______│ MokManager.efi (Key enrolling tool) 


Portanto, havia o Super UEFIinSecureBoot Disk .
Super UEFIinSecureBoot Disk - uma imagem de disco com o carregador de inicialização GRUB2, projetada para executar convenientemente programas efi e sistemas operacionais não assinados no modo UEFI Secure Boot.

O disco pode ser usado como base para a criação de uma unidade USB com utilitários de recuperação de computador, para iniciar várias distribuições ao vivo do Linux e WinPE, inicializando a partir da rede, sem desativar o Secure Boot nas configurações da placa-mãe, o que pode ser conveniente ao fazer a manutenção de computadores de outras pessoas ou empresas. laptops, por exemplo, com uma senha definida para alterar as configurações da UEFI.

A imagem consiste em três componentes: um pré-carregador de calço do Fedora (assinado com uma chave da Microsoft pré-instalada na grande maioria das placas-mãe e laptops), um pré-carregador Linux Foundation PreLoader modificado (para desativar a verificação de assinatura ao carregar arquivos .efi) e um carregador de inicialização GRUB2 modificado.

Durante a primeira inicialização de um disco em um computador com Inicialização Segura, você precisa selecionar um certificado no menu MokManager (iniciado automaticamente), após o qual o carregador de inicialização funcionará como se a Inicialização Segura estivesse desativada: o GRUB carrega qualquer arquivo .efi ou kernel Linux não assinado, programas baixados por EFI pode executar outros programas e drivers com uma assinatura ausente ou não confiável.

Para demonstrar a operacionalidade, a imagem contém Super Grub Disk (scripts para pesquisar e carregar sistemas operacionais instalados, mesmo se o carregador de inicialização estiver danificado), GRUB Live ISO Multiboot (scripts para inicialização conveniente do Linux LiveCD diretamente da ISO, sem desempacotamento e processamento preliminares), um Arquivo Linux (kernel e initrd em um arquivo, para recuperação do sistema) e vários utilitários UEFI.

A unidade é compatível com UEFI sem inicialização segura, além de computadores mais antigos com BIOS.


Downloaders assinados

Fiquei me perguntando se era possível contornar a necessidade de adicionar uma chave via calço na primeira inicialização. Talvez haja alguns downloaders assinados que permitem fazer mais do que os autores esperavam?
Como se viu - existem tais carregadores. Um deles é usado no Kaspersky Rescue Disk 18 - um disco de inicialização com software antivírus. O GRUB do disco permite carregar módulos (comando insmod), enquanto os módulos no GRUB permitem carregar o código executável regular. O pré-carregador de disco é nativo.

Obviamente, apenas porque o GRUB do disco não carrega código não confiável. É necessário modificar o módulo do carregador de cadeias para que o GRUB não use as funções UEFI LoadImage / StartImage, mas carregue o arquivo .efi na memória, execute a realocação, encontre o ponto de entrada e siga-o. Felizmente, quase todo o código necessário está no repositório GRUB com suporte ao Red Hat Secure Boot , o único problema: não há código de análise de cabeçalho PE , o cabeçalho analisa e retorna shim, em resposta a uma chamada de função por meio de um protocolo especial. Isso pode ser facilmente corrigido transferindo o código apropriado do shim ou do PreLoader para o GRUB.

Portanto, havia o Silent UEFIinSecureBoot Disk. A arquitetura de disco resultante é a seguinte:
  ______ ______ ______ ╱│ │ ╱│ │ ╱│ │ /_│ │ /_│ │ → /_│ │ │ │ │ │ → │ │ │ EFI │ │ EFI │ → │ EFI │ │_______│ │_______│ │_______│ BOOTX64.efi grubx64.efi grubx64_real.efi (Kaspersky (FileAuthentication (GRUB2) Loader) override) ↓↓↓ ↑ ↑ ______ ↑ ╱│ │ ║ /_│ │ ║ │ │ ═══════════╝ │ EFI │ │_______│ fde_ld.efi + custom chain.mod (Kaspersky GRUB2) 


Conclusão

Neste artigo, descobrimos que não há carregadores de inicialização confiáveis ​​suficientes assinados com uma chave da Microsoft, habilitando o modo Inicialização Segura.
Usando os arquivos assinados do Kaspersky Rescue Disk, conseguimos um download "silencioso" de qualquer arquivo .efi não confiável com o Secure Boot ativado, sem a necessidade de adicionar um certificado ao UEFI db ou deslocar o MOK.
Esses arquivos podem ser usados ​​tanto para boas ações (para fazer o download a partir de unidades flash USB) quanto para más (para instalar bootkits sem o conhecimento do proprietário do computador).
Suponho que o certificado Kaspersky não dure muito e será adicionado à lista global de certificados UEFI revogados , que serão instalados em computadores executando o Windows 10 via Windows Update, o que interromperá o carregamento do Kaspersky Rescue Disk 18 e do Silent UEFIinSecureBoot Disk. Vamos ver em quanto tempo isso vai acontecer.

Faça o download do Super UEFIinSecureBoot Disk: https://github.com/ValdikSS/Super-UEFIinSecureBoot-Disk
Faça o download do disco UEFIinSecureBoot silencioso na rede ZeroNet Git Center : http://127.0.0.1:43110/1KVD7PxZVke1iq4DKb4LNwuiHS4UzEAdAv/

Sobre a ZeroNet
O ZeroNet é um sistema muito poderoso para criar sites e serviços dinâmicos distribuídos descentralizados. Ao visitar um recurso, o usuário começa a baixar e distribuí-lo, como no BitTorrent. Ao mesmo tempo, é possível criar recursos completos: blogs com comentários, fóruns, hospedagem de vídeo, sites wiki, bate-papos, email, git.
O ZeroNet separa os conceitos de código e dados do site: os dados do usuário são armazenados em arquivos .json e, quando sincronizados, são importados para o banco de dados sqlite do site com um esquema padronizado, que permite fazer coisas impressionantes: pesquisa de texto local em todos os sites já abertos em milissegundos, automática analógico em tempo real do RSS para todos os sites de uma só vez.
Sistema padronizado de autenticação e autorização (semelhante ao OAuth), suporte para trabalhar atrás do NAT e através do Tor.
O ZeroNet é muito rápido, fácil de usar, possui uma interface moderna e recursos pequenos, mas muito convenientes, como a troca global de temas dia / noite nos sites.

Considero o ZeroNet um sistema muito subestimado e intencionalmente publico a versão Silent apenas no ZeroNet Git, para atrair novos usuários.

Source: https://habr.com/ru/post/pt446072/


All Articles