KASAN – odkrywa nową podatność w jądrze od 2.6 do 4.20
Napisał: Patryk Krawaczyński
20/02/2019 w Bezpieczeństwo Brak komentarzy. (artykuł nr 681, ilość słów: 465)
K
ASAN (The Kernel Address Sanitizer) – wykrywający błędy pamięci dynamicznej w kodzie jądra Linuksa właśnie odkrył nową lukę typu: use-after-free (użycia po zwolnieniu pamięci), która pojawiła się od wczesnych wersji jądra Linux 2.6. KASAN (wraz z innymi środkami do sanityzacji) okazał się dość cenny w wykrywaniu różnych błędów w programowaniu zanim zostaną wykorzystane w rzeczywistym świecie. Tym razem padło na odkrycie: CVE-2019-8912. W kodzie podsystemu sieciowego sockfs
wykrył podatność use-after-free, która może doprowadzić do wykonania dowolnego kodu (ang. arbitrary code execution). Problem został zgłoszony w zeszłym tygodniu przez inżyniera Huawei i wkrótce po tym został naprawiony. Wydanie jądra Linuksa w wersji 4.20.11 nie wydaje się jeszcze posiadać tej poprawki, ale wkrótce powinna pojawić się w różnych stabilnych / długoterminowych gałęziach.
Czym jest użycie po zwolnieniu pamięci?
Use-after-free (UAF) – w skrócie jest to odwoływanie się do pamięci po jej zwolnieniu, co może spowodować awarię programu, użycie nieoczekiwanych wartości lub wykonanie kodu. Użycie wcześniej zwolnionej pamięci może mieć wiele negatywnych konsekwencji – począwszy od zepsucia wrażliwych danych do wykonania niepożądanego kodu – w zależności od przypadku oraz czasu wystąpienia błędu. Najprostszym sposobem uszkodzenia danych może być ponowne wykorzystanie zwolnionej pamięci systemowej. W scenariuszu tym pamięć, o której mowa jest przydzielana do innego wskaźnika po pewnym momencie od jej zwolnienia. Oryginalny wskaźnik do zwolnionej pamięci jest ponownie używany i wskazuje gdzieś w obręb nowego przydziału. Wraz ze zmianą danych następuje uszkodzenie poprawnie używanej pamięci oraz niezdefiniowane zachowanie w procesie programu (patrz również: zwisające wskaźniki). Jeśli nowo przydzielone dane przypadkowo utrzymują klasę (C++ dla przykładu) – różne wskaźniki funkcyjne mogą być rozproszone po stercie. Jeśli jeden z tych wskaźników funkcyjnych zostanie nadpisany adresem do poprawnego kodu powłoki (ang. shellcode) – efektem może być wykonanie dowolnego kodu.
Czym jest sanityzacja danych / kodu / adresów pamięci ?
Najprościej można to wytłumaczyć w następujący sposób: walidacja danych – określi, czy dane wejściowe użytkownika są w odpowiedniej formie. Z kolei sanityzacja danych – usunie wszystkie niepoprawne znaki z danych wejściowych użytkownika lub zmodyfikuje je tak, aby przechodziły walidację. Na przykład sanityzacja kodu HTML – może zostać użyta do obrony przed atakami XSS (ang. Cross-Site Scripting). Zazwyczaj łączy się te dwie techniki, aby zapewnić lepszą obronę dla aplikacji. W odniesieniu do kodu sanityzatory dbają, aby nie wystąpiły np. niektóre błędy związane z uszkodzeniem pamięci już na etapie kompilacji. Na przykład programiści Chrome oraz Firefox są aktywnymi użytkownikami narzędzia o nazwie AddressSanitizer, które wykryło setki błędów w przeglądarkach.
Więcej informacji: KernelAddressSanitizer (KASAN), CWE-416: Use After Free