wasmtime - это быстрая и безопасная среда выполнения для WebAssembly. В затронутых версиях генератор кода wasmtime, Cranelift, имеет ошибку…
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, например.
Продукт читает данные за пределами конца или до начала предназначенного буфера.
https://cwe.mitre.org/data/definitions/125.html →Открыть в коллекции CWE →Злоумышленник атакует цель, передавая входные данные, вынуждающие приложение читать за пределами границы определённого буфера. Как правило, это происходит, когда значение, определяющее начало или конец чтения, установлено на позиции за пределами допустимой области памяти буфера. Атака данного типа может привести к раскрытию конфиденциальной информации, аварийному завершению работы системы или выполнению произвольного кода.
https://capec.mitre.org/data/definitions/540.html →Открыть в коллекции CAPEC →| Продукт | Вендор | Статус |
|---|---|---|
| rust-wasmtime | Отслеживается | |
| cranelift-codegen | * | Отслеживается |
| wasmtime | * | Отслеживается |