// For flags

CVE-2022-39392

Wasmtime vulnerable to out of bounds read/write with zero-memory-pages configuration

Severity Score

7.4
*CVSS v3.1

Exploit Likelihood

*EPSS

Affected Versions

*CPE

Public Exploits

0
*Multiple Sources

Exploited in Wild

-
*KEV

Decision

-
*SSVC
Descriptions

Wasmtime is a standalone runtime for WebAssembly. Prior to version 2.0.2, there is a bug in Wasmtime's implementation of its pooling instance allocator when the allocator is configured to give WebAssembly instances a maximum of zero pages of memory. In this configuration, the virtual memory mapping for WebAssembly memories did not meet the compiler-required configuration requirements for safely executing WebAssembly modules. Wasmtime's default settings require virtual memory page faults to indicate that wasm reads/writes are out-of-bounds, but the pooling allocator's configuration would not create an appropriate virtual memory mapping for this meaning out of bounds reads/writes can successfully read/write memory unrelated to the wasm sandbox within range of the base address of the memory mapping created by the pooling allocator. This bug is not applicable with the default settings of the `wasmtime` crate. This bug can only be triggered by setting `InstanceLimits::memory_pages` to zero. This is expected to be a very rare configuration since this means that wasm modules cannot allocate any pages of linear memory. All wasm modules produced by all current toolchains are highly likely to use linear memory, so it's expected to be unlikely that this configuration is set to zero by any production embedding of Wasmtime. This bug has been patched and users should upgrade to Wasmtime 2.0.2. This bug can be worked around by increasing the `memory_pages` allotment when configuring the pooling allocator to a value greater than zero. If an embedding wishes to still prevent memory from actually being used then the `Store::limiter` method can be used to dynamically disallow growth of memory beyond 0 bytes large. Note that the default `memory_pages` value is greater than zero.

Wasmtime es una ejecución independiente de WebAssembly. Antes de la versión 2.0.2, había un error en la implementación de Wasmtime de su asignador de instancias de pooling cuando el asignador está configurado para dar a las instancias de WebAssembly un máximo de cero páginas de memoria. En esta configuración, la asignación de memoria virtual para las instancias de WebAssembly no cumplió con los requisitos de configuración requeridos por el compilador para ejecutar módulos WebAssembly de forma segura. La configuración predeterminada de Wasmtime requiere páginas de memoria virtual con fallos para indicar que las lecturas/escrituras de Wasm están fuera de los límites, pero la configuración del asignador de pooling no crearía una asignación de memoria virtual adecuada para este significado, las lecturas/escrituras fuera de los límites pueden leer/escribir la memoria no relacionada con éxito con el entorno limitado de wasm dentro del rango de la dirección base de la asignación de memoria creada por el asignador de pooling. Este error no se aplica con la configuración predeterminada de la crate `wasmtime`. Este error solo se puede activar estableciendo `InstanceLimits::memory_pages` a cero. Se espera que esta sea una configuración muy poco común, ya que significa que los módulos wasm no pueden asignar ninguna página de memoria lineal. Es muy probable que todos los módulos wasm producidos por todas las cadenas de herramientas actuales utilicen memoria lineal, por lo que se espera que sea poco probable que esta configuración se establezca a cero mediante cualquier producción embebida de Wasmtime. Este error ha sido corregido y los usuarios deben actualizar a Wasmtime 2.0.2. Este error se puede solucionar aumentando la asignación de memoria en `memory_pages` al configurar el asignador de pooling a un valor mayor que cero. Si una producción embebida aún desea evitar que la memoria se use, entonces se puede usar el método `Store::limiter` para impedir dinámicamente el crecimiento de la memoria más allá de 0 bytes. Tenga en cuenta que el valor predeterminado de `memory_pages` es ser mayor que cero.

*Credits: N/A
CVSS Scores
Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
None
Attack Vector
Network
Attack Complexity
High
Privileges Required
High
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
None
* Common Vulnerability Scoring System
SSVC
  • Decision:-
Exploitation
-
Automatable
-
Tech. Impact
-
* Organization's Worst-case Scenario
Timeline
  • 2022-09-02 CVE Reserved
  • 2022-11-10 CVE Published
  • 2024-06-02 EPSS Updated
  • 2024-08-03 CVE Updated
  • ---------- Exploited in Wild
  • ---------- KEV Due Date
  • ---------- First Exploit
CWE
  • CWE-119: Improper Restriction of Operations within the Bounds of a Memory Buffer
  • CWE-125: Out-of-bounds Read
  • CWE-787: Out-of-bounds Write
CAPEC
Affected Vendors, Products, and Versions
Vendor Product Version Other Status
Vendor Product Version Other Status <-- --> Vendor Product Version Other Status
Bytecodealliance
Search vendor "Bytecodealliance"
Wasmtime
Search vendor "Bytecodealliance" for product "Wasmtime"
< 1.0.2
Search vendor "Bytecodealliance" for product "Wasmtime" and version " < 1.0.2"
rust
Affected
Bytecodealliance
Search vendor "Bytecodealliance"
Wasmtime
Search vendor "Bytecodealliance" for product "Wasmtime"
>= 2.0.0 < 2.0.2
Search vendor "Bytecodealliance" for product "Wasmtime" and version " >= 2.0.0 < 2.0.2"
rust
Affected