V
Сканер-ВС
ГлавнаяКаталогИсточникиCWECAPECATT&CKМеры защитыПродуктыВендорыДокументация
CVE-2023-26489
DEB
Критический

wasmtime - это быстрая и безопасная среда выполнения для WebAssembly. В затронутых версиях генератор кода wasmtime, Cranelift, имеет ошибку…

CVSS
9.9
Критический
EPSS
0.01
p65
Опубликовано
2023-01-01
Обновлено
2023-01-01
Описание

wasmtime - это быстрая и безопасная среда выполнения для WebAssembly. В затронутых версиях генератор кода wasmtime, Cranelift, имеет ошибку на целях x86_64, где вычисление режима адреса ошибочно вычисляет 35-битный эффективный адрес вместо определенного WebAssembly 33-битного эффективного адреса. Эта ошибка означает, что при настройках кодогенерации по умолчанию операция загрузки/сохранения, контролируемая wasm, может читать/записывать адреса на расстоянии до 35 бит от базы линейной памяти. Из-за этой ошибки, однако, адреса на расстоянии до `0xffffffff * 8 + 0x7ffffffc = 36507222004 = ~34G` байт от базы линейной памяти возможны из гостевого кода. Это означает, что виртуальную память на расстоянии 6G от базы линейной памяти до ~34G можно читать/записывать вредоносным модулем. Гостевой модуль может без ведома встраивателя читать/записывать память в этом регионе. Память может принадлежать другим экземплярам WebAssembly при использовании пулингового аллокатора, например. Рекомендуется, чтобы затронутые встраиватели проанализировали существующие модули wasm, чтобы увидеть, затронуты ли они неправильными правилами кодогенерации, и, возможно, сопоставили это с аномальным количеством ловушек во время исторического выполнения, чтобы найти, возможно, подозрительные модули. Конкретная ошибка в бэкэнде Cranelift x86_64 заключается в том, что адрес WebAssembly, который сдвигается влево на постоянную величину от 1 до 3, будет свернут в режимы адресации 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 заключается в удалении ошибочных правил понижения в бэкэнде, которые обрабатывают эти выражения, расширенные нулем. Приведенный выше пример затем преобразуется в `movl %local0, %temp; shl $3, %temp; movl (%base, %temp), %dst`, который правильно усекает промежуточное вычисление `%local0 << 3` до 32 бит внутри регистра `%temp`, который затем добавляется к значению `%base`. Wasmtime версии 4.0.1, 5.0.1 и 6.0.1 были выпущены и исправлены, чтобы больше не содержать ошибочные правила понижения. Хотя рекомендуется обновить Wasmtime, существует ряд возможных обходных путей, которые встраиватели могут использовать для смягчения этой проблемы, если обновление невозможно. Обратите внимание, что ни один из этих обходных путей не включен по умолчанию и требует явной настройки: 1. Опция `Config::static_memory_maximum_size(0)` может быть использована для принудительного выполнения явной проверки границ для всех обращений к линейной памяти. Это выполнит проверку границ отдельно от вычисления режима адреса, которое правильно вычисляет эффективный адрес загрузки/сохранения. Обратите внимание, что это может оказать большое влияние на производительность выполнения модулей WebAssembly. 2. Опция `Config::static_memory_guard_size(1 << 36)` может быть использована для значительного увеличения количества страниц защиты, размещенных после линейной памяти. Это гарантирует, что обращения к памяти на расстоянии до 34G будут семантически правильными, зарезервировав не отображенную память для экземпляра. Обратите внимание, что это резервирует очень большой объем виртуальной памяти на экземпляр и может значительно уменьшить максимальное количество одновременно выполняемых экземпляров. 3. Если возможно использование хоста, отличного от x86_64, то это также позволит обойти эту ошибку. Эта ошибка не затрагивает бэкэнд Wasmtime или Cranelift AArch64, например.

Теги · CWE
Удалённый запуск кода
CWE-125
CAPEC-540
Затронутые продукты
Cranelift-codegen 0.84.0–0.91.1Cranelift-codegenWasmtime 0.37.0–4.0.1Wasmtime
Вектор CVSS
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Хронология
2023-01-01
Опубликована
2023-01-01
Обновлена
Разбор CVSS 3.1
Вектор атаки
AV: N
Сеть (N)
Сложность атаки
AC: L
Низкая (L)
Требуемые привилегии
PR: L
Низкие (L)
Взаимодействие с пользователем
UI: N
Отсутствует (N)
Область воздействия
S: C
Изменена (C)
Воздействие на конфиденциальность
C: H
Высокое (H)
Воздействие на целостность
I: H
Высокое (H)
Воздействие на доступность
A: H
Высокое (H)
Индикаторы эксплуатации
EPSS
0.013 · p65
Известна эксплуатация (KEV)
Нет
Проверки Сканер-ВС
Проверок Сканер-ВС для этой уязвимости в базе пока нет.
Затронутые продукты
ПродуктВендорСтатус
rust-wasmtimeОтслеживается
cranelift-codegen*Отслеживается
wasmtime*Отслеживается
Источники данных
DEB
CVE
Связанные уязвимости