Kernel Linux 7.3 ganha proteção contra travamentos causados por firmware UEFI

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

Nova proteção isola falhas do hardware!

O ciclo de desenvolvimento do Kernel Linux 7.3 recebeu uma modificação estrutural focada em estabilidade e resiliência de hardware. A árvore principal, mantida por Linus Torvalds, acaba de integrar um novo mecanismo de tempo limite (timeout) para os chamados EFI runtime services (serviços de execução EFI). O objetivo é simples, mas crítico: impedir que firmwares de placa-mãe defeituosos travem todo o sistema operacional de forma irreversível.

As correções foram lideradas pelo desenvolvedor Breno Leitão (da Debian e Meta) e enviadas por Ard Biesheuvel, atual mantenedor do subsistema EFI no Linux. Além do timeout, o pacote de atualizações inclui restrições contra o abuso de leitura de variáveis EFI e verificações de integridade para hardwares da Apple.

O que isso muda na prática

Quando o sistema operacional precisa se comunicar com o firmware da placa-mãe após o boot (por exemplo, para ler ou gravar variáveis na NVRAM, alterar a ordem de inicialização ou executar tarefas ACPI), ele faz chamadas ao UEFI. O problema é que, historicamente, se o firmware entrar em um loop infinito ou simplesmente parar de responder durante essa comunicação, o Linux fica esperando para sempre.

Como o kernel utiliza um bloqueio de segurança para evitar que múltiplas chamadas ao firmware ocorram ao mesmo tempo, esse travamento de uma única tarefa gera um efeito dominó. Processos começam a se acumular, o sistema relata um erro de “workqueue lockup” e, na maioria dos casos, o administrador é forçado a reiniciar o equipamento fisicamente.

Com a nova atualização, o Kernel Linux passa a impor um limite de tempo estrito. Se o firmware não responder, o kernel isola o problema, desativa a comunicação com os serviços EFI defeituosos e mantém o sistema operacional funcionando, registrando o culpado de forma clara nos logs do sistema.

Os detalhes técnicos: limite de 120 segundos e isolamento

Cu53a8FO linux 7 3 protecao travamento uefi efi
Kernel Linux 7.3 ganha proteção contra travamentos causados por firmware UEFI 3

O problema técnico central envolvia o processo kworker na fila efi_rts_wq. Quando uma chamada EFI travava dentro da memória do firmware, esse kworker ficava retido, segurando o semáforo efi_runtime_lock.

O novo código introduzido no Kernel Linux 7.3 define a constante EFI_RTS_TIMEOUT com o valor de 120 vezes a frequência do relógio (HZ), o que na prática estabelece um tempo limite de aproximadamente dois minutos. Esse teto foi escolhido intencionalmente para ser longo o suficiente a fim de acomodar processos legítimos e demorados (como a atualização de cápsulas de firmware em chips flash lentos), mas curto o bastante para barrar um travamento definitivo.

Se o limite for excedido, o kernel toma duas ações imediatas:

  1. Emite a mensagem: “EFI runtime service wedged in firmware; disabling EFI runtime services”.
  2. Limpa a marcação EFI_RUNTIME_SERVICES, “estacionando” permanentemente o worker em um estado inativo (TASK_IDLE) usando a nova função efi_rts_park_worker.

Como explicou Breno Leitão durante o envio dos patches, a modificação não corrige o bug na BIOS ou UEFI (o que é responsabilidade de cada fabricante de hardware), mas impede que uma falha da fabricante leve o espaço de usuário (userspace) do Linux junto com ela.

Diagnóstico preciso em escala de servidores

A motivação para o patch veio de problemas reais enfrentados em infraestruturas de grande escala. Em servidores equipados com chips NVIDIA Grace, desenvolvedores observaram tarefas presas por mais de 127 segundos dentro da memória de firmware, resultando em quedas de sistema atribuídas genericamente a travamentos de processos.

Com as alterações integradas à nova versão, operadores de datacenters perdem a necessidade de investigar exaustivamente a origem de processos zumbis, já que o alerta no dmesg indicará inequivocamente que a falha reside no firmware UEFI.

Rate limit no efivarfs e outras melhorias

Além do limite de tempo, o pull request de Ard Biesheuvel incorporou outras prevenções. A principal delas é a aplicação de limite de taxa (rate limiting) na função statfs() do sistema de arquivos efivarfs.

Em muitas implementações de UEFI, o serviço QueryVariableInfo() (usado para saber quanto espaço livre há na NVRAM) tem um custo de processamento altíssimo. Consultas excessivas por parte de aplicativos no Linux podiam causar lentidão severa. Agora, o kernel armazenará o valor dessa consulta em cache temporário quando receber múltiplas requisições sequenciais curtas.

O pacote também adiciona uma verificação rigorosa de tamanho no cabeçalho properties_header para hardwares x86 da Apple, evitando leitura de lixo na memória caso o cabeçalho esteja truncado.

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.