Skip to content

Prevent using shared memories with Memory#12022

Merged
alexcrichton merged 2 commits intobytecodealliance:mainfrom
alexcrichton:ghsa-main
Nov 11, 2025
Merged

Prevent using shared memories with Memory#12022
alexcrichton merged 2 commits intobytecodealliance:mainfrom
alexcrichton:ghsa-main

Conversation

@alexcrichton
Copy link
Member

This commit fixes a few issues where it was possible to represent a wasm shared linear memory with the wasmtime::Memory type. This is not sound because wasmtime::Memory provides safe Rust access to the bytes where that is not possible with wasm shared memories. Shared memories in Rust must be represented by SharedMemory, not wasmtime::Memory.

Specifically this commit prevents two vectors of this happening:

  1. Memory::new now requires that the memory type specified is non-shared. Instead SharedMemory::new must be used instead.

  2. Core dumps now skip over shared memories when iterating over all memories in the store. Supporting shared memories is left to a future feature request for now.

This commit fixes a few issues where it was possible to represent a wasm
shared linear memory with the `wasmtime::Memory` type. This is not sound
because `wasmtime::Memory` provides safe Rust access to the bytes where
that is not possible with wasm shared memories. Shared memories in Rust
must be represented by `SharedMemory`, not `wasmtime::Memory`.

Specifically this commit prevents two vectors of this happening:

1. `Memory::new` now requires that the memory type specified is
   non-shared. Instead `SharedMemory::new` must be used instead.

2. Core dumps now skip over shared memories when iterating over all
   memories in the store. Supporting shared memories is left to a future
   feature request for now.
@alexcrichton alexcrichton requested a review from a team as a code owner November 11, 2025 15:38
@alexcrichton alexcrichton requested review from dicej and removed request for a team November 11, 2025 15:38
@github-actions github-actions bot added the wasmtime:api Related to the API of the `wasmtime` crate itself label Nov 11, 2025
@alexcrichton alexcrichton added this pull request to the merge queue Nov 11, 2025
Merged via the queue into bytecodealliance:main with commit 1fcd093 Nov 11, 2025
45 checks passed
@alexcrichton alexcrichton deleted the ghsa-main branch November 11, 2025 18:33
alexcrichton added a commit to alexcrichton/wasmtime that referenced this pull request Nov 14, 2025
This fixes fallout from bytecodealliance#12022 which was detected during fuzzing which
tried creating a shared memory.
github-merge-queue bot pushed a commit that referenced this pull request Nov 14, 2025
* Fix `MemoryType::default_value` with shared memories

This fixes fallout from #12022 which was detected during fuzzing which
tried creating a shared memory.

* Fix tests
alexcrichton added a commit to alexcrichton/wasmtime that referenced this pull request Nov 17, 2025
This commit is borne out of a fuzz bug that was opened recently. The
fuzz bug specifically has to do with fallout from bytecodealliance#12022, specifically
`SharedMemory` being used to allocated instead of `Memory`. In this
situation the resource limiter is no longer consulted meaning that
shared memories bypass this and aren't caught by OOM checks. This is
currently by design because `SharedMemory` instances don't know which
resource limiter to hook into per-store.

