Rust стандартты кітапханасындағы осалдық

std::fs::remove_dir_all() функциясындағы жарыс жағдайына байланысты Rust стандартты кітапханасында осалдық (CVE-2022-21658) анықталды. Егер бұл функция артықшылықты қолданбадағы уақытша файлдарды жою үшін пайдаланылса, шабуылдаушы әдетте жоюға қол жеткізе алмайтын еркін жүйелік файлдар мен каталогтарды жоюға қол жеткізе алады.

Осалдық каталогтарды рекурсивті түрде жою алдында символдық сілтемелерді тексеруді дұрыс орындамаудан туындайды. Символдық сілтемелердің орындалуын болдырмаудың орнына, remove_dir_all() алдымен файлдың символдық сілтеме екенін тексереді. Егер сілтеме анықталған болса, онда ол файл ретінде жойылады, ал егер ол каталог болса, онда рекурсивті мазмұнды жою операциясы шақырылады. Мәселе мынада, тексеру мен жою операциясының басталуы арасында шамалы кідіріс бар.

Тексеру әлдеқашан жүргізілген, бірақ жою үшін каталогтарды санау операциясы әлі басталмаған кезде, шабуылдаушы каталогты символдық сілтемесі бар уақытша файлдармен ауыстыра алады. Егер ол дұрыс уақытта соқса, remove_dir_all() функциясы символдық сілтемені каталог ретінде қарастырады және сілтеме көрсететін мазмұнды жоя бастайды. Шабуылдың сәттілігі каталогты ауыстырудың таңдалған уақытының дәлдігіне байланысты және бірінші рет дұрыс сәтке жету екіталай екеніне қарамастан, эксперименттер барысында зерттеушілер эксплуатацияны орындағаннан кейін қайталанатын сәтті шабуылға қол жеткізе алды. бірнеше секунд.

Rust-тың 1.0.0-ден 1.58.0-ге дейінгі барлық нұсқалары әсер етеді. Мәселе әзірге патч түрінде шешілді (түзету бірнеше сағат ішінде күтілетін 1.58.1 шығарылымына енгізіледі). Сіз осы беттердегі дистрибуциялардағы осалдықтың жойылуын бақылай аласыз: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Жоғары артықшылықтармен жұмыс істейтін және remove_dir_all функциясын пайдаланатын Rust бағдарламаларының барлық пайдаланушыларына Rust бағдарламасын 1.58.1 нұсқасына шұғыл түрде жаңарту ұсынылады. Бір қызығы, шығарылған патч барлық жүйелердегі мәселені шешпейді; мысалы, REDOX OS және macOS-тың 10.10 (Yosemite) нұсқасына дейінгі нұсқаларында осалдық O_NOFOLLOW жалауының болмауына байланысты бұғатталмайды, ол келесі символдық әрекеттерді өшіреді. сілтемелер.

Ақпарат көзі: opennet.ru

пікір қалдыру