CVE-2023-26489 in wasmtimeИнформация

Сводка

по VulDB • 09.05.2026

wasmtime — это быстрый и безопасный рантайм для WebAssembly. В затронутых версиях генератор кода wasmtime, Cranelift, содержит ошибку на целевых платформах x86_64, при которой вычисление режима адресации ошибочно рассчитывает эффективный адрес размером 35 бит вместо определенного стандартом WebAssembly эффективного адреса размером 33 бита. Эта ошибка означает, что при настройках генерации кода по умолчанию операция загрузки/загрузки (load/store), управляемая wasm-кодом, может читать/записывать адреса, находящиеся на расстоянии до 35 бит от начала линейной памяти. Однако из-за этой ошибки из кода гостевой программы (guest code) становятся возможными адреса, находящиеся на расстоянии до `0xffffffff * 8 + 0x7ffffffc = 36507222004 = ~34G` байт от начала линейной памяти. Это означает, что виртуальная память, находящаяся на расстоянии 6G от начала линейной памяти и вплоть до ~34G, может быть прочитана или записана вредоносным модулем. Модуль гостевой программы может читать и записывать память в этом регионе без ведома встраивающей стороны (embedder). Например, эта память может принадлежать другим экземплярам WebAssembly при использовании пула аллокаторов (pooling allocator). Затронутым встраивающим сторонам рекомендуется проанализировать существующие wasm-модули, чтобы определить, подвержены ли они неправильным правилам генерации кода, и, возможно, сопоставить это с аномально большим количеством сбоев (traps) во время исторического выполнения, чтобы выявить потенциально подозрительные модули.

Специфическая ошибка в бэкенде Cranelift для x86_64 заключается в том, что адрес WebAssembly, который сдвигается влево на константное значение от 1 до 3, сворачивается (folds) в режимы адресации x86_64, выполняющие сдвиги. Например, `(i32.load (i32.shl (local.get 0) (i32.const 3)))` загружает данные по адресу WebAssembly `$local0 << 3`. При трансляции в Cranelift вычисление `$local0 << 3`, представляющее собой 32-битное значение, расширяется нулями до 64-битного значения, а затем добавляется к базовому адресу линейной памяти. Cranelift генерирует инструкцию вида `movl (%base, %local0, 8), %dst`, которая вычисляет `%base + %local0 << 3`. Однако ошибка заключается в том, что вычисление адреса происходит с 64-битными значениями, тогда как вычисление `$local0 << 3` должно было быть усечено до 32-битного значения. Это означает, что `%local0`, который может использовать до 32 бит для адреса, получает дополнительные 3 бита адресного пространства, доступные через эту инструкцию `movl`.

Исправление в Cranelift заключается в удалении ошибочных правил понижения (lowering rules) в бэкенде, которые обрабатывают эти выражения с расширением нулями. Приведенный выше пример затем транслируется в `movl %local0, %temp; shl $3, %temp; movl (%base, %temp), %dst`, что корректно усечает промежуточное вычисление `%local0 << 3` до 32-битного значения.

### Затронутые версии

Эта ошибка затрагивает все версии Wasmtime до 1.0.0.

### Влияние на безопасность

Эта ошибка позволяет вредоносным модулям WebAssembly читать и записывать память, находящуюся на расстоянии до ~34G от начала линейной памяти. Это может привести к утечке информации или выполнению произвольного кода, если встраивающая сторона не принимает дополнительных мер предосторожности.

### Рекомендации

1. **Обновите Wasmtime**: Обновите Wasmtime до версии 1.0.0 или выше, где эта ошибка исправлена. 2. **Используйте Workarounds**: - **`Config::static_memory_maximum_size(0)`**: Эта опция заставляет все обращения к линейной памяти явно проверять границы. Это может значительно снизить производительность выполнения WebAssembly-модулей. - **`Config::static_memory_guard_size(1 << 36)`**: Эта опция значительно увеличивает количество страниц защиты, размещаемых после линейной памяти. Это гарантирует, что обращения к памяти на расстоянии до 34G будут семантически корректными, так как зарезервирует не отображенную память для экземпляра. Однако это резервирует очень большой объем виртуальной памяти на экземпляр и может значительно снизить максимальное количество одновременных экземпляров. - **Использование не-x86_64 хоста**: Если возможно, используйте хост с архитектурой, отличной от x86_64. Эта ошибка не затрагивает бэкенд Cranelift для AArch64.

### Заключение

Эта ошибка в Wasmtime представляет серьезную угрозу безопасности для пользователей, работающих с вредоносными или непроверенными WebAssembly-модулями. Рекомендуется немедленно обновить Wasmtime до последней версии или применить указанные workarounds, чтобы минимизировать риски.

VulDB is the best source for vulnerability data and more expert information about this specific topic.

Ответственный

GitHub, Inc.

Резервировать

23.02.2023

Раскрытие

08.03.2023

Модерация

принято

Вход

VDB-222615

EPSS

0.01261

KEV

Нет

Деятельности

Очень низкий

Источники

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!