CVE-2023-30624 in Wasmtime
Сводка
по VulDB • 22.07.2026
Wasmtime — это автономный рантайм для WebAssembly. В версиях до 6.0.2, 7.0.1 и 8.0.1 реализация управления состоянием на уровне экземпляра (например, таблицами и памятью) в Wasmtime содержит неопределенное поведение уровня LLVM. Было установлено, что это неопределенное поведение вызывает проблемы на уровне рантайма при компиляции с помощью LLVM 16, из-за чего некоторые записи, критически важные для корректности работы, оптимизируются и удаляются. Известно, что уязвимые версии Wasmtime, скомпилированные с использованием Rust 1.70 (находящейся в стадии бета-тестирования) или более поздних версий, содержат некорректно скомпилированные функции. Версии Wasmtime, скомпилированные со стабильным релизом Rust 1.69 и предыдущими версиями, на данный момент не имеют известных проблем, однако теоретически могут проявлять потенциальные уязвимости.
Основная проблема заключается в том, что состояние рантайма экземпляра Wasmtime включает определенную на языке Rust структуру `Instance`, за которой следует структура `VMContext`. Структура `VMContext` имеет определяемый во время выполнения макет (layout), уникальный для каждого модуля. Такое представление невозможно выразить с помощью безопасного кода в Rust, поэтому требуется использование небезопасного (`unsafe`) кода для поддержания этого состояния. Однако код, реализующий это, содержит методы, которые принимают `&self` в качестве аргумента, но модифицируют данные в части выделения памяти, относящейся к `VMContext`. Это означает, что указатели, полученные из `&self`, изменяются (мутируются). В Rust такое обычно не допускается за исключением случаев наличия `UnsafeCell`. При компиляции в LLVM эти функции имеют параметры с атрибутами `noalias readonly`, что делает запись через такие указателями неопределенным поведением.
Внутреннее представление и управление `VMContext` в Wasmtime были обновлены для использования методов, принимающих `&mut self`, где это уместно. Кроме того, планируется вскоре запустить инструменты проверки небезопасного кода на Rust (например, `cargo miri`) на ветке `main`, чтобы устранить любые проблемы уровня Rust, которые могут быть использованы в будущих версиях компилятора.
Прескомпилированные бинарные файлы Wasmtime, доступные для загрузки из релизов GitHub, были скомпилированы не более чем с LLVM 15 и поэтому на данный момент считаются неуязвимыми. Как упоминалось выше, обновление тем не менее рекомендуется.
Выпущены версии Wasmtime 6.0.2, 7.0.1 и 8.0.1, содержащие исправление, необходимое для корректной работы с LLVM 16 и исключающее известное неопределенное поведение при использовании LLVM 15 и более ранних версий. Если Wasmtime скомпилирован с использованием Rust 1.69 и предыдущих версий (которые используют LLVM 15), известных проблем нет. Однако существует теоретическая возможность эксплуатации неопределенного поведения, поэтому пользователям рекомендуется обновиться до исправленной версии Wasmtime. Пользователи, использующие бета-версию Rust (на данный момент это версия 1.70) или nightly-сборки Rust (на данный момент это версия 1.71), обязаны обновиться до исправленной версии для обеспечения корректной работы.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.