More generally though the implementation of wasm threads, while workable
in Wasmtime, has a number of known relatively large deficiencies. These
were not resolved prior to ungating the wasm proposal (that's on me) but
nevertheless the quality of implementation is not quite up to "tier 1
par" with the rest of what Wasmtime offers. Given that I'm proposing
that threads is downgraded to tier 2 for now which means, primarily,
that we won't issue CVEs for issues with it. The proposal is still
on-by-default and usable-by-default, but my hope is to reflect the
current level of quality in Wasmtime with this adjustment.

This commit shuffles around some documentation of wasm proposals to
split it into tier 1/2/3 instead of on/off-by-default and then adds a
column for whether the proposal is on-by-default.
alexcrichton added a commit to alexcrichton/wasmtime that referenced this pull request Nov 21, 2025
This commit is borne out of a fuzz bug that was opened recently. The
fuzz bug specifically has to do with fallout from bytecodealliance#12022, specifically
`SharedMemory` being used to allocated instead of `Memory`. In this
situation the resource limiter is no longer consulted meaning that
shared memories bypass this and aren't caught by OOM checks. This is
currently by design because `SharedMemory` instances don't know which
resource limiter to hook into per-store.

More generally though the implementation of wasm threads, while workable
in Wasmtime, has a number of known relatively large deficiencies. These
were not resolved prior to ungating the wasm proposal (that's on me) but
nevertheless the quality of implementation is not quite up to "tier 1
par" with the rest of what Wasmtime offers. Given this the threads
proposal is now downgraded to tier 2. To help minimize the impact of
this the wasm proposal is left enabled-by-default, but creation of a
`SharedMemory` in the Rust API requires opting-in via a new
`Config::shared_memory` method.

This commit shuffles around some documentation of wasm proposals to
split it into tier 1/2/3 instead of on/off-by-default and then adds a
column for whether the proposal is on-by-default.
alexcrichton added a commit to alexcrichton/wasmtime that referenced this pull request Nov 24, 2025
This commit is borne out of a fuzz bug that was opened recently. The
fuzz bug specifically has to do with fallout from bytecodealliance#12022, specifically
`SharedMemory` being used to allocated instead of `Memory`. In this
situation the resource limiter is no longer consulted meaning that
shared memories bypass this and aren't caught by OOM checks. This is
currently by design because `SharedMemory` instances don't know which
resource limiter to hook into per-store.

More generally though the implementation of wasm threads, while workable
in Wasmtime, has a number of known relatively large deficiencies. These
were not resolved prior to ungating the wasm proposal (that's on me) but
nevertheless the quality of implementation is not quite up to "tier 1
par" with the rest of what Wasmtime offers. Given this the threads
proposal is now downgraded to tier 2. To help minimize the impact of
this the wasm proposal is left enabled-by-default, but creation of a
`SharedMemory` in the Rust API requires opting-in via a new
`Config::shared_memory` method.

This commit shuffles around some documentation of wasm proposals to
split it into tier 1/2/3 instead of on/off-by-default and then adds a
column for whether the proposal is on-by-default.
github-merge-queue bot pushed a commit that referenced this pull request Nov 24, 2025
* "Downgrade" threads support to tier 2, disable fuzzing

This commit is borne out of a fuzz bug that was opened recently. The
fuzz bug specifically has to do with fallout from #12022, specifically
`SharedMemory` being used to allocated instead of `Memory`. In this
situation the resource limiter is no longer consulted meaning that
shared memories bypass this and aren't caught by OOM checks. This is
currently by design because `SharedMemory` instances don't know which
resource limiter to hook into per-store.

More generally though the implementation of wasm threads, while workable
in Wasmtime, has a number of known relatively large deficiencies. These
were not resolved prior to ungating the wasm proposal (that's on me) but
nevertheless the quality of implementation is not quite up to "tier 1
par" with the rest of what Wasmtime offers. Given this the threads
proposal is now downgraded to tier 2. To help minimize the impact of
this the wasm proposal is left enabled-by-default, but creation of a
`SharedMemory` in the Rust API requires opting-in via a new
`Config::shared_memory` method.

This commit shuffles around some documentation of wasm proposals to
split it into tier 1/2/3 instead of on/off-by-default and then adds a
column for whether the proposal is on-by-default.

* clangformat

* Fix tests

* Add tests for failed creation

Fix an issue where defined shared memories weren't gated

* Sync disabled threads stub

* Fix another test

prtest:full

* Fix fuzzing tests

* Fix dwarf tests
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

wasmtime:api Related to the API of the `wasmtime` crate itself

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants