Wasmtime 元件回呼未驗證,原生堆疊溢位
RustSec · 2026-10-02
Wasmtime 的 component model 在處理 async-lifted 回呼時,從來沒有檢查回呼回傳的結果數量,這個缺口現在被 RUSTSEC-2026-0327 列為 CVSS 9.3 的 Critical,後果是原生堆疊緩衝區溢位。同一天 RustSec 還發布了 RUSTSEC-2026-0320 與 RUSTSEC-2026-0326 等 Wasmtime 公告,修補版本一致。
漏洞機制
公告標題直接點出成因:async-lifted 回呼的結果數量沒有驗證,因此產生原生堆疊緩衝區溢位。這裡的「原生」指的是 Wasmtime 宿主程式自己的堆疊,不是 guest 的線性記憶體,所以溢位發生在 sandbox 之外。對應的 GHSA 為 GHSA-32h6-97mm-8q3c,修補在上游 PR #14471。
CVSS 4.0 向量為 AV:N/AC:L/AT:N/PR:N/UI:N,意即經網路、不需權限也不需使用者互動;VI:H/VA:H/SI:H/SA:H 代表完整性與可用性衝擊皆為高。公告頁面未提供利用細節與緩解手段,那些內容在 GitHub advisory 裡,我沒有展開閱讀,所以此處不推測。
受影響版本
| 公告 | 套件 | CVSS | 受影響 |
|---|---|---|---|
RUSTSEC-2026-0327 | wasmtime | 9.3 Critical | 39.0.0–48.0.3、49.0.0–49.0.1 |
RUSTSEC-2026-0326 | wasmtime | 5.7 Medium | <47.0.0 以外(公告頁只列出不受影響範圍) |
RUSTSEC-2026-0320 | wasmtime-wasi-http | 5.9 Medium | >=46.0.0, <48.0.4、>=49.0.0, <49.0.2 |
三則公告的修補版本相同:>=48.0.4, <49.0.0 與 >=49.0.2。RUSTSEC-2026-0327 的不受影響版本是 <39.0.0,所以 38 以下不用處理。
同批的另外兩則
RUSTSEC-2026-0326(GHSA-hw8m-q44c-ggrf,PR #14478)的標題是「try_call 前後仍存活的 GC 值可能缺少 rooting,造成 GC heap 損毀」。GC 值沒有被 root,回收器就可能在值仍被使用時處理它,這是 heap 損毀的典型來源;CVSS 5.7 的可用性衝擊為高。
RUSTSEC-2026-0320(GHSA-w4qr-p94g-mjhv,PR #14483)是 wasmtime-wasi-http 在收到 timeout 為 0 時 panic,CVSS 5.9。向量中 PR:L/UI:P 表示需要低權限與被動的使用者互動。
影響範圍與該做什麼
受影響的是把 Wasmtime 嵌進服務、執行不受信任 component 的人:多租戶外掛平台、edge function、以 wasi:http 對外提供功能的 host。這類場景的前提就是 guest 不可信,host 堆疊被打穿等於 sandbox 失效。
- 用
cargo tree -i wasmtime找出直接與間接依賴,注意 vendored 或鎖在 lockfile 的版本。 - 落在
39.0.0–48.0.3者升到48.0.4;落在49.0.0–49.0.1者升到49.0.2。 - 有用
wasmtime-wasi-http的,同一次升級即可一併排除 0320。 - 暫時無法升級時,公告頁未列出 workaround,建議查閱 GHSA 原文。
# Cargo.toml
- wasmtime = "48.0.3"
+ wasmtime = "48.0.4"另外,RUSTSEC-2026-0321 到 0325 我沒有逐一讀取,不確定它們是否同屬這一批 Wasmtime 修補。