O bibliotecă standard a limbajului Rust a identificat o vulnerabilitate (CVE-2022-21658) legată de o stare de competiție în funcția std::fs::remove_dir_all(). Atunci când această funcție este utilizată pentru a șterge fișiere temporare într-o aplicație cu privilegii, un atacator poate obține ștergerea unor fișiere și directoare sistemice arbitrare, accesibile în mod normal atacatorului.
Vulnerabilitatea este cauzată de o implementare incorectă a verificării legăturilor simbolice înainte de ștergerea recursivă a directoarelor. În loc să interzică urmarea legăturilor simbolice, funcția remove_dir_all() verifică mai întâi dacă fișierul este o legătură simbolică. Dacă se stabilește o legătură, aceasta este ștearsă ca fișier, iar dacă este director, se inițiază ștergerea recursivă a conținutului. Problema constă în faptul că există o întârziere mică între verificare și pornirea operațiunii de ștergere.
În momentul în care verificarea a fost deja efectuată, dar operațiunea de parcurs directoare pentru ștergere nu a început încă, atacatorul poate substitui directorul cu fișiere temporare cu o legătură simbolică. Dacă atacatorul acționează la momentul potrivit, funcția remove_dir_all() va trata legătura simbolică ca pe un director și va începe ștergerea conținutului la care se referă această legătură. Deși succesul atacului depinde de precizia momentului ales pentru substituire și este puțin probabil ca atacatorul să reușească din prima încercare, cercetătorii au reușit, în experimente, să realizeze un atac repetabil cu succes după executarea exploit-ului în câteva secunde.
Toate versiunile Rust de la 1.0.0 la 1.58.0 inclusiv sunt vulnerabile. Problema a fost până acum remediată printr-un patch (corectura va fi inclusă în lansarea 1.58.1, așteptată în câteva ore). Remedierea vulnerabilității în distribuții poate fi urmărită pe următoarele pagini: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Toți utilizatorii aplicațiilor scrise în Rust care sunt rulate cu privilegii elevate și utilizează funcția remove_dir_all sunt sfătuiți să actualizeze urgent Rust la versiunea 1.58.1. Este interesant de menționat că patch-ul lansat nu rezolvă problema pe toate sistemele, de exemplu, în sistemele de operare REDOX și versiunile macOS înainte de 10.10 (Yosemite), vulnerabilitatea nu este blocată din cauza absenței flag-ului O_NOFOLLOW, care dezactivează urmarea legăturilor simbolice.
Sursa: opennet.ro
