字節碼聯盟成立WebAssembly 生態將完善網絡安全性
近日Mozilla、Fastly、Intel與Red Hat宣布成立聯合組織 Bytecode Alliance(字節碼聯盟),該聯盟旨在通過協作實施標準和提出新標準,以完善WebAssembly在瀏覽器之外的生態。
WebAssembly 也叫Wasm,它是為基於棧的虛擬機設計的二進制指令格式,Wasm 作為可移植目標,用於編譯高級語言(如C/C++/Rust),從而可以在Web 上部署客戶端和服務器應用。
WebAssembly 描述了一種內存安全的沙箱執行環境,該環境甚至可以在現有JavaScript 虛擬機內部實現。當嵌入到Web 中時,WebAssembly 將強制執行瀏覽器的同源和權限安全策略。
目前1.0 版本的Wasm 已經支持Chrome、Firefox、Safari 與Edge 瀏覽器。
此次四家公司為什麼結成Bytecode Alliance呢?Mozilla官網博客上 Lin Clark 作了介紹。
Lin 表示,當前網絡用戶身處越來越大的風險中,目前大家在構建大規模的模塊化應用,其中80% 的代碼庫來自軟件包註冊中心,例如npm、PyPI 與crates.io。這樣的方式當然使得生態繁榮,但是安全問題也在極速增加。
破壞這些安全的人利用的正是用戶的信任,當用戶使用應用時,他們並不清楚背後這些軟件依賴關係,它們之中有沒有惡意代碼用戶根本不知道,也無法明確是否可信任。
所以聯盟想通過WebAssembly 技術來推動這一個領域的安全性。Bytecode Alliance 將建立起可靠安全的基礎,無論在雲中、本地桌面,還是小型IoT 設備上,都可以安全地使用不受信任的代碼。開發人員可以以相同的方式使用開源代碼,而不會給用戶帶來風險,而這些通用的可重用基礎集可以單獨使用,也可以嵌入其它庫和應用中。
具體來說,所有這些因為依賴項而產生的安全問題都是因為不同軟件/模塊/文件有權限訪問到其它內容,而基於WebAssembly 可以提供某種隔離,這樣就可以安全地運行不受信任的代碼。
可以設計一個類似於Unix 的小型進程或容器和微服務的架構,但是這種隔離十分輕量,它們之間的通信也不會比常規函數調用慢很多。
使用這樣的模式,可以封裝單個WebAssembly 模塊實例,或者封裝一小部分想要在它們之間共享內存之類的模塊實例。同時也不必放棄強大的編程語言特性,例如函數簽名和靜態類型檢查。
Lin 介紹了目前 WebAssembly 的一些技術方案,包括幾個要點:
- 每個WebAssembly 模塊默認都被沙箱化,默認情況下,模塊無權訪問API 和系統調用。
- 內存模型,與直接編譯為x86 之類的普通二進製文件不同,WebAssembly 模塊在其進程中無法訪問所有內存,而是只能訪問已分配給它的內存塊。
- 接口類型,模塊可以使用更複雜的值進行通信,比如 strings、sequences、records、variants,以及它們的嵌套組合。這使得兩個模塊可以輕鬆地交換數據,並且這種方式安全且快速。
- 具有權限概念的API和系統調用,以便它們可以為不同的模塊賦予對不同資源的不同權限,也就是 WASI,WebAssembly系統接口。它提供了一種方法,可以將不同的模塊彼此隔離,並賦予它們對文件系統特定部分和其它資源的細粒度權限,以及對不同系統調用的細粒度權限。
這些是目前已經存在於WebAssembly 技術中的技術,但目前還沒有辦法將這些安全控制向下傳遞給依賴樹,這需要一種讓父模塊有賦予其依賴關係同樣的安全控制的方法。
這也就是Bytecode Alliance目前在進行的工作,計劃採用各個模塊虛擬化的細粒度形式,研究人員已經在研究環境中驗證了這一想法,目前正在努力將其引入WebAssembly。
詳細技術細節查看原博客: