Исследователи Microsoft обнаружили ошибку безопасности памяти в стандартной библиотеке Rust, которая оставалась незамеченной почти 11 лет, а также другие уязвимости, способные вызвать неопределенное поведение даже в приложениях, написанных полностью на безопасном Rust. Два из обнаруженных дефектов затрагивают стабильную версию Rust, включая отдельную проблему, которая может привести к доступу приложений к освобожденной памяти.
Почти 11-летняя ошибка связана с функцией `process::exit` в Rust. Исследователи из лаборатории FORGE Microsoft обнаружили, что вызов этой функции из дочернего потока может привести к удалению средой выполнения альтернативного стека сигналов основного потока во время его работы. Если основной поток впоследствии столкнется с переполнением стека, операционная система может не суметь корректно доставить сигнал, что приведет к ошибке сегментации вместо предусмотренной Rust обработки переполнения стека.
«Ошибка стека сигналов `process::exit` присутствовала в стандартной библиотеке почти 11 лет», — написали исследователи в сообщении в блоге. Microsoft заявила, что исследователи не нашли надежных путей эксплуатации при исследованных условиях и оценили практическую возможность эксплуатации как маловероятную.
В исследовании использовалась Hyenas — система сканирования уязвимостей на базе ИИ от FORGE Lab — для анализа небезопасного кода в стандартной библиотеке Rust. Hyenas является исследовательской версией MDASH, системы обнаружения уязвимостей Microsoft на основе агентов.
Microsoft сообщила, что некоторые ошибки были найдены с помощью Hyenas. Затем исследователи изучили исходный код, воспроизвели проблемы, оценили их влияние на безопасность и сообщили о них сопровождающим Rust.
Microsoft заявила, что практический риск ограничен. Каждая уязвимость требует необычных условий для срабатывания, и ошибка в стандартной библиотеке становится «серьезной уязвимостью только в том случае, если реальная программа достигает API таким образом», — написали исследователи.
Небезопасный код бросает вызов гарантиям безопасности Rust
Модель владения и система типов Rust разработаны для предотвращения проблем безопасности памяти, обычно связанных с такими языками, как C и C++. Однако его стандартная библиотека внутренне полагается на небезопасный код для операций, которые компилятор не может проверить.
Такие компоненты, как `Vec` и `String`, используют эти операции, но предоставляют их через безопасные API. Microsoft заявила, что эти API должны соответствовать строгому требованию корректности: «независимо от того, как безопасный код их использует, невозможно вызвать неопределенное поведение».
Microsoft сгруппировала находки по трем категориям: небезопасный код, который предполагает, что операции не вызовут панику, код, который доверяет пользовательским реализациям корректно работать, и код, который делает неверные предположения о нижележащей системе.
Первая категория включала проблему безопасности паники в реализации `MapWindows::clone` в Rust. Функция создавала буфер до полной инициализации его содержимого, а затем вызывала пользовательскую операцию клонирования для его заполнения. Если эта операция вызывала панику, механизм размотки стека Rust мог вызвать деструктор буфера, который попытался бы получить доступ к неинициализированной памяти. Microsoft заявила, что предложенное исправление предотвращает уничтожение частично инициализированного буфера до завершения инициализации.
Другая находка касалась `str::replace`. Исследователи обнаружили, что функция может сделать неверное предположение о пользовательской реализации ночного трейта `Pattern`. Пользовательская реализация могла предоставить не-ASCII байт там, где код ожидал ASCII символ, что привело бы к тому, что операция замены создала бы недопустимые данные UTF-8. Последующие операции со строками могли вызвать неопределенное поведение, сообщила Microsoft.
Системные ошибки затрагивают стабильную версию Rust
Microsoft заявила, что первые две категории уязвимостей уже изучались в 2021 году с помощью Rudra — статического анализатора, разработанного членами исследовательской группы. Стандартная библиотека также решала проблемы безопасности паники еще в 2015 году, но подобные уязвимости продолжают появляться в ее реализациях.
Третья категория включает взаимодействие между Rust и нижележащими операционными системами и библиотеками C. Помимо проблемы с `process::exit`, исследователи выявили проблему в функциональности `CommandExt::exec` в Rust, связанную с массивом переменных окружения всего процесса.
Microsoft обнаружила, что функция могла изменять это общее состояние, удерживая блокировку чтения, что потенциально позволяло другим потокам получать доступ к несогласованным данным. При определенных условиях параллельные операции могли привести к тому, что указатель окружения ссылался на освобожденную память.
Microsoft заявила, что как находки, связанные с `process::exit`, так и с `CommandExt::exec`, затрагивают стабильную версию Rust. Предложенное исправление для проблемы с переменными окружения, которое позволяет избежать изменения общего массива путем прямого вызова `execve`, находилось на рассмотрении на момент публикации сообщения в блоге.
Две проблемы, о которых сообщила команда Microsoft, оставались открытыми на момент публикации. В блоге также обсуждались связанные отчеты от других исследователей и исправления, находящиеся на рассмотрении.
Находки используются в продуктах безопасности Microsoft
Microsoft заявила, что результаты исследования также могут быть использованы в Microsoft Perception — ее многоагентной системе безопасности, где специализированные агенты работают в рамках более широких рабочих процессов безопасности. Это, следовательно, поможет компании улучшить разработку MDASH, которая внедряет обнаружение уязвимостей на основе агентов в Microsoft Defender.
Например, агент тестирования веб-приложений Microsoft может использовать результаты MDASH для приоритизации тестирования, оценки возможности эксплуатации против работающих приложений и предоставления информации для поддержки устранения уязвимостей, написали исследователи.
«Наша цель — не просто найти больше ошибок», — написали исследователи, — «а выявить значимые проблемы и повысить безопасность фундаментального программного обеспечения, на которое полагаются разработчики и организации». Проект Rust не ответил на запрос о комментарии от CSO на момент написания статьи.
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Gyana Swain




