Wasmtime 非同步元件 callback 缺驗證,CVSS 9.3 堆疊溢位
RustSec · 2026-10-02
Wasmtime 在執行 component model 的 async-lifted 函式時,沒有檢查 callback 回傳的結果數量,guest 因此可以寫穿 host 的原生堆疊。這個漏洞是 RUSTSEC-2026-0327(GHSA-32h6-97mm-8q3c),RustSec 評為 CVSS 9.3 CRITICAL。
RustSec 於 2026-10-02 同日發布了一整批 wasmtime 與 wasmtime-wasi 的公告,這一則是其中最嚴重的,其餘兩則 wasmtime 本體的公告也都與 GC heap 有關。
漏洞機制
公告標題的說法是:async-lifted callback 的結果數量未經驗證,造成 native stack buffer overflow。換句話說,host 端依照 callback 宣稱的結果數量把值寫回原生堆疊上的緩衝區,卻沒有確認這個數量與函式簽名相符。
這類錯誤的危險之處在於,Wasmtime 的安全模型是「不信任 guest」:guest 即使被攻陷,也不該影響 host 行程的記憶體。堆疊緩衝區溢位打破的正是這道邊界,攻擊者控制的是 host 行程內的原生記憶體,而不是 guest 自己的線性記憶體。
RustSec 條目只轉述了 GitHub 公告的標題與評分,未公布利用細節,修補內容請見 PR #14471。
評分意味著什麼
CVSS 4.0 向量為 CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:H/VA:H/SC:L/SI:H/SA:H。攻擊向量為網路、複雜度低、不需權限、不需使用者互動,對完整性與可用性的衝擊都是 High。
要注意的是,評分假設「攻擊者能提供要執行的 WebAssembly 元件」。只執行自家編譯、內容固定的模組時,實際風險低得多;把 Wasmtime 當成插件沙箱、邊緣函式平台或多租戶執行環境時,這個前提就成立了。
受影響版本
| 公告 | CVSS | 不受影響 | 已修補 |
|---|---|---|---|
RUSTSEC-2026-0327(連結) | 9.3 CRITICAL | <39.0.0 | >=48.0.4, <49.0.0、>=49.0.2 |
RUSTSEC-2026-0326(連結) | 5.7 MEDIUM | <47.0.0 | 同上 |
RUSTSEC-2026-0325(連結) | 5.9 MEDIUM | <47.0.0 | 同上 |
從「不受影響」欄推算,RUSTSEC-2026-0327 影響 39.0.0 起、尚未升到修補版的所有版本,範圍比兩則 GC 問題(47.0.0 起)更廣。兩條修補線是 48.x 的 48.0.4,以及 49.x 的 49.0.2;停在 39 到 47 之間的版本,公告沒有列出修補版,必須升級到上述任一條線。
同批的兩則 GC heap 問題
另外兩則 wasmtime 公告同樣指向 GC heap,並共用相同的修補版本:
RUSTSEC-2026-0326(GHSA-hw8m-q44c-ggrf):跨try_call存活的 GC 值可能缺少 rooting,導致 GC heap 損毀,修補見 PR #14478。CVSS 3.1 向量需要低權限與使用者互動,只影響可用性。RUSTSEC-2026-0325(GHSA-cfhf-m2cr-62wj):型別不符的 WebAssembly tag import 可造成 GC heap 損毀,修補同樣引用 PR #14471。公告列出的衝擊只有可用性。
兩則的評分都低於 0327,原因是向量裡攻擊者需要低權限,且 0326 要求使用者互動。但它們出現在同一個修補版本內,升級一次就一併解決。
影響範圍與要檢查的事
直接依賴 wasmtime crate 的 Rust 專案,先看 Cargo.lock 解析出的版本:落在 39.0.0 以上且低於 48.0.4,或是 49.0.0、49.0.1,就在 0327 的範圍內。
cargo tree -i wasmtime
cargo update -p wasmtime --precise 49.0.2 # 或停在 48 線時用 48.0.4間接依賴同樣要查,許多嵌入 Wasm 的函式庫與 CLI 會自帶 wasmtime,需要等它們釋出新版,或在 workspace 內用 [patch] 釘住。只在 CI 或內部工具中跑自家 Wasm 的用法,風險可延後處理;接受外部使用者上傳 Wasm 元件的服務,應視為緊急。
另一個可檢查的點,是你是否實際使用了 component model 的 async 功能。公告標題限定在「async-lifted」callback 上,沒有開啟這條路徑的部署,暴露面應該較小,但公告本身未說明預設設定下是否可達,因此這一點只能當作優先順序的參考,不能當作不必升級的理由。
同批的 wasmtime-wasi 公告
同一天發布的 RUSTSEC-2026-0321 至 RUSTSEC-2026-0324 與 RUSTSEC-2026-0320 影響的是 wasmtime-wasi 與 wasmtime-wasi-http,標題涵蓋:poll_oneoff 繞過 fuel 計量、fd_readdir 把未初始化的 struct padding 複製進 guest 記憶體、沒有 stdio 的 guest 造成 host 配置過多記憶體、wasip3 下檔案時間戳早於 epoch 使 host panic,以及 wasi:http 在 timeout 為零時 panic。這些公告的 CVSS 與修補版本,本文未逐一核對,採用前請到各自頁面確認。