Вразливість у стандартній бібліотеці мови 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

Додати коментар або відгук