Co to jest skażone jądro w Linuksie?


99

W pewnych warunkach jądro Linuksa może zostać skażone . Na przykład ładowanie zastrzeżonego sterownika wideo do jądra powoduje skażenie jądra. Ten stan może być widoczny w dziennikach systemowych, komunikatach o błędach jądra (ups i panics) oraz za pomocą narzędzi takich jak lsmodi pozostaje do momentu ponownego uruchomienia systemu.

Co to znaczy? Czy wpływa to na moją zdolność do korzystania z systemu i jak może wpłynąć na moje opcje pomocy technicznej?



@Gilles, myślę, że pytanie, które podałeś, powinno zostać połączone w jedno. Ponadto nie jest oczywiste, że jedno pytanie jest duplikatem drugiego.
bwDraco

1
Mam nadzieję, że uczynię to kanoniczną wersją pytania; zobacz najnowszą edycję pytania.
bwDraco

9
@MichaelMrozek: 1) nie widzę istniejącego pytanie, ponieważ nie było oczywiste, że użytkownik pytał „co oznacza«skażone»myśli”, oraz 2) pytanie, sformułowane jest dość specyficzne dla pojedynczego polecenia lsmod. Napisałem to pytanie i odpowiedź, aby uczynić je bardziej ogólnym, aby ktoś, kto zapyta „co oznacza„ skażenie ””, może je łatwo znaleźć.
bwDraco

1
Mogliby użyć słowa, które było nieco bardziej neutralne niż „skażone”.
Roger Dahl,

Odpowiedzi:


125

Kiedy jądro jest skażone, oznacza to, że jest w stanie, który nie jest obsługiwany przez społeczność . Większość programistów jądra zignoruje zgłoszenia błędów dotyczących skażonych jąder, a członkowie społeczności mogą poprosić o poprawienie stanu skażenia, zanim będą mogli przystąpić do diagnozowania problemów związanych z jądrem. Ponadto niektóre funkcje debugowania i wywołania interfejsu API mogą być wyłączone, gdy jądro jest skażone.

W większości przypadków z zastrzeżonymi sterownikami można bezpiecznie zignorować stan skażenia , ale niektóre scenariusze powodujące skażenie jądra mogą wskazywać na poważne problemy z systemem.

Ta funkcja ma na celu identyfikację warunków, które mogą utrudnić prawidłowe rozwiązanie problemu z jądrem. Na przykład ładowanie zastrzeżonego modułu może spowodować, że wyjście debugowania jądra będzie niewiarygodne, ponieważ programiści jądra nie mają dostępu do kodu źródłowego modułu i dlatego nie mogą ustalić, co moduł zrobił z jądrem. Podobnie, jeśli w jądrze wcześniej wystąpił błąd lub wystąpił poważny błąd sprzętowy, informacje debugowania wygenerowane przez jądro mogą nie być wiarygodne.

Jądro może zostać skażone z jednego z kilku powodów , w tym (między innymi):

  • Korzystanie z zastrzeżonego (lub niezgodnego z GPL) modułu jądra - jest to najczęstsza przyczyna skażonych jąder i zwykle wynika z ładowania zastrzeżonych sterowników wideo NVIDIA lub AMD
  • Zastosowanie sterowników pomostowych , które są częścią kodu źródłowego jądra, ale nie są w pełni przetestowane
  • Korzystanie z modułów nienależących do drzewa , które nie są zawarte w kodzie źródłowym jądra Linux
  • Wymuszone ładowanie lub rozładowywanie modułu jądra (takie jak wymuszone wstawianie modułu, który nie został zbudowany dla bieżącej wersji jądra)
  • Zastosowanie jądra SMP (wieloprocesorowego) na niektórych nieobsługiwanych procesorach jednoprocesorowych, głównie starszych procesorach AMD Athlon
  • Przesłanianie z ACPI DSDT, czasami konieczna w celu skorygowania błędów zarządzania energią (patrz tutaj szczegóły)
  • Pewne krytyczne błędy, takie jak wyjątki sprawdzania komputera i przestoje jądra
  • Pewne poważne błędy w oprogramowaniu systemowym (BIOS, UEFI), które jądro musi obejść

Każdy z tych warunków jest reprezentowany przez konkretną flagę w jądrze. Niektórzy dostawcy Linuksa, na przykład SUSE, dodają dodatkowe flagi skażenia wskazujące warunki, takie jak ładowanie modułu, który nie jest obsługiwany przez dostawcę.

Więcej informacji jest dostępnych w dokumentacji jądra . Są tam wymienione flagi skażenia (z _ stand-in dla „pustych”)

  • G | P : G, jeśli wszystkie załadowane moduły mają licencję GPL lub kompatybilną, w przeciwnym razie załadowano moduł prawnie zastrzeżony. Zakłada się, że moduły bez MODULE_LICENSE lub z MODULE_LICENSE, które nie są rozpoznawane przez insmod jako kompatybilne z GPL.
  • F | _ : jeśli którykolwiek moduł został wymuszony przez „insmod -f”, w przeciwnym razie, jeśli wszystkie moduły zostały załadowane normalnie.
  • S | _ : jeśli wystąpił błąd w jądrze SMP działającym na sprzęcie, który nie został certyfikowany jako bezpieczny do uruchamiania wieloprocesorowego. Obecnie dzieje się tak tylko w przypadku różnych Athlonów, które nie obsługują SMP.
  • R | _ : jeżeli moduł został wymuszony przez rozładunek rmmod -f, w przeciwnym razie, jeśli wszystkie moduły zostały normalnie rozładowane.
  • M | _ : jeśli jakikolwiek procesor zgłosił wyjątek kontroli maszyny , w przeciwnym razie nie wystąpiły wyjątki kontroli maszyny.
  • B | _ : jeśli funkcja zwalniania strony znalazła złe odwołanie do strony lub niektóre nieoczekiwane flagi strony.
  • U | _ : jeśli użytkownik lub aplikacja użytkownika wyraźnie zażądała ustawienia flagi Tainted.
  • D | _ : jeśli jądro niedawno zmarło, tzn. Wystąpił błąd OOPS lub BŁĄD.
  • A | _ : jeśli tabela ACPI została przesłonięta.
  • W | _ : jeśli jądro wcześniej wydało ostrzeżenie (chociaż niektóre ostrzeżenia mogą ustawiać bardziej szczegółowe flagi skażenia).
  • C | _ : jeśli załadowano sterownik pomostowy.
  • I | _ : jeśli jądro pracuje nad poważnym błędem w oprogramowaniu układowym platformy (BIOS lub podobnym).
  • O | _ : jeśli załadowano moduł zbudowany zewnętrznie („z drzewa”).
  • E | _ : jeśli niepodpisany moduł został załadowany do podpisu modułu obsługującego jądro.
  • L | _ : jeśli wcześniej w systemie wystąpiła miękka blokada.
  • K | _ : jeśli jądro zostało załatane na żywo.

W tej odpowiedzi brakuje wielu informacji z duplikatu, które zastąpiło to pytanie.

2
Dodałbym przynajmniej jedną ważną możliwość scenariusza „niepodpisany moduł” - rootkit jądra został załadowany do jądra lub właśnie został wykorzystany exploit jądra.
kravietz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.