یک آسیب پذیری (CVE-2022-21658) در کتابخانه استاندارد Rust به دلیل شرایط مسابقه در تابع 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 OS و نسخه های macOS قبل از 10.10 (Yosemite)، آسیب پذیری به دلیل عدم وجود پرچم O_NOFOLLOW مسدود نمی شود که دنبال کردن نمادها را غیرفعال می کند. پیوندها
منبع: opennet.ru