0關于WebAssembly
WebAssembly(Wasm)是一種新型的、可移植的、高效的二進制指令格式,可作為多種語言(如C、C++、Rust等)的編譯目标,從而在Web上運行接近原生性能的應用程序。
在浏覽器中,JavaScript在虛拟機(VM)中執行,通過JIT優化代碼以提升性能。盡管JavaScript是當前最快的動态語⾔之一,但在性能上仍無法與原生的C和C++代碼競争。這正是 Wasm 的優勢所在。Wasm運行在與JavaScript相同的VM中,但性能更優。兩者可以自由交互,互為補充,使開發者既能享受JavaScript豐富的生态系統和友好的語法,又能獲得Wasm接近原生的性能。
通常,開發者使用C等語言編寫Wasm模塊,并将其編譯為.wasm文件。這些.wasm文件不能直接被浏覽器識别,需要通過JavaScript的膠水代碼進行加載。

1越來越多的浏覽器漏洞源自WebAssembly組件
Wasm作為現代Web應⽤的核心技術之一,通過沙箱化的執行機制,實現了接近原生的性能和安全性的雙重保障,其應用範圍已超越浏覽器,快速滲透到雲計算、物聯網、邊緣計算等關鍵領域。然而,随着Wasm的普及,其安全隐患也逐漸顯現。
從廠商披露的漏洞來看,越來越多的漏洞源自Wasm組件。

Wasm的安全隐患已在多次攻防實戰中得到驗證。在Pwn2Own 2021大賽中,研究人員利用JavaScriptCore引擎的Wasm編譯器漏洞(CVE-2021-1801),在Safari浏覽器上實現了遠程代碼執行(RCE)。在Pwn2Own 2023的V8 CT中,也有團隊利用V8的Wasm相關漏洞成功攻破了Chrome浏覽器。從各大廠商的漏洞跟蹤平台上,也能看到越來越多的Wasm漏洞被披露。
自2017年11月Wasm社區組(CG)發布最小可行産品(MVP)标準以來,該技術棧始終處于動态演進狀态。四大主流浏覽器廠商(Chrome、Edge、Firefox、Safari)通過标準化進程持續推進特性擴展。截至目前,還有許多特性尚未完全支持,且Wasm标準也在不斷更新。這些新特性的引入,勢必會帶來潛在的漏洞風險。因此,Wasm已成為當前浏覽器漏洞挖掘的熱點,并具有長期的研究價值。
雲鼎實驗室對Wasm的漏洞挖掘進行了深入的探索,成功挖掘了多個高危漏洞,提交了數十個漏洞報告,并獲得了蘋果公司(Safari)和Mozilla基金會(Firefox)的官方緻謝。

2WebAssembly模糊測試實踐
在2022至2024年的Black Hat大會上,連續出現了與Wasm安全相關的議題。這些研究均以模糊測試(Fuzzing)作為漏洞挖掘的主要手段。
雲鼎實驗室早期也曾嘗試對Wasm進行模糊測試,但效果并不理想。後來,受BlackHat上相關議題的啟發,雲鼎實驗室改寫了Wasm Fuzzer,成功找到了新的漏洞。
改寫後的Wasm Fuzzer工作流程如下:

1. 種子生成:從語料庫中提取種子,并進行變異得到随機輸入。
2. 生成器:将随機輸入傳遞給生成器,映射成結構正确的Wasm模塊。
3. JS模版嵌入:将生成的Wasm模塊嵌入到預先準備好的JS模版中。
4. 執行與反饋:使用浏覽器的JS引擎解釋執行生成的JS樣本,并回傳覆蓋率信息,形成反饋循環。
而這其中的關鍵技術點在于:
● 生成器的設計:Wasm模塊是一個結構化的輸入,因此Fuzzer的核心在于如何讓生成器盡可能生成合法且多樣化的樣本。随着Wasm标準的更新以及新特性的引入,構建一個支持全面特性的高效生成器具有挑戰性。
● JS模版的設計:精心設計的JS模版可以更有效地觸發引擎的各種行為。例如,通過設計循環結構,增加熱點代碼的執行頻率,從而觸發不同層級的JIT編譯器。
在研究現有工作後,雲鼎實驗室發現,Chrome V8為了方便内部測試,提供了構建Wasm的接口(API),利⽤這些接口,可以在較細粒度構建Wasm模塊。這樣一來,既降低了開發成本,又能緊跟V8對Wasm新特性的支持。
同時,雲鼎實驗室還設計了一些JavaScript模版來觸發JIT并捕獲非崩潰錯誤。


