Vulnerability in the Linux kernel allows distortion of read-only files

W jądrze Linux wykryto lukę (CVE-2022-0847), umożliwiającą nadpisywanie zawartości pamięci podręcznej stron dla dowolnych plików, w tym znajdujących się w trybie tylko do odczytu, otwartych z flagą O_RDONLY lub umieszczonych w systemach plików zamontowanych w trybie tylko do odczytu. Z praktycznego punktu widzenia luka ta może być wykorzystana do wstrzyknięcia kodu do dowolnych procesów lub zniekształcenia danych w otwieranych plikach. Na przykład można zmienić zawartość pliku authorized_keys dla procesu sshd. Prototyp exploita jest dostępny do testowania.

Problem nadano kryptonim Dirty Pipe, nawiązując do krytycznej luki Dirty COW odkrytej w 2016 roku. Zauważono, że w skali zagrożenia Dirty Pipe jest na tym samym poziomie co Dirty COW, ale jest znacznie łatwiejsza w eksploatacji. Luka została odkryta podczas analizy skarg dotyczących okresowego uszkodzenia plików pobieranych z sieci w systemie, ładującym skompresowane archiwa z serwera logów (37 uszkodzeń w ciągu 3 miesięcy w obciążonym systemie), w trakcie przygotowania których zastosowano operację splice() oraz nie nazwane kanały.

Luka objawia się począwszy od jądra Linux 5.8, wydanego w sierpniu 2020 roku, tzn. jest obecna w Debianie 11, ale nie dotyczy podstawowego jądra w Ubuntu 20.04 LTS. Jądra RHEL 8.x i openSUSE/SUSE 15 początkowo opierają się na starych gałęziach, ale nie można wykluczyć, że problematyczna zmiana została do nich przeniesiona (brak dokładnych danych). Śledzenie publikacji aktualizacji pakietów w dystrybucjach można znaleźć na tych stronach: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Naprawa luki została zaproponowana w wydaniach 5.16.11, 5.15.25 i 5.10.102. Naprawa została również włączona w jądro używane w platformie Android.

Luka jest spowodowana brakiem inicjalizacji wartości „buf->flags” w kodzie funkcji copy_page_to_iter_pipe() i push_pipe(), podczas gdy pamięć przy alokacji struktury nie jest czyszczona, a przy pewnych manipulacjach z nie nazwanymi kanałami w „buf->flags” może pojawić się wartość z innej operacji. Wykorzystując tę cechę, nieuprzywilejowany lokalny użytkownik może spowodować pojawienie się w fladze wartości PIPE_BUF_FLAG_CAN_MERGE, co pozwala na zorganizowanie nadpisania danych w pamięci podręcznej stron poprzez proste zapisanie nowych danych w specjalnie przygotowanym nie nazwanym kanale (pipe).

Aby zaatakować, plik docelowy musi być dostępny do odczytu, przy czym ponieważ podczas zapisu do potoku nie sprawdzane są uprawnienia, zastąpienie w pamięci podręcznej stron może być dokonane także dla plików znajdujących się w sekcjach zamontowanych tylko do odczytu (na przykład dla plików z CD-ROM). Po zastąpieniu informacji w pamięci podręcznej stron proces podczas odczytu danych z pliku otrzyma nie faktyczne, a podstawione dane.

Eksploatacja sprowadza się do tworzenia anonimowego kanału i wypełnienia go dowolnymi danymi w celu uzyskania flagi PIPE_BUF_FLAG_CAN_MERGE we wszystkich związanych z nim pierścieniowych strukturach. Następnie dane są odczytywane z kanału, ale flaga pozostaje ustawiona we wszystkich instancjach struktury pipe_buffer w pierścieniowych strukturach pipe_inode_info. Następnie wykonywane jest wywołanie splice() w celu odczytania danych z pliku docelowego do anonimowego kanału, zaczynając od wymaganego przesunięcia. Przy zapisie danych do tego anonimowego kanału z powodu ustawionej flagi PIPE_BUF_FLAG_CAN_MERGE dane w pamięci podręcznej stron będą nadpisane, zamiast tworzyć nową instancję struktury pipe_buffer.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster