Две уязвимости Wasmtime позволяют WebAssembly-модулям выйти из песочницы

Bytecode Alliance исправила две критические уязвимости в Wasmtime — среде выполнения WebAssembly вне браузера. Обе получили оценку CVSS 9,9: CVE-2026-115889 затрагивает все процессорные архитектуры, а CVE-2026-115893 — только ARM64. Исправленные версии вышли 19 и 20 октября: 36.0.19, 48.0.7, 49.0.4 и 50.0.0.
Проблемы способны позволить атакующему модулю WebAssembly покинуть предусмотренную для него песочницу. Для эксплуатации злоумышленник должен получить возможность скомпилировать модуль, который он контролирует, в уязвимой сборке Wasmtime. Под наибольшим риском находятся сервисы, принимающие или исполняющие код сторонних разработчиков.
Ошибки в компиляторе Cranelift
Обе уязвимости находятся в Cranelift — компиляторе, который Wasmtime использует по умолчанию для преобразования WebAssembly в машинный код. Песочница должна ограничивать модуль его собственной памятью, разрешёнными хост-функциями и проверенными точками перехода в коде.
CVE-2026-115889 связана с хранением идентификаторов значений внутри функции. До версии 43 Cranelift упаковывал эти числа в 24-битные поля. В релизных сборках слишком большое значение переполняло поле без ошибки, из-за чего компилятор мог обратиться к неверному значению и сгенерировать некорректный машинный код.
Согласно уведомлению разработчиков, очень крупная функция WebAssembly либо функция с большим числом значений может вызвать путаницу типов и выход из песочницы. В основной ветке проблему устранили ещё изменением от 18 февраля: ширина полей была увеличена до 32 бит, а изменение вошло в Wasmtime 43.0.0 20 марта. В ветку LTS 36.x оно попало 19 октября.
Отдельный риск для ARM64
CVE-2026-115893 затрагивает инструкцию WebAssembly br_table, выбирающую одну из множества точек перехода по индексу. Если индекс выходит за пределы таблицы, исполнение должно перейти к цели по умолчанию.
На ARM64 Cranelift использовал для такого перехода ветвление с дальностью около 1 МБ. Таблица примерно с 256 тысячами целей делала переход слишком длинным, и он молча указывал не туда. В уведомлении сказано, что движок Wasmtime со стандартными настройками на ARM64 можно вынудить перейти к произвольному коду с помощью контролируемого пользователем Wasm-модуля.
Ошибка присутствовала с момента появления поддержки ARM64 в Wasmtime в 2020 году. Исправление направляет индексы вне диапазона через саму таблицу переходов и запрещает компиляцию br_table с числом целей более 65 520.
Какие версии обновить
Ветки 36, 48, 49 и 50 продолжают получать исправления безопасности. Для 36.x безопасна версия 36.0.19, для 48.x — 48.0.7, для 49.x — 49.0.4; Wasmtime 50.0.0 также закрывает обе проблемы. Ветки с 37.0.0 по 42.x и неподдерживаемые релизы требуют перехода на одну из исправленных версий.
Версии 43.0.0–47.x не подвержены CVE-2026-115889, но уязвимы для ARM64-проблемы. Владельцам ARM64-хостов важно учесть, что апрельские обновления 36.0.7, 42.0.2 и 43.0.1, выпускавшиеся для другой ошибки выхода из песочницы, CVE-2026-115893 не устраняют.
Wasmtime часто встраивается в приложения как библиотека, поэтому обновление только консольной утилиты не решает проблему. Организациям стоит инвентаризировать программы с Wasmtime, пересобрать каждый хост с исправленной зависимостью и в первую очередь ограничить приём внешних модулей до обновления. На 26 октября сведений об атаках не было, а CISA не включила обе CVE в каталог известных эксплуатируемых уязвимостей.

