Ranjivost u standardnoj biblioteci Rust

U standardnoj biblioteci Rust identificirana je ranjivost (CVE-2022-21658) zbog uvjeta utrke u funkciji std::fs::remove_dir_all(). Ako se ova funkcija koristi za brisanje privremenih datoteka u privilegiranoj aplikaciji, napadač može postići brisanje proizvoljnih sistemskih datoteka i direktorija kojima napadač inače ne bi imao pristup brisanju.

Ranjivost je uzrokovana neispravnom implementacijom provjere simboličkih veza prije rekurzivnog brisanja direktorija. Umjesto da spriječi praćenje simboličkih veza, remove_dir_all() prvo provjerava je li datoteka simbolička veza. Ako je link definiran, onda se briše kao datoteka, a ako je direktorij, tada se poziva rekurzivna operacija uklanjanja sadržaja. Problem je u tome što postoji malo kašnjenje između provjere i početka operacije brisanja.

U trenutku kada je provjera već obavljena, ali još nije započela operacija enumeracije direktorija za brisanje, napadač može simboličkom vezom zamijeniti direktorij privremenim datotekama. Ako pogodi u pravo vrijeme, funkcija remove_dir_all() tretirat će simboličku vezu kao direktorij i početi uklanjati sadržaj na koji veza upućuje. Unatoč činjenici da uspjeh napada ovisi o točnosti odabranog vremena zamjene direktorija i da je malo vjerojatno da će prvi put pogoditi pravi trenutak, tijekom pokusa istraživači su uspjeli postići ponovljiv uspješan napad nakon izvođenja exploita unutar nekoliko sekundi.

Zahvaćene su sve verzije Rusta od 1.0.0 do 1.58.0. Problem je za sada riješen u obliku zakrpe (popravak će biti uključen u izdanje 1.58.1, koje se očekuje za nekoliko sati). Uklanjanje ranjivosti u distribucijama možete pratiti na ovim stranicama: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Svim korisnicima Rust programa koji rade s povišenim privilegijama i koriste funkciju remove_dir_all savjetuje se da hitno ažuriraju Rust na verziju 1.58.1. Zanimljivo je da izdana zakrpa ne rješava problem na svim sustavima, primjerice u REDOX OS-u i verzijama macOS-a prije 10.10 (Yosemite), ranjivost nije blokirana zbog nepostojanja zastavice O_NOFOLLOW koja onemogućuje sljedeće simbole poveznice.

Izvor: opennet.ru

Dodajte komentar