NFsec Logo

Wykrywanie skażonych modułów jądra

15/01/2024 w Administracja, Bezpieczeństwo Możliwość komentowania Wykrywanie skażonych modułów jądra została wyłączona

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 za pomocą 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śli 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

Ograniczanie logów pojawiających się na konsoli serwera

22/01/2023 w Administracja, Bezpieczeństwo Możliwość komentowania Ograniczanie logów pojawiających się na konsoli serwera została wyłączona

Wiadomości jądra Linux po starcie systemu powinny być dostępne tylko dla administratora. To samo tyczy się jego wskaźników. Analogicznie możemy postąpić z logami jądra, które są wyświetlane na konsoli podczas i po starcie serwera. Za ich wyświetlanie odpowiedzialna jest jedna z najbardziej znanych funkcji z interfejsu jądra Linuksa – printk(). Jest to standardowe narzędzie, które służy do wyświetlania wiadomości i zazwyczaj najbardziej podstawowy sposób na śledzenie i debugowanie kodu jądra. Jeśli jesteśmy zaznajomieni z printf(3) to można powiedzieć, że printk() jest na nim oparty, chociaż ma pewne funkcjonalne różnice: jego komunikaty mogą zostać określone za pomocą poziomu szczegółowości (na czym się skupimy tutaj) oraz ciąg formatu (ang. format string) – choć w dużej mierze zgodny z C99, nie podąża dokładnie za tą samą specyfikacją.
[ czytaj całość… ]

SACK Panic – Netflix odkrywa błędy TCP w jądrze Linux i FreeBSD

19/06/2019 w Ataki Internetowe, Bezpieczeństwo Możliwość komentowania SACK Panic – Netflix odkrywa błędy TCP w jądrze Linux i FreeBSD została wyłączona

W pierwszym biuletynie bezpieczeństwa za 2019 rok firma Netflix ostrzega przed opartymi o protokół TCP zdalnymi atakami typu DoS, które dotyczą zarówno systemu Linux, jak i FreeBSD. Ich poziom jest określany jako “krytyczny”. Luki odkryte przez Jonathana Looneya dotyczą w szczególności maksymalnego rozmiaru segmentu (ang. Maximum Segment Size (MSS)) oraz potwierdzeń selektywnych (ang. Selective Acknowledgments (SACK)). Najpoważniejszą jest luka “SACK Panic”, które pozwala na zdalne wywołanie paniki jądra systemu Linux.
[ czytaj całość… ]

Błędy w weryfikatorze BPF pozwalają na wykonanie dowolnego kodu w jądrze

22/12/2017 w Bezpieczeństwo Możliwość komentowania Błędy w weryfikatorze BPF pozwalają na wykonanie dowolnego kodu w jądrze została wyłączona

J

ądro Linuksa zbudowane ze wsparciem wywołania systemowego bpf(2) (CONFIG_BPF_SYSCALL) podatne jest na uzyskanie dostępu do odczytu i zapisu przestrzeni adresowej jądra. Do błędu może dojść, gdy użytkownik systemu uruchomi szkodliwy program BPF powodujący błędy obliczeń w module weryfikatora (funkcja check_alu_op) Berkeley Packet Filter. Tym samym nieuprawniony użytkownik może wykorzystać tę lukę do eskalacji swoich uprawnień w systemie. Podatne są wersje jądra od 4.9 do 4.14.8. Ograniczenie luki jest możliwe poprzez ustawienie opcji w sysctl:

echo 1 > /proc/sys/kernel/unprivileged_bpf_disabled

lub

sysctl -w kernel.unprivileged_bpf_disabled=1
echo kernel.unprivileged_bpf_disabled=1 | \
tee /etc/sysctl.d/90-CVE-2017-16995-CVE-2017-16996.conf

Spowoduje ona zablokowanie dostępu do wywołania bpf() dla nieuprawnionych użytkowników (ponowne jej wyłączenie wymagać będzie restartu systemu).

Więcej informacji: Unprivileged bpf(), Debian, RedHat/CentOS, Ubuntu

Wyłączenie szybkiego przeładowywania systemu z kexec

18/10/2017 w Bezpieczeństwo Możliwość komentowania Wyłączenie szybkiego przeładowywania systemu z kexec została wyłączona

K

exec to wywołanie systemowe, które umożliwia załadowanie i uruchomienie innego jądra z aktualnie uruchomionego systemu. Jest to bardzo przydatna funkcjonalność dla deweloperów jądra Linuksa lub innych osób, którym zależy na czasie. Bardzo szybki restart odbywa się bez czekania na cały proces ładowania systemu BIOS lub UEFI. Nowe jądro ładowane jest bezpośrednio do pamięci i z niej uruchamiane. Zapobiega to długim czasom oczekiwania związanym z pełnym uruchomieniem komputera i może pomagać w niektórych przypadkach spełnić wymagania wysokiej dostępności minimalizując przestoje systemów (należy jednak pamiętać, że kexec w zależności od konfiguracji sprzętowych może działać niepoprawnie z powodu urządzeń, które nie zostały w pełni zainicjowane podczas korzystania z tej metody).
[ czytaj całość… ]

2-letnia luka powraca do jądra Linuksa

08/10/2017 w Bezpieczeństwo Możliwość komentowania 2-letnia luka powraca do jądra Linuksa została wyłączona

