Критическая уязвимость в Wasmtime, runtime для WebAssembly-приложений

В корректирующих обновлениях Wasmtime 6.0.1, 5.0.1 и 4.0.1 устранена уязвимость (CVE-2023-26489), которой присвоен критический уровень опасности. Уязвимость позволяет организовать запись данных в область памяти вне границы, допустимой для изолированного WebAssembly-кода, что потенциально может быть использовано атакующим для организации выполнения своего кода вне изолированного окружения WASI.

Wasmtime представляет собой runtime для выполнения WebAssembly-приложений с расширениями WASI (WebAssembly System Interface) как обычных обособленных приложений. Инструментарий написан на языке Rust, а уязвимость вызвана логической ошибкой
при определении правил линейной адресации памяти в генераторе кода Cranelift, транслирующем независимое от аппаратных архитектур промежуточное представление в исполняемый машинный код для архитектуры x86_64.

В частности, для WebAssembly-приложений рассчитывались 35-разрядные эффективные адреса вместо разрешённых в WebAssembly 33-разрядных адресов, что сдвигало границу допустимой для операций чтения и записи виртуальной памяти до 34 ГБ, в то время как настройки sandbox-окружения предоставляют защиту для 6 ГБ от базового адреса. В итоге, диапазон виртуальной памяти от 6 до 34 ГБ от базового адреса оказывался доступен для чтения и записи из WebAssembly-приложений. В данной памяти могут размещаться другие окружения WebAssembly или компоненты WebAssembly runtime.

При невозможности обновить версию Wasmtime в качестве обходных путей для блокирования ошибки упоминается указание опции «Config::static_memory_maximum_size(0)» для включения обязательной отдельной проверки границ при любом доступе к линейной памяти (приводит к существенному снижению производительности). Другим вариантом является использование настройки «Config::static_memory_guard_size(1 ‹ 36)» для увеличения числа с сторожевых страниц памяти (Guard Page, при обращении генерируется исключение), размещаемых в проблемном диапазоне виртуальной памяти (приводит к резервированию большого объёма виртуальной памяти и ограничению числа одновременно выполняемых WebAssembly-приложений).

Источник: http://www.opennet.ru/opennews/art.shtml?num=58775