Linus Torvalds do składu przyszłego wydania jądra Linux 5.4 zestaw poprawek „«, autorstwa Davida Howellsa (pracuje w Red Hat) oraz Matthew Garretta (, pracuje w Google), mających na celu ograniczenie dostępu użytkownika root do jądra. Funkcjonalność związana z „lockdown” została wydzielona do opcjonalnie ładowanego modułu LSM (), który ustanawia barierę między UID 0 a jądrem, ograniczając określoną funkcjonalność niskiego poziomu.
Jeśli atakujący w wyniku ataku uzyskał możliwość wykonywania kodu z uprawnieniami root, może uruchamiać swój kod także na poziomie jądra, na przykład przez podmianę jądra za pomocą kexec lub odczyt/zapis pamięci przez /dev/kmem. Najbardziej oczywistą konsekwencją takiej aktywności może być UEFI Secure Boot lub pozyskanie poufnych danych przechowywanych na poziomie jądra.
Początkowo funkcje ograniczające uprawnienia root rozwijano w kontekście wzmocnienia ochrony zweryfikowanego rozruchu, a dystrybucje już od dość dawna stosują zewnętrzne poprawki blokujące obejście UEFI Secure Boot. Jednocześnie takie ograniczenia nie były włączane do głównego drzewa jądra z powodu w sposobie ich realizacji oraz obaw o naruszenie działania istniejących systemów. Moduł „lockdown” łączy stosowane już w dystrybucjach poprawki, które zostały przeprojektowane w formie oddzielnego podsystemu, niezwiązanego bezpośrednio z UEFI Secure Boot.
W trybie lockdown ograniczany jest dostęp do /dev/mem, /dev/kmem, /dev/port, /proc/kcore, debugfs, trybu debugowania kprobes, mmiotrace, tracefs, BPF, PCMCIA CIS (Card Information Structure), niektórych interfejsów ACPI oraz rejestrów MSR CPU, blokowane są wywołania kexec_file i kexec_load, zabronione jest przechodzenie w tryb uśpienia, ograniczane jest użycie DMA dla urządzeń PCI, zabroniony jest import kodu ACPI ze zmiennych EFI,
niedozwolone są manipulacje portami wejścia/wyjścia, w tym zmiana numeru przerwania i portu wejścia/wyjścia dla portu szeregowego.
Domyślnie moduł lockdown jest nieaktywny, jest kompilowany po wskazaniu w kconfig opcji SECURITY_LOCKDOWN_LSM i aktywowany za pomocą parametru jądra „lockdown=”, pliku sterującego „/sys/kernel/security/lockdown” lub opcji kompilacji , które mogą przyjmować wartości „integrity” i „confidentiality”. W pierwszym przypadku blokowane są możliwości pozwalające na wprowadzanie zmian do działającego jądra z przestrzeni użytkownika, a w drugim dodatkowo wyłączana jest funkcjonalność, którą można wykorzystać do pozyskiwania poufnych informacji z jądra.
Warto przy tym zaznaczyć, że lockdown jedynie ogranicza standardowe możliwości dostępu do jądra, ale nie chroni przed modyfikacjami wynikającymi z wykorzystania luk. Do blokowania zmian w działającym jądrze przy użyciu exploitów projekt Openwall oddzielny moduł (Linux Kernel Runtime Guard).
Źródło: opennet.ru
