Ranjivost u standardnoj biblioteci Rust

Ranjivost (CVE-2022-21658) je identifikovana u Rust standardnoj biblioteci zbog stanja trke u funkciji std::fs::remove_dir_all(). Ako se ova funkcija koristi za brisanje privremenih datoteka u privilegovanoj aplikaciji, napadač može postići brisanje proizvoljnih sistemskih datoteka i direktorija kojima napadač inače ne bi imao pristup da izbriše.

Ranjivost je uzrokovana neispravnom implementacijom provjere simboličkih veza prije rekurzivnog brisanja direktorija. Umjesto da spriječi praćenje simboličnih veza, remove_dir_all() prvo provjerava da li je datoteka simbolična veza. Ako je veza definirana, ona se briše kao datoteka, a ako je direktorij, poziva se 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 operacija nabrajanja direktorija za brisanje još nije počela, napadač može zamijeniti direktorij privremenim datotekama sa simboličkom vezom. Ako pogodi u pravo vrijeme, funkcija remove_dir_all() će tretirati simboličku vezu kao direktorij i početi uklanjati sadržaj na koji veza upućuje. Unatoč činjenici da uspjeh napada ovisi o tačnosti odabranog vremena zamjene direktorija i da je pogodak u pravom trenutku prvi put malo vjerojatan, tokom eksperimenata istraživači su uspjeli postići ponovljiv uspješan napad nakon izvršenja eksploatacije unutar nekoliko sekundi.

Zahvaćene su sve verzije Rusta od 1.0.0 do 1.58.0 uključujući. Problem je za sada rešen u formi zakrpe (popravka će biti uključena u izdanje 1.58.1, koje se očekuje u roku od 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 savjetujemo da hitno ažuriraju Rust na verziju 1.58.1. Zanimljivo je da objavljena zakrpa ne rješava problem na svim sistemima; na primjer, u REDOX OS-u i verzijama macOS-a prije 10.10 (Yosemite), ranjivost nije blokirana zbog odsustva zastavice O_NOFOLLOW, koja onemogućuje praćenje simbola linkovi.

izvor: opennet.ru

Dodajte komentar