Ve standardní knihovně jazyka Rust byla zjištěna zranitelnost (CVE-2022-21658) související se závodem při volání funkce std::fs::remove_dir_all(). Pokud je tato funkce použita k odstranění dočasných souborů v privilegované aplikaci, může útočník dosáhnout odstranění libovolných systémových souborů a adresářů, ke kterým by normálně neměl přístup.
Zranitelnost je způsobena nesprávnou implementací kontroly symbolických odkazů před rekurzivním odstraňováním adresářů. Místo zákazu sledování symbolických odkazů funkce remove_dir_all() nejprve ověřuje, zda je soubor symbolickým odkazem. Pokud je odkaz určen, je odstraněn jako soubor, a pokud jde o adresář, je provedena operace rekurzivního odstranění obsahu. Problém je v tom, že mezi kontrolou a zahájením operace odstranění vzniká krátká prodleva.
V okamžiku, kdy byla kontrola již provedena, ale operace procházení adresářů pro odstranění ještě nezačala, může útočník nahradit adresář s dočasnými soubory symbolickým odkazem. Pokud se to povede v správný moment, funkce remove_dir_all() zpracuje symbolický odkaz jako adresář a začne odstraňovat obsah, na který odkaz tento odkaz směřuje. I když úspěch útoku závisí na přesnosti zvoleného času pro výměnu adresáře a je nepravděpodobné, že se to podaří na první pokus, během experimentů se výzkumníkům podařilo dosáhnout opakovatelného úspěchu útoku po spuštění exploit během několika sekund.
Všechny verze Rust od 1.0.0 do 1.58.0 včetně jsou náchylné k této zranitelnosti. Problém byl dosud vyřešen ve formě opravného balíčku (oprava bude zahrnuta v vydání 1.58.1, které se očekává během několika hodin). Sledovat odstranění zranitelnosti v distribucích lze na těchto stránkách: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Všem uživatelům programů napsaných v jazyce Rust, které jsou spouštěny s privilegovanými právy a využívají funkci remove_dir_all, se důrazně doporučuje urgentně aktualizovat Rust na verzi 1.58.1. Zajímavé je, že vydaný patch problém neřeší na všech systémech, například v OS REDOX a v macOS verzích před 10.10 (Yosemite) zranitelnost není blokována kvůli absenci příznaku O_NOFOLLOW, který zakazuje sledování symbolických odkazů.
Zdroj: opennet.ru