很快,新改寫的Fuzzer跑出了有意思的結果。
3新的漏洞:CVE-2025-1933
與純JavaScript一樣,Wasm在浏覽器中也有JIT。以Firefox為例,其JIT編譯器有三個優化級别:Baseline、Ion、Optimizing。簡單來說,代碼執行得越頻繁,優化級别就越高。這意味着,同一個函數的執行和第1000次執行,生成的機器碼可能完全不同,因為編譯器可能發生了變化。
新的漏洞由此産生。
在一次函數調用過程中,一個經過Wasm-Ion編譯的函數返回整數值3,該值被存儲在棧中。對應的彙編代碼如下:

函數返回後,在一個經過Wasm-Baseline編譯的函數中,希望将這個值從棧中彈出到rax寄存器。

然而,實際彈出的值是0×7ffd00000003,其中低32位是期望的值3 ,但高32位是未初始化的垃圾數據。這是因為被調用函數隻存儲了一個int32(32位整數),未正确清零高32位。接着,返回到JIT入口樁代碼(JIT entry stub),程序執行了以下代碼:

注釋提到“無需擴展,因為值已被裝箱”,這裡是因為 boxNonDouble函數假設了輸入寄存器中的高32位已被正确清零。但是如果高位存在垃圾數據,會導緻裝箱後的結果不正确,進而導緻程序崩潰。
4漏洞如何發生?如何修複?
CVE-2025-1933漏洞産生的根本問題在于64位系統上沒有對int32類型的值進行正确處理。
系統如果不正确處理高32位,可能導緻高位殘留垃圾數據。當返回值用于裝箱(即轉換為JavaScript的Value類型)時,如果高位包含非零值,裝箱結果可能錯誤,甚至被誤解為其他數據類型。
具體而言,在GenerateJitEntry函數中,處理返回值時,沒有對int32類型的返回值進行适當的擴展:

然而,boxNonDouble操作假設ReturnReg中的高位已清零。缺少适當的零擴展,導緻高位包含垃圾數據,與類型标簽進行或運算後,生成錯誤的Value。
該漏洞的安全影響較為嚴重,被評估為sec-high級别。攻擊者可能利用該漏洞,通過精心構造的Wasm模塊,利用堆噴等技術誘導引擎在返回值的高位留下可控的垃圾數據,進而實現類型混淆,導緻任意代碼執行。
補丁的修複方法簡單直接。
在64位系統上,使用masm.widenInt32(ReturnReg);将int32值擴展為64位,确保高32位被正确清零,防止高位殘留垃圾數據。Patch如下:

5大模型在Wasm Fuzzing中的應用
随着大模型(LLM)的興起,基于LLM的模糊測試方法逐漸受到關注。理論上,LLM具備理解和生成代碼的能力,可以輔助生成更智能的測試樣本,覆蓋更多的代碼路徑。
在Wasm Fuzzing領域,LLM可以用于:
● 智能生成樣本:利用LLM理解Wasm模塊的結構和語義,生成更具針對性的測試樣本。
● 漏洞預測與分類:通過分析曆史漏洞數據,訓練模型預測可能存在漏洞的代碼區域,提高測試效率。
● 輔助漏洞分析:在崩潰發生後,利用LLM輔助進行漏洞定位和根因分析,加速漏洞修複。
作為一項新興技術,Wasm仍在快速發展中,也是現代浏覽器的重要攻擊面之一。新的特性和标準的引入,将為安全研究帶來新的挑戰和機遇。騰訊安全及雲鼎實驗室也将持續跟蹤深入研究,助力企業組織及時發現安全風險,完善安全防線。
免責聲明:本文僅代表作者個人觀點,與每日科技網無關。其原創性以及文中陳述文字和内容未經本站證實,對本文以及其中全部或者部分内容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,并請自行核實相關内容。
本網站有部分内容均轉載自其它媒體,轉載目的在于傳遞更多信息,并不代表本網贊同其觀點和對其真實性負責,若因作品内容、知識産權、版權和其他問題,請及時提供相關證明等材料并與我們聯系,本網站将在規定時間内給予删除等相關處理.

