Luka w XFS umożliwiająca odczytanie surowych danych urządzenia blokowego

W kodzie systemu plików XFS zidentyfikowano lukę (CVE-2021-4155), która umożliwia lokalnemu nieuprzywilejowanemu użytkownikowi odczytanie nieużywanych danych blokowych bezpośrednio z urządzenia blokowego. Ten problem dotyczy wszystkich głównych wersji jądra Linuksa starszych niż 5.16, które zawierają sterownik XFS. Poprawka została uwzględniona w wersji 5.16, a także w aktualizacjach jądra 5.15.14, 5.10.91, 5.4.171, 4.19.225 itd. Status aktualizacji generowanych w celu rozwiązania problemu w dystrybucjach można śledzić na następujących stronach: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch.

Luka wynika z nieprawidłowego zachowania dwóch specyficznych dla XFS funkcji ioctl(XFS_IOC_ALLOCSP) i ioctl(XFS_IOC_FREESP), które są funkcjonalnym odpowiednikiem wywołania systemowego fallocate() obejmującego całe jądro. Podczas zwiększania rozmiaru pliku, który nie jest wyrównany do bloków, ioctls XFS_IOC_ALLOCSP/XFS_IOC_FREESP nie resetują bajtów końcowych do zera aż do następnej granicy bloku. Zatem w systemie XFS o standardowym rozmiarze bloku wynoszącym 4096 bajtów osoba atakująca może odczytać do 4095 bajtów wcześniej zapisanych danych z każdego bloku. Obszary te mogą zawierać dane z usuniętych plików, plików zdefragmentowanych i plików z deduplikowanymi blokami.

Możesz przetestować system pod kątem problemu, korzystając z prostego prototypu exploita. Jeśli po wykonaniu proponowanej sekwencji poleceń uda się odczytać tekst Szekspira, oznacza to, że sterownik FS jest podatny na ataki. Początkowo montowanie partycji XFS w celach demonstracyjnych wymaga uprawnień roota.

Ponieważ ioctl(XFS_IOC_ALLOCSP) i ioctl(XFS_IOC_FREESP) mają praktycznie taką samą funkcjonalność jak standardowe fallocate(), a jedyną różnicą jest wyciek danych, ich obecność przypomina backdoora. Pomimo ogólnej polityki nie zmieniania istniejących interfejsów w jądrze, za namową Linusa zdecydowano się całkowicie usunąć te ioctl w kolejnej wersji.

Źródło: opennet.ru

Dodaj komentarz