Zranitelnost root v jádře Linuxu a odmítnutí služby v systemd

Bezpečnostní výzkumníci z Qualys odhalili podrobnosti o dvou zranitelnostech ovlivňujících linuxové jádro a správce systému systemd. Chyba zabezpečení v jádře (CVE-2021-33909) umožňuje místnímu uživateli dosáhnout spuštění kódu s právy root prostřednictvím manipulace s vysoce vnořenými adresáři.

Nebezpečí zranitelnosti je umocněno skutečností, že výzkumníci byli schopni připravit pracovní exploity, které fungují na Ubuntu 20.04/20.10/21.04, Debian 11 a Fedora 34 ve výchozí konfiguraci. Je třeba poznamenat, že jiné distribuce nebyly testovány, ale jsou teoreticky také náchylné k problému a mohou být napadeny. Úplný kód exploitů je slíben, že bude zveřejněn poté, co bude problém všude odstraněn, ale prozatím je k dispozici pouze prototyp omezené funkčnosti, který způsobí pád systému. Problém se vyskytuje od července 2014 a týká se vydání jádra počínaje 3.16. Oprava zranitelnosti byla koordinována s komunitou a přijata do jádra 19. července. Hlavní distribuce již vygenerovaly aktualizace svých balíčků jádra (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Tato chyba zabezpečení je způsobena selháním kontroly výsledku převodu size_t na int před provedením operací v kódu seq_file, který vytváří soubory ze sekvence záznamů. Selhání kontroly může vést k překročení hranic zápisů do vyrovnávací paměti při vytváření, připojování a odstraňování velmi vnořené adresářové struktury (velikost cesty větší než 1 GB). V důsledku toho může útočník dosáhnout 10bajtového řetězce "//deleted" zapsaného s posunem "-2 GB - 10 bajtů" směřujícího do oblasti bezprostředně předcházející přidělené vyrovnávací paměti.

Připravený exploit vyžaduje k provozu 5 GB paměti a 1 milion volných inodů. Tento exploit funguje tak, že volá mkdir() k vytvoření hierarchie asi milionu podadresářů, aby se dosáhlo velikosti cesty k souboru přesahující 1 GB. Tento adresář je připojen pomocí bind-mount v samostatném uživatelském jmenném prostoru, načež se spustí funkce rmdir(), která jej odstraní. Paralelně se vytvoří vlákno, které načte malý program eBPF, který je zablokován ve fázi po kontrole pseudokódu eBPF, ale před jeho JIT kompilací.

V nepřivilegovaném jmenném prostoru id uživatele se otevře soubor /proc/self/mountinfo a přečte se dlouhá cesta k adresáři připojenému k vazbě, což má za následek zapsání řetězce "//deleted" do oblasti před začátkem vyrovnávací paměti. Pozice pro zápis řádku je zvolena tak, aby přepsala instrukci v již testovaném, ale ještě nezkompilovaném programu eBPF.

Dále se na úrovni programu eBPF nekontrolovaný zápis mimo vyrovnávací paměť transformuje na řízenou schopnost číst a zapisovat do jiných struktur jádra prostřednictvím manipulace se strukturami btf a map_push_elem. Výsledkem je, že exploit určí umístění vyrovnávací paměti modprobe_path[] v paměti jádra a přepíše v ní cestu „/sbin/modprobe“, což vám umožní iniciovat spuštění libovolného spustitelného souboru s právy root v případě request_module() volání, které se provádí například při vytváření netlink socketu.

Výzkumníci poskytují několik řešení, která jsou účinná pouze pro konkrétní exploit, ale neodstraňují samotný problém. Doporučuje se nastavit "/proc/sys/kernel/unprivileged_userns_clone" na 0 pro zakázání připojovacích adresářů v samostatném jmenném prostoru ID uživatele a "/proc/sys/kernel/unprivileged_bpf_disabled" na 1 pro zakázání načítání programů eBPF do jádra.

Je pozoruhodné, že při analýze alternativního útoku zahrnujícího použití mechanismu FUSE místo bind-mound pro připojení velkého adresáře výzkumníci narazili na další zranitelnost (CVE-2021-33910) ovlivňující správce systému systemd. Ukázalo se, že při pokusu o připojení adresáře o velikosti cesty přesahující 8 MB přes FUSE proces inicializace řízení (PID1) vyčerpá zásobníkovou paměť a zhroutí se, což uvede systém do „panického“ stavu.

Problém je v tom, že systemd sleduje a analyzuje obsah /proc/self/mountinfo a zpracovává každý bod připojení ve funkci unit_name_path_escape(), která provádí operaci strdupa(), která umístí data do zásobníku, nikoli do dynamicky alokované paměti. . Protože maximální velikost zásobníku je omezena pomocí RLIMIT_STACK, zpracování příliš velké cesty k bodu připojení způsobí zhroucení procesu PID1 a zastavení systému. Pro útok můžete použít nejjednodušší modul FUSE v kombinaci s použitím vysoce vnořeného adresáře jako přípojného bodu, jehož velikost cesty přesahuje 8 MB.

Problém se objevuje od systemd 220 (duben 2015), již byl opraven v hlavním repozitáři systemd a opraven v distribucích (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Je pozoruhodné, že ve verzi systemd 248 exploit nefunguje kvůli chybě v kódu systemd, která způsobuje selhání zpracování /proc/self/mountinfo. Zajímavé také je, že v roce 2018 nastala podobná situace a při pokusu napsat exploit pro zranitelnost CVE-2018-14634 v linuxovém jádře výzkumníci Qualys narazili na tři kritické zranitelnosti v systemd.

Zdroj: opennet.ru

Přidat komentář