Wykrywanie skażonych modułów jądra

nfsec.pl 8 miesięcy temu

I

nformację o modułach załadowanych w systemie Linux znajdziemy w kopalni wiedzy o systemie, czyli wirtualnym systemie plików procfs. W celu wyświetlenia aktualnie zarejestrowanych (nie ukrywających się) modułów wystarczy wykonać polecenie: cat /proc/modules. Naszym oczom powinny ukazać się linie zawierające od sześciu do siedmiu kolumn:

x_tables 45056 3 xt_owner,xt_tcpudp,ip6_tables, Live 0xffffffffc044b000
  • x_tables – pierwsza kolumna wyświetla tytuł / nazwę modułu,
  • 45056 – druga kolumna to wielkość modułu (podana w bajtach) – nie mylić z używaną pamięcią,
  • 3 – trzecia kolumna podaje liczbę załadowanych instancji danego modułu – moduł z zerową wartością jest uważany za niezaładowany, a gdy liczba referencyjna modułu jest dodania (różna od zera), zwolnienie go dzięki rmmod staje się niemożliwe, ponieważ polecenie wyświetli komunikat błędu: rmmod: ERROR: Module x_tables is in use by: xt_tcpudp xt_owner ip6_tables,
  • xt_owner,xt_tcpudp,ip6_tables – w czwartej kolumnie znajdują się moduły odwołujące się / zależne, które wymagają tego modułu do swojego funkcjonowania – w przypadku braku odniesień wyświetlany jest znak “-“,
  • Live – stan załadowania modułu wyrażony jest w piątej kolumnie, które może przyjmować tylko jedną z wartości: Live (żywy / aktywny), Loading (w trakcie ładowania), Unloading (w trakcie pozbywania się),
  • 0xffffffffc044b000 – szósta kolumna wyświetla aktualne przesunięcie pamięci jądra wykorzystywane przez załadowany moduł, co może być przydatne przy procesie debugowania lub profilowania.

W niektórych przypadkach możemy również trafić na wpisy, które będą posiadały siódmą kolumnę – tzw. skażone stany (ang. tainted states) . Kiedyś reprezentowane przez nią symbole znajdowały się w pliku panic.c (aktualnie zostały przeniesione do sekcji dokumentacji kernel.rst):

====== ===== ============================================================== 1 `(P)` proprietary module was loaded 2 `(F)` module was force loaded 4 `(S)` kernel running on an out of specification system 8 `(R)` module was force unloaded 16 `(M)` processor reported a Machine Check Exception (MCE) 32 `(B)` bad page referenced or some unexpected page flags 64 `(U)` taint requested by userspace application 128 `(D)` kernel died recently, i.e. there was an OOPS or BUG 256 `(A)` an ACPI table was overridden by user 512 `(W)` kernel issued warning 1024 `(C)` staging driver was loaded 2048 `(I)` workaround for bug in platform firmware applied 4096 `(O)` externally-built ("out-of-tree") module was loaded 8192 `(E)` unsigned module was loaded 16384 `(L)` soft lockup occurred 32768 `(K)` kernel has been live patched 65536 `(X)` Auxiliary taint, defined and used by for distros 131072 `(T)` The kernel was built with the struct randomization plugin ====== ===== ==============================================================

Dlatego, jeżeli trafimy na wpis podobny do:

suspicious_module 110592 2 - Live 0xffffffffc0724000 (OE)

Możemy go odczytać, jako załadowanie modułu zewnętrznego (O) – spoza aktualnego drzewa modułów uruchomionego jądra systemu, który w dodatku nie jest podpisany (E). Wszystkie takie “skażone” moduły możemy wyświetlić poprzez polecenie:

grep \(.*\) /proc/modules

Podobnie możemy szukać wyrażenia taint w poleceniu dmesg lub journalctl --dmesg.

Więcej informacji: Tainted kernels, What is OE+ in Linux?, Craig Rowland on Twitter

Idź do oryginalnego materiału