On this page · 6 sections
TL;DR
Wasmtime 50.0.1 and 49.0.5 (2026-10-29) fix five advisories that also affect 50.0.0, including a medium-rated UDP send policy bypass in wasip3 sockets. Ten days earlier, 49.0.4, 48.0.7 and 36.0.19 fixed a critical aarch64 sandbox escape, and 36.0.19 a second critical one, both rated CVSS 9.9. Wasmtime 50.0.0 stops enabling WASIp0 in the CLI by default and changes several embedder APIs. The releases to run are 50.0.1, or 49.0.5, 48.0.8 or 36.0.20 on an older line.
| Change | Who is affected | Action |
|---|---|---|
50.0.1, 49.0.5, 48.0.8: a wasip3 UDP send can reach an address the policy allows only for receiving (GHSA-hmmr-87qq-258j) | Embedders of wasmtime-wasi 48.0.0 and later that expose wasip3 sockets with a socket_addr_check policy denying UdpSend for an address it allows for UdpReceive | Security fix (medium, CVSS 3.1 6.4): move wasmtime-wasi to 50.0.1, 49.0.5 or 48.0.8 |
| 50.0.1, 49.0.5, 48.0.8, 36.0.20: unaccounted host memory for borrowed resources (GHSA-6fr9-xmw9-5352) and wasi-http p2 content-length mismatch (GHSA-h4wp-g4x3-7398) | Hosts running untrusted components; embedders using wasmtime-wasi-http for wasip2 guests | Security fix (medium 5.9 and low 3.7): move wasmtime and wasmtime-wasi-http to the fixed release of your line |
50.0.1, 49.0.5, 48.0.8: TypedFunc panic with i31 or nullref (GHSA-3982-jqvv-277m); cross-engine struct type confusion (GHSA-qw58-7h65-crq2) | Embedders on 47.0.0 and later that use these typed functions, or two Engines with StructType::with_finality_and_supertype | Security fix (low): upgrade to the fixed release of your line |
49.0.4, 48.0.7, 36.0.19: Cranelift on aarch64 jumps to the wrong target on a br_table with more than about 256k targets (GHSA-mghf-wjfp-p5xm, CVE-2026-115893) | Any Wasmtime engine on aarch64 with default settings, before 36.0.19, from 37.0.0 before 48.0.7, and from 49.0.0 before 49.0.4 | Security fix (critical, CVSS 3.1 9.9): run at least 49.0.4, 48.0.7 or 36.0.19 on those lines; 50.0.0 is outside the affected range |
| 36.0.19: Cranelift SSA index bit-packing overflow (GHSA-897f-g5gm-fmxm, CVE-2026-115889) | Wasmtime before 36.0.19, and from 37.0.0 before 43.0.0, on any platform with the Cranelift backend | Security fix (critical, CVSS 3.1 9.9): on 36.x move to 36.0.19 or later; on 37.0.0 to 42.x move to a fixed release of a supported line |
50.0.0: the wasmtime CLI no longer enables WASIp0 (wasi_unstable) | CLI users running modules that import wasi_unstable | Breaking: add -Spreview0 to those commands |
| 50.0.0: Winch no longer enables the GC types, exceptions or tail-call proposals by default | Users who compile with Winch and rely on these proposals | Breaking: enable each proposal your modules need in the engine configuration |
50.0.0: epoch deadline and call-hook callbacks get StoreHookState; Accessor::spawn takes an async closure; WasiHttpHooks::forbidden_header_filter replaces is_forbidden_header | Embedders implementing these callbacks, spawning with an AccessorTask, or customising forbidden headers | Breaking: rewrite the callbacks, the Accessor::spawn call sites and the header hook |
| 50.0.0: building Wasmtime requires Rust 1.97.0 | Anyone compiling Wasmtime | Breaking: update the toolchain to Rust 1.97.0 before building |
Wasmtime 50.0.1: Five Advisories That Also Affect 50.0.0 #
Wasmtime 50.0.1 is a security-only patch: its five fixes each carry an advisory, and every one of those advisories lists 50.0.0 among the affected versions. Teams that moved to 50.0.0 for its new APIs are therefore exposed until they take this patch. The one with the highest CVSS 3.1 score is GHSA-hmmr-87qq-258j, rated medium with 6.4 in the Wasmtime advisory. The fixed releases are 50.0.1, 49.0.5 and 48.0.8; versions before 48.0.0 are outside its range.
UDP send reaching receive-only addresses #
Only some embedders are exposed. The advisory names those of wasmtime-wasi that offer wasip3 sockets and install a per-address policy with WasiCtxBuilder::socket_addr_check that permits SocketAddrUse::UdpReceive for an address while denying SocketAddrUse::UdpSend for it. The Wasmtime CLI allows or denies all addresses, so it is not affected, and wasip2 sockets are not affected either. An embedder that never splits send and receive permissions has no exposure, but the patch is still the release that carries the other four fixes.
Note
Background: A guest connects a UDP socket to an address the policy permits for sending, then calls send without an explicit remote address. Because send is an async import, the guest keeps running while the host checks the policy, so it can race connect against that send and have the datagram delivered to an address the policy permitted only for receiving (GHSA-hmmr-87qq-258j).
Host memory and HTTP framing in multi-tenant hosts #
GHSA-6fr9-xmw9-5352 (medium, CVSS 4.0 5.9) is a denial of service: when a component receives a borrowed resource that it defined itself, Wasmtime allocated host memory to track the borrow without charging it to the store, so a guest could grow that memory without limit. The advisory lists versions before 36.0.20, from 37.0.0 before 48.0.8, from 49.0.0 before 49.0.5, and 50.0.0 as affected, and 36.0.20, 48.0.8, 49.0.5 and 50.0.1 as patched. GHSA-h4wp-g4x3-7398 (low, CVSS 3.1 3.7) closes the gap left by an earlier content-length fix in the wasip2 HTTP client, which could still send conflicting or wrong content-length headers and expose other servers to request smuggling.
Embedder-only panics and type confusion #
The remaining two need host code to trigger them. GHSA-3982-jqvv-277m makes Wasmtime panic when a TypedFunc uses I31, Option<I31> or Option<NoneRef> and the guest function uses another anyref type. GHSA-qw58-7h65-crq2 lets type information mix across two Engines when StructType::with_finality_and_supertype receives a supertype from another engine; guests cannot trigger it, and the advisory knows of no sandbox escape. Both are rated low and affect 47.0.0 and later.
Wasmtime 50.0.0: WASIp0 Off by Default and New Embedder APIs #
The 50.0.0 release is the feature release behind this patch series, and its changed defaults break existing command lines without a compile step to warn about them. The wasmtime CLI no longer enables WASIp0 (wasi_unstable), as pull request #14479 did as part of a Wasmtime security advisory. Modules that import wasi_unstable now need -Spreview0 on the command line.
wasmtime run -Spreview0 legacy-module.wasmWinch, CLI options and build requirements #
Winch no longer enables the GC types, exceptions or tail-call proposals by default, because their support in Winch is not yet Tier 1; in the same release Winch gains tail calls on x86_64 and AArch64, so a Winch build that needs tail calls must still enable the proposal. The CLI now rejects zero for the --http-outgoing-body-* options, and wasmtime run now honours them. Building Wasmtime requires Rust 1.97.0, so update the toolchain in CI before bumping the dependency.
API changes embedders must make #
Epoch deadline and call-hook callbacks now receive a StoreHookState instead of a StoreContextMut, which only gives access to the T in a Store<T>, and Accessor::spawn takes an async closure instead of an AccessorTask. Hosts that customise HTTP header filtering have a third change: according to GHSA-jxcf-8qw5-5c33, 50.0.0 replaces WasiHttpHooks::is_forbidden_header with forbidden_header_filter, while 48.0.7 and 49.0.4 add the new method and keep the old one.
The new task-group-hook feature is off by default. Pull request #14416 adds it so embedders can associate guest-to-host calls with the host-to-guest calls they belong to, and removes StoreContextMut::async_call_stack, which it describes as prone to use-after-free of a table slot. Code that called async_call_stack has to move to the hook.
Fixes 50.0.0 already includes #
50.0.0 is outside the affected ranges of the five advisories fixed in 49.0.4 and of the nine 49.0.3 advisories published on 2026-10-14. Its notes list the matching fixes for wasi-http content-length handling, forbidden-header checks on trailers, duplicate content-length headers, large br_table targets on AArch64 and type checks of futures and streams, and the advisories for the HTTP issues name the 50.0.0 release branch among the patched ones. Teams already on 50.0.0 need 50.0.1 for the October 29 advisories only.
Also in this release #
- Compact imports proposal behind
Config::wasm_compact_imports, off by default (#14335) wasmtime serve:--systemd-listenfd, Unix sockets and--idle-process-timeout- New
Store::gc_heap_grow,ResourceAny::resource_drop_concurrentandEngine::release_idle_pool_memory - Component-model-async updated to the latest specification, including traps on cancelled tasks and on handles whose other end was dropped
- Fuel now charged for more host allocations made with
Val, and saved aroundcall_refand exception catches - wasi:filesystem fixes, including stat of symlinks with trailing slashes and directory entry types without
d_type - The full list is in the 50.0.0 release notes
Wasmtime 49.0.5 and the Older Lines: Two Critical Sandbox Escapes #
Wasmtime 49.0.5 lists the same five fixes as 50.0.1 for the 49 line. Teams on 49.x should not stop at an earlier patch: 49.0.3 fixed one batch of advisories on 2026-10-14, and 49.0.4 fixed another five days later, including a critical sandbox escape on aarch64 that every version of the line before 49.0.4 carries.
Cranelift miscompilation on aarch64 and in older lines #
GHSA-mghf-wjfp-p5xm (CVE-2026-115893, critical, CVSS 3.1 9.9) affects any Wasmtime engine on aarch64 with default settings, in all versions since aarch64 support arrived in 2020, before 36.0.19, from 37.0.0 before 48.0.7 and from 49.0.0 before 49.0.4. 48.0.7 and 36.0.19 carry the fix on their lines.
Note
Background: With the Cranelift backend on aarch64, a Wasm module with more than about 256k targets on one br_table instruction is compiled with an incorrect conditional branch target. That branch can jump to code at a user-controlled offset, which gives a sandbox escape (GHSA-mghf-wjfp-p5xm).
GHSA-897f-g5gm-fmxm (CVE-2026-115889, critical, CVSS 3.1 9.9) is limited to versions before 43: Cranelift bit-packed its SSA value indices, so a very large or crafted function body could overflow them silently in release builds and escape the sandbox on any platform. Wasmtime 43 switched to a full u32 index. The only patched release is 36.0.19, so a host still on 37.0.0 to 42.x has no patch on its own line and must move to a fixed release of a newer one.
HTTP and component-model fixes in 49.0.4 #
49.0.4 also fixes three wasi-http issues: guests could add conflicting content-length headers (GHSA-r8xh-cgf7-392j, low), a wasip3 guest could set a wrong content-length on a spliced response body for response splitting (GHSA-9prg-84vf-g5fc, medium, 5.3), and forwarded trailers skipped the is_forbidden_header hook (GHSA-jxcf-8qw5-5c33, low). GHSA-9pvw-hwfg-92h5 (CVE-2026-115892, medium) is a host panic when an embedder passes a host-created stream or future back into a guest with a different payload type. The release also updates rustls to 0.23.46.
The 49.0.3 batch: panics, a filesystem escape and HTTP requests #
49.0.3 lists fifteen advisories. Nine have their own advisory, rated medium; most concern the component model and lead to host panics: GHSA-93g3-36p8-x2gc, GHSA-3r89-v5mq-j5xf, GHSA-7v24-42x9-pxf7, GHSA-5hhx-4wrr-3j9g, GHSA-m6w2-jwq2-cv2c, GHSA-hmwq-g22x-qjw5, GHSA-63h4-6cx9-pjfj and GHSA-vcg5-q8m5-8379, and one is a stack overflow dropping long chains of recursive types (GHSA-wjc8-633q-pwxr). The notes also list a filesystem sandbox escape when renaming symlinks with trailing slashes (GHSA-m9f7-9w4p-gv38), guests sending absolute-form HTTP requests to other hosts (GHSA-5qpp-g3j2-8frx), a crash on a long URL before the query (GHSA-w36r-2hch-9xp9), handle tables charged to no limit (GHSA-q554-3cjc-rx7p), unaligned host data from exception tags (GHSA-p79w-pv2r-29qp) and a transcode panic in fused adapters (GHSA-54p9-vhhq-8f7q). 48.0.6 lists the same fixes except the last one.
Which Wasmtime Release Fixes Each Advisory #
| Advisory | Severity (Wasmtime advisory) | Fixed in |
|---|---|---|
| GHSA-hmmr-87qq-258j (wasip3 UDP send) | Medium, CVSS 3.1 6.4 | 50.0.1, 49.0.5, 48.0.8 |
| GHSA-6fr9-xmw9-5352 (borrowed resources memory) | Medium, CVSS 4.0 5.9 | 50.0.1, 49.0.5, 48.0.8, 36.0.20 |
| GHSA-h4wp-g4x3-7398 (wasi-http p2 content-length) | Low, CVSS 3.1 3.7 | 50.0.1, 49.0.5, 48.0.8, 36.0.20 |
| GHSA-3982-jqvv-277m, GHSA-qw58-7h65-crq2 | Low | 50.0.1, 49.0.5, 48.0.8 |
GHSA-mghf-wjfp-p5xm / CVE-2026-115893 (aarch64 br_table) | Critical, CVSS 3.1 9.9 | 49.0.4, 48.0.7, 36.0.19 |
| GHSA-897f-g5gm-fmxm / CVE-2026-115889 (SSA bit-packing, before 43) | Critical, CVSS 3.1 9.9 | 36.0.19 |
| GHSA-9pvw-hwfg-92h5 / CVE-2026-115892, GHSA-9prg-84vf-g5fc | Medium | 49.0.4, 48.0.7 |
| GHSA-r8xh-cgf7-392j, GHSA-jxcf-8qw5-5c33 | Low | 49.0.4, 48.0.7 (GHSA-r8xh-cgf7-392j also 36.0.19) |
| The nine medium-rated 49.0.3 advisories above | Medium | 49.0.3, 48.0.6 |
| GHSA-m9f7-9w4p-gv38, GHSA-5qpp-g3j2-8frx, GHSA-w36r-2hch-9xp9, GHSA-q554-3cjc-rx7p, GHSA-p79w-pv2r-29qp | — | 49.0.3, 48.0.6 |
| GHSA-54p9-vhhq-8f7q | — | 49.0.3 |
Upgrade Checklist for Wasmtime Hosts #
- Before upgrading to the 50 line, update the Rust toolchain to 1.97.0 and find modules that import
wasi_unstable; add-Spreview0to thewasmtimecommands that run them. - In embedding code, rewrite epoch deadline and call-hook callbacks for
StoreHookState, replaceAccessorTaskarguments toAccessor::spawnwith async closures, move a customis_forbidden_headertoforbidden_header_filter, and replace any use ofasync_call_stack. - Move
wasmtime,wasmtime-wasiandwasmtime-wasi-httpto 50.0.1; on an older line use 49.0.5, 48.0.8 or 36.0.20, and leave 37.0.0 to 42.x for a fixed line. - If you compile with Winch, enable the GC types, exceptions or tail-call proposals your modules use, since 50.0.0 no longer turns them on.
- After the upgrade, check any
socket_addr_checkpolicy that allowsUdpReceivebut notUdpSend, and remove zero values from--http-outgoing-body-*options in scripts.
Sources
- Release v50.0.0: Release Wasmtime 50.0.0 (#14877) · bytecodealliance/wasmtime · GitHub github.com · Oct 20, 2026
- Release v49.0.3: Release Wasmtime 49.0.3 (#14725) · bytecodealliance/wasmtime · GitHub github.com · Oct 14, 2026
- bytecodealliance/wasmtime v50.0.1 github.com · Oct 29, 2026
- bytecodealliance/wasmtime v49.0.5 github.com · Oct 29, 2026
- bytecodealliance/wasmtime v49.0.4 github.com · Oct 19, 2026
- bytecodealliance/wasmtime v48.0.7 github.com · Oct 19, 2026
- bytecodealliance/wasmtime v36.0.19 github.com · Oct 19, 2026
- bytecodealliance/wasmtime v48.0.6 github.com · Oct 14, 2026
- bytecodealliance/wasmtime#14335: Add support for the compact imports proposal github.com · Sep 23, 2026
- bytecodealliance/wasmtime#14416: add (off-by-default) `task-group-hook` feature github.com · Oct 1, 2026
- bytecodealliance/wasmtime#14479: wasi: Disable preview0 by default in cli github.com · Oct 2, 2026
- GHSA-h4wp-g4x3-7398: wasi-http p2: outgoing content-length can be invalid or not match body github.com · Oct 29, 2026
- GHSA-6fr9-xmw9-5352: Unchecked memory usage in transferring borrowed resources between components github.com · Oct 29, 2026
- GHSA-3982-jqvv-277m: Typed functions with `i31` or `nullref` arguments may panic due to insufficient type-check github.com · Oct 29, 2026
- GHSA-qw58-7h65-crq2: Cross-engine type confusion with host-created struct-types-with-supertypes github.com · Oct 29, 2026
- GHSA-hmmr-87qq-258j: wasip3 UDP `send` can deliver a datagram to an address only allowed for receiving github.com · Oct 29, 2026
- GHSA-9pvw-hwfg-92h5: Panic lowering a host-created component model stream into a guest that expects a different payload type github.com · Oct 19, 2026
- GHSA-897f-g5gm-fmxm: Bit-packing in Cranelift compiler causes silent overflow and miscompilation github.com · Oct 19, 2026
- GHSA-mghf-wjfp-p5xm: Cranelift backend on aarch64 can jump to incorrect target on large Wasm `br_table` instruction github.com · Oct 19, 2026
- GHSA-9prg-84vf-g5fc: wasi-http p3: Guests can set incorrect content-length for spliced response bodies github.com · Oct 19, 2026
- GHSA-jxcf-8qw5-5c33: wasi-http p3: forwarded trailers aren't checked against `is_forbidden_header` hook github.com · Oct 19, 2026
- GHSA-r8xh-cgf7-392j: wasi-http: Guests can add conflicting content lengths to messages github.com · Oct 19, 2026
- GHSA-wjc8-633q-pwxr: Stack overflow dropping a long chain of recursive types github.com · Oct 14, 2026
- GHSA-hmwq-g22x-qjw5: Panic when pending calls are run after a trap github.com · Oct 14, 2026
- GHSA-m6w2-jwq2-cv2c: Panic when invoking an async-lifted function via `call` github.com · Oct 14, 2026
- GHSA-5hhx-4wrr-3j9g: Yielding in a component start function can lead to a host panic github.com · Oct 14, 2026
- GHSA-7v24-42x9-pxf7: Panic on erroneous call-to-host from guest realloc call github.com · Oct 14, 2026
- GHSA-3r89-v5mq-j5xf: Host panic when component `call_async` is cancelled under some conditions github.com · Oct 14, 2026
- GHSA-93g3-36p8-x2gc: Out-of-bounds zero-length stream writes can panic github.com · Oct 14, 2026
- GHSA-vcg5-q8m5-8379: Wasmtime may not properly enforce async-entrypoint requirement github.com · Oct 14, 2026
- GHSA-63h4-6cx9-pjfj: Panic viewing component model stream or future as the wrong type github.com · Oct 14, 2026
Edited and approved by Jarosław Krzemiński. Spotted a mistake? Report a correction or read the corrections policy.




Comments