I standardbiblioteket för Rust-språket har en sårbarhet upptäckts (CVE-2022-21658) kopplad till en kapplöpning i funktionen std::fs::remove_dir_all(). Vid användning av denna funktion för att ta bort tillfälliga filer i en privilegierad applikation kan en angripare uppnå borttagning av godtyckliga systemfiler och kataloger som normalt inte går att nå för angriparen.
Sårbarheten orsakas av en felaktig implementering av kontrollen av symboliska länkar innan rekursiv borttagning av kataloger. Istället för att förbjuda följande av symboliska länkar, kontrollerar funktionen remove_dir_all() först om filen är en symbolisk länk. Om en länk identifieras, tas den bort som en fil, och om det är en katalog, kallas operationen för rekursiv borttagning av innehållet. Problemet är att det finns en liten försening mellan kontrollen och startpunkten för borttagningsoperationen.
I det ögonblick kontrollen redan har genomförts, men kataloggenomgången för borttagning ännu inte har påbörjats, kan angriparen byta ut katalogen med tillfälliga filer mot en symbolisk länk. Om detta görs vid rätt tidpunkt kommer funktionen remove_dir_all() att behandla den symboliska länken som en katalog och börja ta bort det innehåll som länken pekar på. Trots att framgången med attacken beror på noggrannhet i tidpunkten för katalogbyte och chansen att träffa rätt vid första försöket är liten, har forskarna lyckats uppnå ett upprepade gånger framgångsrikt genomförande av attacken efter att ha kört exploiten under några sekunder.
Alla versioner av Rust från 1.0.0 till och med 1.58.0 är mottagliga för denna sårbarhet. Problemet har än så länge åtgärdats i form av en patch (fixen kommer att ingå i version 1.58.1, som förväntas släppas inom några timmar). För att följa upp på hanteringen av sårbarheten i distributioner kan man kolla på dessa sidor: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Alla användare av program skrivna i Rust, som körs med höga privilegier och använder funktionen remove_dir_all, rekommenderas att omgående uppdatera Rust till version 1.58.1. Intressant nog löser den utgivna patchen inte problemet på alla system; till exempel, i REDOX-operativsystemet och versioner av macOS före 10.10 (Yosemite) blockeras sårbarheten inte på grund av avsaknaden av O_NOFOLLOW-flaggan, som inaktiverar följande av symboliska länkar.
Källa: opennet.ru
