V API Filesystem Context poskytovaném jádrem Linux byla zjištěna zranitelnost (CVE-2022-0185), která umožňuje místnímu uživateli získat práva root v systému. Výzkumník, který problém odhalil, zveřejnil demonstraci exploitace, která umožňuje vykonání kódu s právy root na Ubuntu 20.04 v základní konfiguraci. Kód exploitu má být zveřejněn na GitHubu během týdne poté, co distribuce vydají aktualizaci s opravou zranitelnosti.
Zranitelnost se nachází ve funkci legacy_parse_param() ve VFS a je způsobena nedostatečnou kontrolou maximální velikosti parametrů poskytovaných v souborových systémech, které nepodporují API Filesystem Context. Při předání příliš velkého parametru může dojít k překročení celočíselné proměnné používané pro výpočet velikosti zapisovaných dat — v kódu je kontrola překročení mezí bufferu „if (len > PAGE_SIZE - 2 - size)“, která nefunguje, pokud je hodnota size větší než 4094 kvůli celočíselnému překročení dolní hranice (integer underflow, při převodu 4096 - 2 - 4095 na unsigned int dostaneme 2147483648).
Uvedená chyba umožňuje při přístupu ke speciálně formátovanému obrazu FС vyvolat překročení bufferu a přepsat data jádra následující za vyhrazenou oblastí paměti. Pro zneužití zranitelnosti jsou vyžadována práva CAP_SYS_ADMIN, tedy oprávnění administrátora. Problém je v tom, že taková oprávnění může nezprivilegovaný uživatel získat v izolovaném kontejneru, pokud je v systému povolena podpora uživatelských prostorů (user namespaces). Například uživatelské prostory jsou ve výchozím nastavení povoleny v Ubuntu a Fedoře, ale nejsou aktivovány v Debianu a RHEL (pokud se nepoužívají platformy kontejnerové izolace).
Problém se projevuje od jádra Linux 5.1 a byl odstraněn včerejšími aktualizacemi 5.16.2, 5.15.16, 5.10.93, 5.4.173. Aktualizace balíčků s opravou zranitelnosti již byly vydány pro RHEL, Debian, Fedoru, Ubuntu. Oprava zatím není dostupná v Arch Linux, Gentoo, SUSE a openSUSE. Jako obranou cestu pro systémy, které nepoužívají kontejnerovou izolaci, lze nastavit hodnotu sysctl „user.max_user_namespaces“ na 0: echo „user.max_user_namespaces=0“ > /etc/sysctl.d/userns.conf # sysctl -p /etc/sysctl.d/userns.conf
Zdroj: opennet.ru
