- 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.
