Rust standarta bibliotēkas ievainojamība

Rust standarta bibliotēkā ir konstatēta ievainojamība (CVE-2022-21658) funkcijā std::fs::remove_dir_all() esošā sacensību stāvokļa dēļ. Ja šī funkcija tiek izmantota, lai dzēstu pagaidu failus priviliģētā lietojumprogrammā, uzbrucējs var panākt patvaļīgu sistēmas failu un direktoriju dzēšanu, kurus uzbrucējs parasti nevarētu dzēst.

Ievainojamību izraisa nepareiza simbolisko saišu pārbaudes ieviešana pirms direktoriju rekursīvas dzēšanas. Tā vietā, lai novērstu simbolu saišu ievērošanu, remove_dir_all() vispirms pārbauda, ​​vai fails ir simbolsaite. Ja saite ir definēta, tad tā tiek dzēsta kā fails, un, ja tā ir direktorija, tad tiek izsaukta rekursīva satura noņemšanas darbība. Problēma ir tāda, ka starp pārbaudi un dzēšanas darbības sākšanu ir neliela aizkave.

Laikā, kad pārbaude jau ir veikta, bet dzēšanai paredzēto direktoriju uzskaitīšanas darbība vēl nav sākusies, uzbrucējs var aizstāt direktoriju ar pagaidu failiem ar simbolisku saiti. Ja tas nokļūst īstajā laikā, funkcija remove_dir_all() uztvers simbolisko saiti kā direktoriju un sāks noņemt saturu, uz kuru saite norāda. Neskatoties uz to, ka uzbrukuma panākumi ir atkarīgi no izvēlētā direktorija nomaiņas laika precizitātes un ir maz ticams, ka pirmajā reizē trāpīt īstajā brīdī, eksperimentu laikā pētnieki spēja panākt atkārtojamu veiksmīgu uzbrukumu pēc eksploīta izpildes laikā. dažas sekundes.

Tiek ietekmētas visas Rust versijas no 1.0.0 līdz 1.58.0 ieskaitot. Pagaidām problēma ir atrisināta ielāpu formā (labojums tiks iekļauts 1.58.1 laidienā, kas paredzēts dažu stundu laikā). Varat pārraudzīt ievainojamības novēršanu izplatījumos šādās lapās: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Visiem Rust programmu lietotājiem, kas darbojas ar paaugstinātām privilēģijām un izmanto funkciju remove_dir_all, ieteicams steidzami atjaunināt Rust uz versiju 1.58.1. Interesanti, ka izlaistais ielāps neatrisina problēmu visās sistēmās; piemēram, REDOX OS un macOS versijās, kas vecākas par 10.10 (Yosemite), ievainojamība nav bloķēta, jo nav karoga O_NOFOLLOW, kas atspējo simbolisko darbību. saites.

Avots: opennet.ru

Pievieno komentāru