Verificação de integridade por hashes chega ao Kernel Linux 6.19 para builds reprodutíveis

Segurança e compilação reprodutível com a nova verificação por hashes no Kernel Linux 6.19!

Escrito por
Emanuel Negromonte
Emanuel Negromonte é Jornalista, Mestre em Tecnologia da Informação e atualmente cursa a segunda graduação em Engenharia de Software. Com 14 anos de experiência escrevendo sobre...
  • Assinaturas atreladas à máquina impediam builds reprodutíveis; o patch substitui isso por raízes de Árvores de Merkle.
  • Distribuições como Arch Linux, NixOS e SUSE terão pacotes do Kernel Linux 6.19 totalmente idênticos e verificáveis.
  • Desenvolvido por Thomas Weißschuh, o patch resolve o conflito histórico entre a segurança PKCS#7 e a reprodutibilidade.
  • O Kbuild passa a usar o alvo vmlinux.unstripped para calcular os hashes antes da linkagem final da imagem do sistema.
  • A nova funcionalidade chega na versão 6.19, impactando usuários assim que as distribuições ativarem o CONFIG_MODULE_HASHES.

O desenvolvedor Thomas Weißschuh enviou uma grande série de patches que introduz a checagem de integridade de módulos baseada em hashes no Kernel Linux 6.19. A mudança reformula a maneira como o sistema valida a autenticidade dos arquivos .ko, beneficiando diretamente mantenedores de distribuições e a comunidade de “reproducible builds” (compilações reprodutíveis). O patch resolve um conflito histórico entre segurança e a capacidade de compilar o kernel de forma idêntica em máquinas diferentes.

O ganho imediato é a eliminação da dependência de chaves de assinatura PKCS#7 geradas em tempo de compilação, que tornavam o arquivo final único para cada máquina. Com a nova abordagem, distribuições como Arch Linux, NixOS e SUSE podem fornecer kernels verificados e 100% reproduzíveis por terceiros.

O que isso significa na prática

Para o usuário comum ou sysadmin, carregar um módulo seguro no sistema continua funcionando da mesma forma, mas a engrenagem por trás mudou. Antes, para o kernel aceitar um driver e não acusar que ele estava “manchado” (tainted), o arquivo precisava ter uma assinatura digital anexada, criptografada com uma chave privada criada na compilação. O problema é que, se você tentasse recompilar o mesmo código, a chave gerada seria outra, e o arquivo final ficaria diferente do original distribuído.

Agora, o kernel pode simplesmente guardar uma lista matemática (“resumo” ou hash) de todos os módulos que foram construídos junto com ele. Quando o driver tenta ser carregado, o sistema apenas checa se o hash daquele arquivo consta na lista confiável gravada no núcleo principal. Se bater, o módulo é seguro e autêntico. Não há mais chaves secretas escondidas ou complexidade extra no empacotamento.

Detalhes da implementação

A alteração impacta primariamente os subsistemas de módulos e o Kbuild. O patch introduz o CONFIG_MODULE_HASHES, que incorpora a raiz de uma Árvore de Merkle (Merkle tree) com os hashes de todos os módulos compilados (in-tree) diretamente na imagem do vmlinux.

A implementação exige a adição de um novo tipo de assinatura lógica, o PKEY_ID_MERKLE, para diferenciar do tradicional PKEY_ID_PKCS7. Quando um módulo tenta ser carregado, a função module_hash_check() decodifica a prova de Merkle anexada ao fim do módulo e a valida contra a raiz armazenada.

A mudança mais complexa, no entanto, ocorreu na ordem de compilação (Kbuild). O patch resolve uma dependência circular: os arquivos .ko dependem de um vmlinux construído para a geração do BTF (BPF Type Format) e do modpost. Mas agora, o vmlinux também depende dos .ko prontos para calcular a Árvore de Merkle e embuti-la. A solução adotada foi utilizar o alvo vmlinux.unstripped para gerar o BTF dos módulos, permitindo extrair os hashes via o novo script scripts/modules-merkle-tree.c antes da linkagem final do vmlinux.

Curiosidades e bastidores da discussão

A discussão na LKML (Linux Kernel Mailing List) revelou tensões interessantes sobre arquitetura e trade-offs. O desenvolvedor Eric Biggers questionou se, com essa novidade, as assinaturas antigas (PKCS#7) ainda seriam necessárias, sugerindo que o foco total deveria ir para os hashes.

David Howells prontamente interveio, lembrando que a infraestrutura de verificação de assinaturas não serve apenas para os módulos embutidos na compilação principal, mas também para o kexec e para validar módulos compilados externamente de código fechado ou fora da árvore (out-of-tree), como os drivers proprietários da NVIDIA.

Além disso, houve um debate técnico refinado com Petr Pavlu sobre como o Kbuild deveria lidar com a dependência circular. Pavlu sugeriu expressar as dependências estritamente no nível do arquivo Makefile (vmlinux.unstripped -> módulos -> vmlinux), evitando injeções diretas no script bash de linkagem, uma sugestão que o autor do patch concordou em adotar nas próximas iterações.

Quando isso chega no meu PC?

A série de patches encontra-se em sua versão 4 e está passando por intenso escrutínio da comunidade. Dado o alinhamento positivo e o interesse declarado de grandes distribuições (SUSE, Proxmox), o recurso tem altas chances de ser consolidado (merged) durante a janela de integração do Kernel Linux 6.19. Uma vez lançado como Estável, os usuários notarão o impacto assim que suas distribuições atualizarem as ferramentas de empacotamento para aproveitar o CONFIG_MODULE_HASHES.

Compartilhe este artigo
Emanuel Negromonte é Jornalista, Mestre em Tecnologia da Informação e atualmente cursa a segunda graduação em Engenharia de Software. Com 14 anos de experiência escrevendo sobre GNU/Linux, Software Livre e Código Aberto, dedica-se a descomplicar o universo tecnológico para entusiastas e profissionais. Seu foco é em notícias, tutoriais e análises aprofundadas, promovendo o conhecimento e a liberdade digital no Brasil.