Cranelift-codegen
Уязвимости
7
Эксплуатируемые
0
Макс. CVSS
9.9
Макс. EPSS
0.01283
Распределение по критичности
Критический
1
Высокий
3
Средний
2
Низкий
1
Затронутые диапазоны версий
0.84.0–0.85.20.84.0–0.91.138.0.1–38.0.4< 0.73.1< 0.85.0< 0.85.1
Также сопоставлено как (исходные строки): cranelift-codegen,wasmtime
Топ уязвимостей
CVE-2023-26489wasmtime - это быстрая и безопасная среда выполнения для 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, например.
CVE-2022-31146Wasmtime — это автономная среда выполнения для WebAssembly. В генераторе кода Wasmtime, Cranelift, есть ошибка, из-за которой в функциях, использующих типы ссылок, может отсутствовать метаинформация, необходимая для сборки мусора во время выполнения. Это означает, что если сборка мусора происходит во время выполнения, то проход сборки мусора ошибочно сочтет, что эти функции не имеют активных ссылок на значения, собранные сборщиком мусора, возвращая их и освобождая. Затем функция продолжит использовать значения, предполагая, что они не были собраны сборщиком мусора, что впоследствии приведет к использованию после освобождения. Эта ошибка была внесена при переходе на распределитель регистров `regalloc2`, который произошел в выпуске Wasmtime 0.37.0 2022-05-20. Эта ошибка была исправлена, и пользователям следует обновиться до Wasmtime версии 0.38.2. Смягчить последствия этой проблемы можно, отключив предложение типов ссылок, передав `false` в `wasmtime::Config::wasm_reference_types` или понизив версию до Wasmtime 0.36.0 или более ранней.
CVE-2021-32629Cranelift - это генератор кода с открытым исходным кодом, поддерживаемый Bytecode Alliance. Он преобразует аппаратно-независимое промежуточное представление в исполняемый машинный код. В версии 0.73 бэкэнда Cranelift x64 есть ошибка, которая может создать сценарий, который может привести к потенциальному выходу из песочницы в программе Wasm. Эта ошибка была внесена в новый бэкэнд 2020-09-08 и впервые включена в выпуск 2020-09-30, но новый бэкэнд не был стандартным до 0.73. Недавно выпущенная версия 0.73 с настройками по умолчанию и предыдущие версии с явным флагом сборки для выбора нового бэкэнда являются уязвимыми. Рассматриваемая ошибка выполняет расширение знака вместо расширения нулем значения, загруженного из стека, при определенном наборе обстоятельств. Если эти обстоятельства возникают, ошибка может позволить получить доступ к адресам памяти до 2 ГБ до начала кучи программы Wasm. Если граница кучи больше 2 ГБ, то можно будет читать память из вычислимого диапазона, зависящего от размера границы кучи. Влияние этой ошибки сильно зависит от реализации кучи, в частности: * если куча имеет проверки границ, и * не полагается исключительно на страницы защиты, и * граница кучи составляет 2 ГБ или меньше * тогда эту ошибку нельзя использовать для доступа к памяти из другой кучи программы Wasm. Влияние уязвимости смягчается, если в диапазоне, доступном с помощью этой ошибки, нет отображенной памяти, например, если перед кучей программы Wasm есть защитная область размером 2 ГБ. Рассматриваемая ошибка выполняет расширение знака вместо расширения нулем значения, загруженного из стека, когда распределитель регистров перезагружает пролитое целочисленное значение, более узкое, чем 64 бита. Это плохо взаимодействует с другой оптимизацией: селектор инструкций опускает оператор расширения нулем от 32 до 64 бит, когда мы знаем, что инструкция, производящая 32-битное значение, фактически обнуляет верхние 32 бита своего целевого регистра. Следовательно, мы полагаемся на эти обнуленные биты, но тип значения по-прежнему i32, а разлив/перезагрузка восстанавливает эти биты как расширение знака MSB i32. Таким образом, проблема возникнет, когда: * Значение i32 в программе Wasm больше или равно 0x8000_0000; * Значение разливается и перезагружается распределителем регистров из-за высокого давления регистров в программе между определением значения и его использованием; * Значение производится инструкцией, которая, как мы знаем, является «особенной» в том смысле, что она обнуляет верхние 32 бита своего назначения: add, sub, mul, and, or; * Затем значение расширяется нулем до 64 бит в программе Wasm; * Полученное 64-битное значение используется. При этих обстоятельствах существует потенциальный выход из песочницы, когда значение i32 является указателем. Обычный код, генерируемый для доступа к куче, расширяет нулем адрес кучи Wasm, добавляет его к 64-битной базе кучи и обращается к полученному адресу. Если расширение нулем становится расширением знака, программа может вернуться назад и получить доступ к памяти до 2 ГБ до начала своей кучи. В дополнение к оценке характера ошибки генерации кода в Cranelift, мы также определили, что при определенных обстоятельствах Lucet и Wasmtime, использующие эту версию Cranelift, могут быть уязвимы. Дополнительные сведения см. в справочном руководстве GitHub.
CVE-2022-31169Wasmtime — это автономная среда выполнения для WebAssembly. Существует ошибка в генераторе кода Wasmtime, Cranelift, для целей AArch64, где постоянные делители могут привести к неправильным результатам деления во время выполнения. Это затрагивает Wasmtime до версии 0.38.2 и Cranelift до 0.85.2. Эта проблема затрагивает только платформу AArch64. Другие платформы не затронуты. Правила перевода для констант не учитывали, следует ли выполнять расширение знака или нуля, что приводило к помещению неправильного значения в регистр при обнаружении деления. Влияние этой ошибки заключается в том, что программы, выполняющиеся в песочнице WebAssembly, будут вести себя не в соответствии со спецификацией WebAssembly. Это означает, что гипотетически возможно, что выполнение в песочнице пойдет наперекосяк, и программы WebAssembly могут давать неожиданные результаты. Это не должно влиять на хосты, выполняющие WebAssembly, но влияет на правильность гостевых программ. Эта ошибка была исправлена в Wasmtime версии 0.38.2 и cranelift-codegen 0.85.2. Нет известных обходных путей.
CVE-2022-31104Wasmtime — это автономная среда выполнения для WebAssembly. В уязвимых версиях реализация SIMD для WebAssembly в wasmtime на x86_64 содержала две различные ошибки в понижениях инструкций, реализованных в Cranelift. Реализация SIMD в aarch64 не затрагивается. Ошибки были представлены в инструкциях WebAssembly `i8x16.swizzle` и `select`. Инструкция `select` затрагивается только тогда, когда входные данные имеют тип `v128`. Соответственно затронутые инструкции Cranelift — `swizzle` и `select`. Понижение инструкции `swizzle` в Cranelift ошибочно перезаписывало регистр ввода маски, что могло повредить, например, константное значение. Это означает, что будущие использования той же константы могут видеть другое значение, чем сама константа. Понижение инструкции `select` в Cranelift было реализовано неправильно для векторных типов шириной 128 бит. Когда условие было равно 0, для перемещения правильного ввода в выходные данные инструкции использовалась неправильная инструкция, что означало, что были перемещены только младшие 32 бита, а верхние 96 битов результата остались такими, какими они были ранее в регистре (вместо перемещения ввода). Однако инструкция `select` работала правильно, если условие было ненулевым. Эта ошибка в реализации Wasmtime этих инструкций на x86_64 представляет собой неправильную реализацию указанной семантики этих инструкций в соответствии со спецификацией WebAssembly. Влияние этого безобидно для хостов, запускающих WebAssembly, но представляет собой возможные уязвимости в выполнении гостевой программы. Например, программа WebAssembly может выполнять непреднамеренные переходы или материализовать неверные значения внутри себя, что подвергает программу риску других связанных уязвимостей, которые могут возникнуть из-за неправильных компиляций. Мы выпустили Wasmtime 0.38.1 и cranelift-codegen (и другие связанные крейты cranelift) 0.85.1, которые содержат исправленные реализации этих двух инструкций в Cranelift. Если обновление в данный момент невозможно, вы можете избежать уязвимости, отключив предложение Wasm simd. Кроме того, ошибка присутствует только на хостах x86_64. Другие хосты aarch64 не затрагиваются. Обратите внимание, что хосты s390x еще не реализуют предложение simd и не затрагиваются.
CVE-2023-27477wasmtime — это быстрая и безопасная среда выполнения для WebAssembly. В серверной части генерации кода Wasmtime, Cranelift, есть ошибка на платформах x86_64 для инструкции WebAssembly `i8x16.select`, которая будет выдавать неправильные результаты, когда один и тот же операнд предоставляется инструкции, а некоторые из выбранных индексов больше 16. Существует ошибка смещения на единицу при вычислении маски для инструкции `pshufb`, которая приводит к возврату неверных результатов, если полосы выбираются из второго вектора. Эта ошибка кодогенерации была исправлена в Wasmtiem 6.0.1, 5.0.1 и 4.0.1. Пользователям рекомендуется обновиться до этих обновленных версий. Если обновление в настоящее время невозможно, вы можете избежать этой неправильной компиляции, отключив предложение Wasm simd. Кроме того, ошибка присутствует только на хостах x86_64. Другие платформы, такие как AArch64 и s390x, не подвержены этой проблеме.
CVE-2025-64345Wasmtime - это время работы для WebAssembly. До версий 38.0.4, 37.0.3, 36.0.3 и 24.0.5, API встраивного расширения Wasmtime's Rust содержит необоснованное взаимодействие, в котором линейная память WebAssembly может рассматриваться как тип, который обеспечивает безопасный доступ к хостру (Ржавчине) к содержимому линейной памяти. Это не так для общих линейных воспоминаний, которые могут быть изменены параллельно, и это может привести к гонке данных в хоста. Были выпущены патч-релизы для всех поддерживаемых версий Wasmtime, в частности: 24.0.5, 36.0.3, 37.0.3 и 38.0.4. Эти релизы отвергают создание общих воспоминаний через `Memory::new` и общие воспоминания теперь исключены из основных дампов. В качестве обходного действия, затронутые этой проблемой, должны использовать «SharedMemory::new` вместо `Memory::new`» для создания общих воспоминаний. Пострадавшие встраивания также должны отключать основные свалки, если они не могут обновиться. Обратите внимание, что отбросы ядра отключены по умолчанию, но предложение потоков Wasm (и общая память) включено по умолчанию.