O que é um kernel contaminado no Linux?

99

Sob certas condições, o kernel do Linux pode ficar contaminado . Por exemplo, carregar um driver de vídeo proprietário no kernel prejudica o kernel. Essa condição pode estar visível nos logs do sistema, nas mensagens de erro do kernel (oops e panics) e por meio de ferramentas como lsmode permanece até a reinicialização do sistema.

O que isto significa? Isso afeta minha capacidade de usar o sistema e como isso afeta minhas opções de suporte?

bwDraco
fonte
possível duplicata de saídas lsmod: Não contaminado
Gilles
@ Gilles, acho que a pergunta que você vinculou deve ser mesclada a esta. Além disso, não é óbvio que uma pergunta seja uma duplicata da outra.
precisa saber é o seguinte
1
Espero fazer disso a versão canônica da pergunta; veja a edição mais recente da pergunta.
precisa saber é o seguinte
9
@MichaelMrozek: 1) Eu não vi a pergunta existente, pois não era óbvio que o usuário estava perguntando "o que significa 'contaminado'", e 2) a pergunta como está redigida é bastante específica para um único comando lsmod,. Escrevi esta pergunta e respondi para torná-la mais geral, para que alguém perguntando "o que significa 'contaminado'" possa encontrá-la facilmente.
precisa saber é o seguinte
1
Eles poderiam ter usado uma palavra um pouco mais neutra do que "contaminada".
Roger Dahl

Respostas:

126

Quando o kernel está contaminado, significa que ele está em um estado que não é suportado pela comunidade . A maioria dos desenvolvedores de kernel ignora os relatórios de erros que envolvem kernels contaminados, e os membros da comunidade podem solicitar que você corrija a condição de contaminação antes de prosseguir com o diagnóstico de problemas relacionados ao kernel. Além disso, algumas funcionalidades de depuração e chamadas de API podem ser desativadas quando o kernel está contaminado.

Na maioria dos casos, envolvendo drivers proprietários, você pode ignorar com segurança a condição de contaminação , mas alguns cenários que causam a contaminação do kernel podem ser indicativos de sérios problemas no sistema.

O recurso tem como objetivo identificar condições que podem dificultar a solução adequada de um problema no kernel. Por exemplo, o carregamento de um módulo proprietário pode tornar a saída de depuração do kernel não confiável, porque os desenvolvedores do kernel não têm acesso ao código fonte do módulo e, portanto, não podem determinar o que o módulo pode ter feito com o kernel. Da mesma forma, se o kernel já havia experimentado uma condição de erro ou se ocorreu um erro grave de hardware, as informações de depuração geradas pelo kernel podem não ser confiáveis.

O kernel pode ficar contaminado por vários motivos , incluindo (mas não limitado a) o seguinte:

  • O uso de um módulo de kernel proprietário (ou não compatível com GPL) - essa é a causa mais comum de kernels contaminados e geralmente resulta do carregamento de drivers de vídeo NVIDIA ou AMD proprietários
  • O uso de drivers temporários , que fazem parte do código-fonte do kernel, mas não são totalmente testados
  • O uso de módulos fora da árvore que não estão incluídos no código-fonte do kernel do Linux
  • Carregamento ou descarregamento forçado de um módulo do kernel (como inserir à força um módulo não criado para a versão atual do kernel)
  • O uso de um kernel SMP (multiprocessador) em certas CPUs não processadas, sem suporte ao processador, principalmente os processadores AMD Athlon mais antigos
  • Substituição do DSPI da ACPI , às vezes necessário para corrigir os erros de gerenciamento de energia (veja aqui para detalhes)
  • Certas condições críticas de erro, como exceções de verificação da máquina e oopses do kernel
  • Certos erros sérios no firmware do sistema (BIOS, UEFI) que o kernel deve solucionar

Cada uma dessas condições é representada por uma bandeira específica no kernel. Alguns fornecedores de Linux, como o SUSE, adicionam sinalizadores de contaminação adicionais para indicar condições, como carregar um módulo que não é suportado pelo fornecedor.

Mais informações estão disponíveis na documentação do kernel . Os sinalizadores de contaminação listados existem (com _ um substituto para 'em branco')

  • G | P : G se todos os módulos carregados tiverem uma GPL ou licença compatível, caso contrário, um módulo proprietário foi carregado. Módulos sem um MODULE_LICENSE ou com um MODULE_LICENSE que não é reconhecido pelo insmod como compatível com GPL são considerados proprietários.
  • F | _ : se algum módulo foi carregado com força por "insmod -f", caso contrário, se todos os módulos foram carregados normalmente.
  • S | _ : se ocorrerem oops em um kernel SMP executando em hardware que não tenha sido certificado como seguro para executar o multiprocessador. Atualmente, isso ocorre apenas em vários Athlons que não são compatíveis com SMP.
  • R | _ : se um módulo foi forçado a descarregar rmmod -f, caso contrário, se todos os módulos foram descarregados normalmente.
  • M | _ : se algum processador relatou uma exceção de verificação de máquina , caso contrário, nenhuma exceção de verificação de máquina ocorreu.
  • B | _ : se uma função de liberação de página encontrou uma referência de página incorreta ou alguns sinalizadores de página inesperados.
  • U | _ : se um usuário ou aplicativo de usuário solicitou especificamente que o sinalizador contaminado fosse definido.
  • D | _ : se o kernel morreu recentemente, ou seja, houve um OOPS ou BUG.
  • A | _ : se a tabela ACPI foi substituída.
  • W | _ : se um aviso tiver sido emitido anteriormente pelo kernel (embora alguns avisos possam definir sinalizadores de contaminação mais específicos).
  • C | _ : se um driver temporário foi carregado.
  • I | _ : se o kernel estiver trabalhando em torno de um bug grave no firmware da plataforma (BIOS ou similar).
  • O | _ : se um módulo construído externamente ("fora da árvore") foi carregado.
  • E | _ : se um módulo não assinado foi carregado em uma assinatura de módulo de suporte ao kernel.
  • L | _ : se um bloqueio suave ocorreu anteriormente no sistema.
  • K | _ : se o kernel foi corrigido ao vivo.
bwDraco
fonte
Esta resposta está faltando muita informação do dup que esta pergunta deslocou.
2
Eu adicionaria pelo menos uma possibilidade importante do cenário "módulo não assinado" - um rootkit do kernel foi carregado no kernel ou a exploração do kernel foi executada.
Kravietz