Уразлівасць у стандартнай бібліятэцы мовы Rust

У стандартнай бібліятэцы мовы Rust выяўлена ўразлівасць (CVE-2022-21658), злучаная са станам гонкі ў функцыі std::fs::remove_dir_all(). У выпадку ўжывання дадзенай функцыі для выдалення часавых файлаў у прывілеяваным прыкладанні, зламыснік можа дамагчыся выдаленні адвольных сістэмных файлаў і каталогаў, да выдалення якіх у звычайных умовах у атакавалага няма доступу.

Уразлівасць выклікана некарэктнай рэалізацыяй праверкі сімвалічных спасылак перад рэкурсіўным выдаленнем каталогаў. Замест забароны прытрымлівання па сімвалічных спасылках, функцыя remove_dir_all() спачатку правярае, ці з'яўляецца файл сімвалічнай спасылкай. Калі вызначана спасылка, то яна выдаляецца як файл, а калі каталог - то выклікаецца аперацыя рэкурсіўнага выдалення змесціва. Праблема ў тым, што паміж праверкай і пачаткам аперацыі выдалення ёсць невялікая затрымка.

У момант, калі праверка ўжо праведзена, але аперацыя перабору каталогаў для выдалення яшчэ не пачалася, атакавалы можа падмяніць каталог з часавымі файламі на сімвалічную спасылку. У выпадку траплення ў патрэбны момант, функцыя remove_dir_all() апрацуе сімвалічную спасылку як каталог і пачне выдаленне змесціва на якое, паказвае дадзеная спасылка. Нягледзячы не тое, што поспех нападу залежыць ад дакладнасці абранага часу замены каталога і трапленне з першага разу ў патрэбны момант малаверагодна, падчас эксперыментаў даследнікам атрымалася дамагчыся паўтаранага паспяховага правядзення нападу пасля выканання эксплоіта на працягу некалькіх секунд.

Уразлівасці схільныя ўсе версіі Rust з 1.0.0 па 1.58.0 улучна. Праблема пакуль ухіленая ў форме патча (выпраўленне будзе ўключана ў выпуск 1.58.1, які чакаецца на працягу некалькіх гадзін). Прасачыць за ўхіленнем уразлівасці ў дыстрыбутывах можна на дадзеных старонках: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Усім карыстачам праграм на мове Rust, выкананым з падвышанымі прывілеямі і выкарыстоўвалым функцыю remove_dir_all, рэкамендуецца тэрмінова абнавіць Rust да версіі 1.58.1. Цікава, што выпушчаны патч вырашае праблему не на ўсіх сістэмах, напрыклад, у АС REDOX і версіях macOS да 10.10 (Yosemite) уразлівасць не блакуецца з-за адсутнасці сцяга O_NOFOLLOW, які адключае прытрымліванне па сімвалічных спасылках.

Крыніца: opennet.ru

Дадаць каментар