WebAssembly(Wasm),這一革命性的二進制指令格式,正逐步成為Web應用性能提升的關鍵。它不僅能夠作為C、C++、Rust等多種高級語言的編譯目標,還能在Web上實現接近原生應用的運行效率。相較于在虛擬機中執行的Java,盡管Java通過即時編譯(JIT)優化性能,但在與原生C和C++代碼的性能比拼中仍稍顯遜色。Wasm的優勢在于,它同樣運行在類似VM的環境中,卻能提供更卓越的性能。兩者間的無縫交互,讓開發者既能享受Java豐富的生態和友好的語法,又能擁抱Wasm帶來的原生級性能。
開發者通常使用C等語言編寫Wasm模塊,并編譯成.wasm文件。然而,這些文件并不能直接被瀏覽器識別,而是需要通過特定的膠水代碼,如Java代碼,進行加載。這一過程雖然增加了些許復雜性,但也為Web應用帶來了前所未有的性能飛躍。
然而,隨著Wasm的廣泛應用,其安全隱患也逐漸浮出水面。作為現代Web應用的核心技術之一,Wasm通過沙箱化執行機制確保了高性能與安全性。但近年來,越來越多的瀏覽器漏洞被發現源于Wasm組件。在Pwn2Own等國際安全競賽中,Wasm相關的漏洞已被多次利用,實現了遠程代碼執行(RCE)等攻擊。從各大廠商的漏洞跟蹤平臺也能看到,Wasm漏洞的披露數量正逐年增加。
Wasm技術的快速發展,尤其是新特性的不斷引入,為其帶來了潛在的漏洞風險。因此,Wasm已成為當前瀏覽器漏洞挖掘的熱點。云鼎實驗室在這一領域進行了深入探索,成功挖掘了多個高危漏洞,并獲得了蘋果、Mozilla等公司的官方致謝。
在Wasm漏洞挖掘的過程中,模糊測試(Fuzzing)發揮了重要作用。云鼎實驗室通過改寫Wasm Fuzzer,成功發現了新的漏洞。該Fuzzer的工作流程包括種子生成、生成器映射成Wasm模塊、JS模板嵌入以及執行與反饋等環節。其中,生成器和JS模板的設計是關鍵技術點,它們分別負責生成合法且多樣化的Wasm樣本和觸發引擎的各種行為。
以CVE-2025-1933漏洞為例,該漏洞源于Wasm在64位系統上對int32類型值處理不當。在函數調用過程中,一個經過Wasm-Ion編譯的函數返回整數值,該值被存儲在棧中。然而,在另一個經過Wasm-Baseline編譯的函數中,彈出該值時,高32位包含了未初始化的垃圾數據。這導致了裝箱后的結果不正確,進而可能引發程序崩潰或任意代碼執行。
針對這一漏洞,修復方法相對簡單直接:在64位系統上,將int32值擴展為64位,并確保高32位被正確清零。這一補丁有效防止了高位殘留垃圾數據,從而避免了潛在的安全風險。
隨著大模型(LLM)的興起,基于LLM的模糊測試方法在Wasm Fuzzing領域也逐漸受到關注。LLM具備理解和生成代碼的能力,可以輔助生成更智能的測試樣本,覆蓋更多的代碼路徑。LLM還可以用于漏洞預測與分類以及輔助漏洞分析,從而加速漏洞的發現和修復過程。
Wasm作為現代瀏覽器的重要攻擊面之一,其安全性和穩定性至關重要。隨著新特性和標準的不斷引入,Wasm將繼續為安全研究帶來新的挑戰和機遇。騰訊安全及云鼎實驗室將持續跟蹤Wasm的發展動態,深入挖掘潛在的安全風險,為企業組織提供及時有效的安全保障。