Ranljivost v standardni knjižnici Rust

V standardni knjižnici Rust je bila ugotovljena ranljivost (CVE-2022-21658) zaradi dirkalnega stanja v funkciji std::fs::remove_dir_all(). Če se ta funkcija uporablja za brisanje začasnih datotek v privilegirani aplikaciji, lahko napadalec doseže izbris poljubnih sistemskih datotek in imenikov, do katerih napadalec običajno ne bi imel dostopa za brisanje.

Ranljivost je posledica nepravilne implementacije preverjanja simbolnih povezav pred rekurzivnim brisanjem imenikov. Namesto da bi preprečil sledenje simbolnim povezavam, remove_dir_all() najprej preveri, ali je datoteka simbolna povezava. Če je povezava definirana, se izbriše kot datoteka, če pa je imenik, se pokliče rekurzivna operacija odstranjevanja vsebine. Težava je v tem, da je med preverjanjem in začetkom operacije brisanja majhna zamuda.

V času, ko je preverjanje že opravljeno, vendar se operacija popisovanja imenikov za izbris še ni začela, lahko napadalec s simbolično povezavo zamenja imenik z začasnimi datotekami. Če zadene ob pravem času, bo funkcija remove_dir_all() simbolno povezavo obravnavala kot imenik in začela odstranjevati vsebino, na katero kaže povezava. Kljub dejstvu, da je uspeh napada odvisen od točnosti izbranega časa zamenjave imenika in da je prvi udarec v pravi trenutek malo verjeten, je raziskovalcem med poskusi uspelo doseči ponovljiv uspešen napad po izvedbi exploita znotraj nekaj sekund.

Prizadete so vse različice Rust od 1.0.0 do vključno 1.58.0. Težava je bila za zdaj rešena v obliki popravka (popravek bo vključen v izdajo 1.58.1, ki jo pričakujemo v nekaj urah). Odpravljanje ranljivosti v distribucijah lahko spremljate na teh straneh: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Vsem uporabnikom programov Rust, ki se izvajajo s povišanimi privilegiji in uporabljajo funkcijo remove_dir_all, svetujemo, da Rust nujno posodobijo na različico 1.58.1. Zanimivo je, da izdani popravek ne reši težave na vseh sistemih, na primer v OS REDOX OS in različicah macOS pred 10.10 (Yosemite) ranljivost ni blokirana zaradi odsotnosti zastavice O_NOFOLLOW, ki onemogoča naslednje simbolne povezave.

Vir: opennet.ru

Dodaj komentar