Критическая уязвимость в 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 runtime.

В качестве обходных путей для блокирования ошибки при невозможности обновить версию Wasmtime упоминается указание опции “Config::static_memory_maximum_size(0)” для включения обязательной отдельной проверки границ при любом доступе к линейной памяти (приводит к существенному снижению производительности). Другим вариантом является использование настройки :Config::static_memory_guard_size(1

Release. Ссылка here.