Cos'è un kernel contaminato in Linux?


99

In determinate condizioni, il kernel Linux potrebbe essere contaminato . Ad esempio, caricando un driver video proprietario nel kernel, il kernel viene tainato. Questa condizione può essere visibile nei registri di sistema, nei messaggi di errore del kernel (oops e panici) e attraverso strumenti come lsmod, e rimane fino al riavvio del sistema.

Cosa significa questo? Influisce sulla mia capacità di utilizzare il sistema e come potrebbe influire sulle mie opzioni di supporto?


possibile duplicato delle uscite lsmod: non contaminato
Gilles

@Gilles, penso che la domanda a cui hai collegato dovrebbe essere unita a questa. Inoltre, non è ovvio che una domanda è un duplicato dell'altra.
bwDraco

1
Spero di rendere questa la versione canonica della domanda; vedere la modifica più recente alla domanda.
bwDraco,

9
@MichaelMrozek: 1) non ho visto la domanda esistente, dal momento che non era ovvio che l'utente stava chiedendo "che cosa significa 'contaminato' dire", e 2) la questione formulata è piuttosto specifico di un singolo comando, lsmod. Ho scritto questa domanda e la risposta per renderla più generale in modo che qualcuno che chieda "cosa significa" contaminato "possa trovarla facilmente.
bwDraco,

1
Avrebbero potuto usare una parola un po 'più neutra di "contaminata".
Roger Dahl,

Risposte:


126

Quando il kernel è contaminato, significa che si trova in uno stato che non è supportato dalla comunità . La maggior parte degli sviluppatori del kernel ignorerà le segnalazioni di bug che coinvolgono kernel contaminati e i membri della comunità potrebbero chiedere di correggere la condizione di contaminazione prima di poter procedere con la diagnosi dei problemi relativi al kernel. Inoltre, alcune funzionalità di debug e chiamate API potrebbero essere disabilitate quando il kernel è contaminato.

Nella maggior parte dei casi che coinvolgono driver proprietari, puoi tranquillamente ignorare la condizione di contaminazione , ma alcuni scenari che causano la contaminazione del kernel potrebbero essere indicativi di gravi problemi di sistema.

La funzione ha lo scopo di identificare le condizioni che possono rendere difficile la corretta risoluzione di un problema del kernel. Ad esempio, il caricamento di un modulo proprietario può rendere inaffidabile l'output del debug del kernel perché gli sviluppatori del kernel non hanno accesso al codice sorgente del modulo e quindi non possono determinare ciò che il modulo potrebbe aver fatto al kernel. Allo stesso modo, se in precedenza il kernel aveva riscontrato una condizione di errore o se si era verificato un grave errore hardware, le informazioni di debug generate dal kernel potrebbero non essere affidabili.

Il kernel può essere contaminato per una serie di ragioni , tra cui (ma non limitato a) quanto segue:

  • L'uso di un modulo kernel proprietario (o non compatibile con GPL): questa è la causa più comune di kernel contaminati e di solito deriva dal caricamento di driver video NVIDIA o AMD proprietari
  • L'uso di driver di gestione temporanea , che fanno parte del codice sorgente del kernel ma non sono stati completamente testati
  • L'uso di moduli out-of-tree che non sono inclusi con il codice sorgente del kernel Linux
  • Caricamento o scaricamento forzato di un modulo del kernel (come l'inserimento forzato di un modulo non creato per la versione corrente del kernel)
  • L'uso di un kernel SMP (multiprocessore) su alcune CPU uniprocessore non supportate, principalmente vecchi processori AMD Athlon
  • Sostituzione di ACPI DSDT, a volte necessaria per correggere i bug di risparmio energia (vedere qui per i dettagli)
  • Alcune condizioni di errore critiche, come le eccezioni di controllo della macchina e il kernel oops
  • Alcuni gravi bug nel firmware di sistema (BIOS, UEFI) su cui il kernel deve aggirare

Ognuna di queste condizioni è rappresentata da un flag particolare nel kernel. Alcuni fornitori di Linux, come SUSE, aggiungono ulteriori flag di segnalazione per indicare condizioni come il caricamento di un modulo che non è supportato dal fornitore.

Maggiori informazioni sono disponibili nella documentazione del kernel . I flag di contaminazione qui elencati sono (con _ uno stand-in per 'vuoto')

  • G | P : G se tutti i moduli caricati hanno una licenza GPL o compatibile, altrimenti è stato caricato un modulo proprietario. I moduli senza MODULE_LICENSE o MODULE_LICENSE non riconosciuti da insmod come compatibili GPL sono considerati proprietari.
  • F | _ : se un modulo è stato caricato forzatamente da "insmod -f", altrimenti se tutti i moduli sono stati caricati normalmente.
  • S | _ : se gli oops si sono verificati su un kernel SMP in esecuzione su hardware che non è stato certificato come sicuro da eseguire multiprocessore. Attualmente ciò si verifica solo su vari Athlon che non sono abilitati per SMP.
  • R | _ : se un modulo è stato scaricato forzatamente rmmod -f, altrimenti se tutti i moduli sono stati scaricati normalmente.
  • M | _ : se un processore ha segnalato un'eccezione di Machine Check , altrimenti non si sono verificate eccezioni di Machine Check.
  • B | _ : se una funzione di rilascio pagina ha trovato un riferimento di pagina errato o alcuni flag di pagina imprevisti.
  • U | _ : se un utente o un'applicazione utente ha richiesto specificamente l'impostazione del flag Tainted.
  • D | _ : se il kernel è morto di recente, ovvero c'era un OOPS o BUG.
  • A | _ : se la tabella ACPI è stata sostituita.
  • W | _ : se il kernel ha precedentemente emesso un avviso (sebbene alcuni avvisi possano impostare flag di contaminazione più specifici).
  • C | _ : se è stato caricato un driver di gestione temporanea.
  • I | _ : se il kernel sta risolvendo un grave bug nel firmware della piattaforma (BIOS o simile).
  • O | _ : se è stato caricato un modulo esterno ("out-of-tree").
  • E | _ : se un modulo senza segno è stato caricato in un kernel che supporta la firma del modulo.
  • L | _ : se in precedenza si è verificato un blocco software nel sistema.
  • K | _ : se il kernel è stato patchato dal vivo.

A questa risposta mancano molte informazioni dal dup di questa domanda spostata.

2
Aggiungerei almeno un'importante possibilità dello scenario "modulo senza segno" - un kernel rootkit è stato caricato nel kernel o l'exploit del kernel è stato appena eseguito.
kravietz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.