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

Wasmtime - это время работы для WebAssembly. Время работы 37.0.0 и 37.0.1 имеют утечки памяти в C/C++ API при использовании привязок для зн…

CVSS
1.0
Низкий
EPSS
0.00
p7
Опубликовано
2025-01-01
Обновлено
2025-01-01
Описание

Wasmtime - это время работы для WebAssembly. Время работы 37.0.0 и 37.0.1 имеют утечки памяти в C/C++ API при использовании привязок для значений `anyref или `externref` WebAssmably. Это вызвано регрессией, введенной во время разработки 37.0.0, и все предыдущие версии Wasmtime не затронуты. Если `anyref` или `externref` не используется в C/C++ API, то вложения также не затронуты протекающим поведением. «Разминное ящик Rust» не затронут этой утечкой. Разработка Wasmtime 37.0.0 включала в себя рефакторенизацию в Rust изменения старого `ManuallyRooted<T>` типа на новый `OwnedRooted<T>` тип. Это изменение было интегрировано в C API Wasmtime, но оставило C API в состоянии, в котором были утечки памяти. Кроме того, новая семантика владения вокруг этого типа не была отражена в C++ API, что делает его подверженным утечкам. Короткая версия изменения заключается в том, что ранее `RualyRooted<T>`, как следует из названия, требовала ручных вызовов на «неру» операцию. Если это было забыто, то память все еще была очищена, когда сам `wasmtime_store_t` был в конечном итоге разрушен. Документация о том, когда «некорняться», была скудной, и уже были ситуации до 37.0.0, когда память будет просочиться, пока магазин не был разрушен в любом случае. Однако вся память всегда была связана магазином, и разрушение магазина гарантировало бы отсутствие утечек памяти. При миграции в `OwnedRooted<T>` использование типа в Rust изменилось. Ручная «нерупорная» операция больше не требуется, и это происходит естественным образом как деструктор «Собенного Корневого» типа в самой Rust. Эта новая семантика владения ресурсами не была полностью интегрирована в ранее существовавшую семантику C/C++ API в Wasmtime. Важнейшей отличительной чертой `OwnedRooted<T>` vs `ManuallyRooted<T>` является то, что тип `OwnedRooted<T>` выделяет память хозяина за пределами магазина. Это означает, что если «OwnedRooted<T>`» просочился, то разрушение магазина не освобождает эту память, и это постоянная утечка памяти на хоста. Это привело к нескольким различным, но связанным, возникающим проблемам: опечатка в функции `wasmtime_val_unroot` в C API означала, что она фактически ничего не искоренила. Это означало, что даже если встраиваемые средства добросовестно вызовут эту функцию, память будет просочиться. Если функция, определяемая хостом, возвращала значение `wasmtime_{externref,anyref}_t` значение, то значение никогда не было безукоречным. C/C++ API больше не имеет доступа к ценности, и реализация Rust не разорвалась. Это означало, что любые ценности, возвращенные таким образом, никогда не были безусловными. Целью C++ API Wasmtime является кодирование автоматического управления памятью в системе типов, но API C++ не обновлялся при добавлении `OwnedRooted<T>`. Это означало, что идиоматическое использование C++ API будет утечкой памяти из-за отсутствия деструктурирующих факторов на значениях. Все эти проблемы были исправлены в 37.0.2 выпуска Wasmtime. Реализация C и C++ API была обновлена соответствующим образом и соответственно, чтобы учесть смену владельца здесь. Например, `wasmtime_val_unroot` был зафиксирован на unroot, реализация на стороне ржавчины вызова функции, определяемой встраиванием, будет разворачивать значения возврата, и у C++ API теперь есть деструкторы в типах «ExternRef», «AnyRef`», «AxternRef`», «AnyRef`», «Val». Эти изменения были внесены в филиал выпуска 37.0.x в не-API-брейк-стимул. Изменения в ветке выпуска 38.0.0 (и `mained в репозитории Wasmtime) включают в себя незначительные обновления API для лучшего удовлетворения семантических изменений API. Единственный известный обходной пункт в настоящее время заключается в том, чтобы избежать использования `externref` и `anyref` в C/C++ API Wasmtime. Если избежать этих типов невозможно, то пользователям необходимо обновить, чтобы смягчить проблему утечки.

Теги · CWE
CWE-772
CAPEC-469
Затронутые продукты
Wasmtime
Вектор CVSS
CVSS:4.0/AV:A/AC:L/AT:P/PR:L/UI:P/VC:N/VI:N/VA:L/SC:N/SI:N/SA:L/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Хронология
2025-01-01
Опубликована
2025-01-01
Обновлена
Разбор CVSS 3.1
Вектор атаки
AV: A
Смежная сеть (A)
Сложность атаки
AC: L
Низкая (L)
Требования к атаке
AT: P
Present
Требуемые привилегии
PR: L
Низкие (L)
Взаимодействие с пользователем
UI: P
Passive
Конфиденциальность уязвимой системы
VC: N
Отсутствует (N)
Целостность уязвимой системы
VI: N
Отсутствует (N)
Доступность уязвимой системы
VA: L
Низкое (L)
Конфиденциальность последующей системы
SC: N
Отсутствует (N)
Целостность последующей системы
SI: N
Отсутствует (N)
Доступность последующей системы
SA: L
Низкое (L)
Зрелость эксплойт-кода
E: X
Not Defined
Требование конфиденциальности
CR: X
Not Defined
Требование целостности
IR: X
Not Defined
Требование доступности
AR: X
Not Defined
Модифицированный вектор атаки
MAV: X
Not Defined
Модифицированная сложность атаки
MAC: X
Not Defined
Модифицированные требования к атаке
MAT: X
Not Defined
Модифицированные требуемые привилегии
MPR: X
Not Defined
Модифицированное взаимодействие с пользователем
MUI: X
Not Defined
Модифицированная конфиденциальность уязвимой системы
MVC: X
Not Defined
Модифицированная целостность уязвимой системы
MVI: X
Not Defined
Модифицированная доступность уязвимой системы
MVA: X
Not Defined
Модифицированная конфиденциальность последующей системы
MSC: X
Not Defined
Модифицированная целостность последующей системы
MSI: X
Not Defined
Модифицированная доступность последующей системы
MSA: X
Not Defined
s
S: X
X
au
AU: X
X
r
R: X
X
v
V: X
X
re
RE: X
X
u
U: X
X
Индикаторы эксплуатации
EPSS
0.002 · p7
Известна эксплуатация (KEV)
Нет
MITRE ATT&CK
Выводимые через CAPEC
Проверки Сканер-ВС
Проверок Сканер-ВС для этой уязвимости в базе пока нет.
Затронутые продукты
ПродуктВендорСтатус
Отслеживается
Отслеживается
rust-wasmtimeОтслеживается
wasmtime*Отслеживается