Błąd w jądrze Linuksa, który został odkryty dwa lata temu, ale nie był uważany za zagrożenie dla bezpieczeństwa w tym czasie, został właśnie uznany za lukę umożliwiającą eskalację uprawnień na poziomie lokalnym. Błąd ten został zidentyfikowany jako CVE-2017-1000253 i pierwotnie został odkryty przez badacza pracującego dla Google Michaela Davidsona w kwietniu 2015 roku. Z powodu zignorowania powagi tego błędu – poprawka dla niego nie została przekazana do długoterminowo wspieranej wersji jądra 3.10.77 (warto wspomnieć, że wersje LTS właśnie przeszły z cyklu 2 letniego, na 6 letni).
[ czytaj całość… ]

Jak znaleźć ducha w linuksowej skorupie? – eBPF

07/09/2017 w Administracja Możliwość komentowania Jak znaleźć ducha w linuksowej skorupie? – eBPF została wyłączona

A

naliza wydajności często jest ograniczona przez brak widoczności różnych zjawisk zachodzących w systemie. Obserwacja tych zjawisk pozwala inżynierom systemów łatwo identyfikować elementy, które zawierają ograniczenia i mogą być szybsze. “Najnowszym” narzędziem do obserwacji systemu operacyjnego Linux jest BPF (ang. Berkeley Packet Filter). Został on opracowany w 1992 roku, aby zapewnić sposób filtrowania pakietów sieciowych oraz uniknięcia ich bezużytecznego kopiowania z przestrzeni jądra do użytkownika. Początkowo składał się z prostego kodu bajtowego, który był wstrzykiwany z przestrzeni użytkownika do jądra. Tam był sprawdzany przez weryfikator – w celu uniknięcia krachu jądra lub problemów z bezpieczeństwem – i dołączany do gniazda, a następnie uruchamiany na każdym odebranym pakiecie.
[ czytaj całość… ]

TCP BBR – nowy algorytm kontroli przeciążenia od Google

23/07/2017 w Administracja Możliwość komentowania TCP BBR – nowy algorytm kontroli przeciążenia od Google została wyłączona

B

ottleneck Bandwidth and RTT, czyli BBR jest nowym algorytmem kontroli przeciążenia TCP od firmy Google. Został on przetestowany w jego centrach danych, jak i frontowych serwerach takich stron jak: Google.com oraz YouTube.com. Dąży on do optymalizacji zarówno przepustowości, jak i opóźnienia – RTT. Jak wspomina samo Google po wprowadzeniu tego mechanizmu do swojej usługi publicznej chmury obliczeniowej, uzyskał średnio od 4%14% większą przepustowość sieciową. Pierwsze publiczne wydanie BBR nastąpiło we wrześniu 2016 roku. Do jego użycia wymagane jest posiadanie jądra w wersji 4.9 lub wyższej, w przeciwnym wypadku wymagane jest nałożenie łatki i rekompilacja jądra.
[ czytaj całość… ]

Kernel Address Space Layout Randomization

18/07/2017 w Bezpieczeństwo Możliwość komentowania Kernel Address Space Layout Randomization została wyłączona

J

ak zostało to wspomniane we wcześniejszym wpisie – w wersji Linuksa v3.14 został wprowadzony mechanizm Kernel Address Space Layout Randomization. Wiele dystrybucji od jakiegoś czasu i tak zdecydowało o włączeniu KASLR dlatego od wersji v4.12 jądra Ingo Molnar podjął decyzję o jego aktywacji w standardowej konfiguracji. Oznacza to, że kod jądra będzie losowo umieszczany w pamięci RAM przy każdym starcie systemu:

# 1'wsze uruchomienie
root@darkstar:~# cat /proc/kallsyms | grep ' commit_creds\| prepare_kernel'
ffffffff8109eb60 T commit_creds
ffffffff8109ee40 T prepare_kernel_cred
# 2'gie uruchomienie
root@darkstar:~# cat /proc/kallsyms | grep ' commit_creds\| prepare_kernel'
ffffffffaa0a3bd0 T commit_creds
ffffffffaa0a3fc0 T prepare_kernel_cred

Na temat efektywności tego rozwiązania wypowiedział się Brad Spengler z PaX Team. Warto również zapoznać się z prezentacją Black Hat – “Breaking Kernel Address Space Layout Randomization (KASLR) With Intel TSX”. Dlatego rozwiązanie to należy traktować jako jedną z wielu warstw do ochrony systemu.

Więcej informacji: Kernel address space layout randomization

Stack Clash – kurs kolizyjny pamięci w systemach *nix

20/06/2017 w Bezpieczeństwo 1 komentarz.

Czym jest Stack Clash? Jest to eksploatacja błędu w zarządzaniu pamięci oparta na dość starej (12 letniej) technice. Dotyka ona kilku systemów operacyjnych: Linuksa, OpenBSD, NetBSD, FreeBSD oraz Solarisa dla architektury i386 oraz amd64. Technika ta może zostać wykorzystana przez atakujących do naruszenia bezpieczeństwa pamięci oraz wykonania dowolnego kodu. Polega ona na pewnej zależności: każdy program uruchomiony na komputerze używa specjalnego obszaru pamięci zwanego stosem (ang. stack). Obszar tej pamięci jest szczególny, ponieważ rośnie automatycznie wraz z zapotrzebowaniem na niego przez program. Jeśli jednak przyrost jest zbyt duży i zbliży się do innego obszaru pamięci (na przykład sterty – ang. heap) może dojść do sytuacji, w której program może pomylić stos z innym obszarem pamięci. Daje to możliwość wykorzystania owego zamieszania do nadpisania stosu przez inny obszary pamięci lub odwrotnie.
[ czytaj całość… ]