WebAssembly 初學者第 3 部分:WASM 可移植性和安全性如何工作
已發表: 2023-01-05在本初學者指南中查看 WebAssembly (WASM) 可移植性和安全模型的工作原理。
兩者都是高級 WebAssembly (WASM) 主題。 我們建議您閱讀我們的 WebAssembly 初學者係列中的前兩個主題。
- 面向初學者的 WebAssembly – 第 1 部分:WASM 簡介
- WebAssembly 初學者——第 2 部分:目標、關鍵概念和用例
讓我們開始吧。
WebAssembly 可移植性
WebAssembly 的可移植性使其為 Web 做好了準備。 事實上,您可以將 WASM 定義為一個可移植的沙盒平台。
此外,其二進制格式使其能夠跨各種指令集架構和操作系統執行。 這意味著您不僅可以在 Web 上使用 WASM,也可以在 Web 之外使用。
為了理解 WASM 的可移植性,我們將討論以下內容:
- 局部的、有限的和不確定的環境。
- 具體執行環境特徵
- WASM 網絡和非網絡可移植性
局部的、有限的和非確定性的
WASM 需要高效的執行和適當的本地、有限和非確定性環境。 非確定性計算指定算法/編譯器/環境即使對於相同的輸入也會輸出不同的行為或結果。 它與確定性算法相反。
另外兩個方面, limited 和 local ,與非確定性執行有關。 要使非確定性執行起作用,您需要定義明確的“有限”用例。
此外,這些執行是“本地”的,在環境之外沒有影響。 閱讀他們在 WebAssembly 文檔中的官方非確定性以了解更多信息。
具體執行環境特徵
為了使 WebAssembly 可移植,它假定執行環境提供以下特徵:
- 字節內存粒度可尋址和 8 位字節。
- 32 位二進制補碼有符號整數。 可選 64 位。
- 通過未對齊的內存訪問或可靠的陷阱可以進行軟件仿真。
- 支持 IEEE 754-2008 中定義的 32 位和 64 位浮點數。
- 保證以前進的進度執行所有線程。
- 對於 64 位訪問,wasm64 應該提供無鎖原子內存操作符。
- 無鎖原子內存操作符包括 8、16 和 32 位訪問。
- wasm64 支持具有 64 位索引或指針的高於 4 GiB 的線性內存。
- 小端字節順序。
所有主流瀏覽器,包括 Chrome、Edge、Firefox 和 WebKit,都支持所有這些環境要求。
此外,WebAssembly 正在快速發展。 WASM 社區組和 W3C WebAssembly 工作組正在努力實現其標準化。 這意味著這些要求中的任何一個都可能在未來發生變化。
WASM Web 和非 Web 可移植性
WebAssembly 的主要目的是在 Web 和非 Web 上提供可移植性和本機性能。 在本節中,我們將看看 WASM 如何實現它。
#1。 網絡嵌入
WASM 與 Web 生態系統很好地集成,包括 Web 的安全模型、Web 可移植性和 Web API。 此外,它必須有足夠的空間用於未來的創造性開發(閱讀 WebAssembly for Beginners – Part 2 以了解其目標)
那麼,WASM 是如何實現與 Web 的兼容的呢? 它利用 JavaScript API,使開發人員能夠輕鬆地使用 JavaScript 進行 WebAssembly 模塊編譯。 它還負責存儲和檢索編譯器模塊、管理從編譯器模塊導入、管理內存等。
要了解有關 WASM 如何實現高級 Web 兼容性的更多信息,請閱讀:Web 嵌入 – WebAssembly。
#2。 非網絡嵌入
如前所述,WASM 也適用於非網絡環境。 作為開發人員或企業,您可以創建高性能應用程序或編寫需要性能調整的應用程序部分。 例如,您可以在物聯網設備、數據中心服務器和桌面/移動應用程序上使用它。
由於非 Web 應用程序無法使用 Web API,因此它們依賴於 WASM 的動態鏈接。 您還需要使用功能測試,這是一種軟件開發過程,可以測試功能的多種變體,以了解什麼對用戶體驗最有利。 此外,開發人員可以使用 JavaScript VM 來簡化非 Web 嵌入或在沒有它的情況下開發他們的應用程序。
要了解更多信息,請閱讀非 Web 嵌入 - WebAssembly。
WebAssembly 安全
WebAssembly 是一種二進制格式的解決方案,可提供類似本機的性能。 它在 Web 上運行良好,但也可以進行微調以在非 Web 嵌入上運行。 這使得 WASM 在服務、解決方案和流程中廣泛可用。 然而,這意味著更多的安全挑戰。
WASM 安全挑戰和風險
儘管 WebAssembly 被認為是安全高效的,但它也存在多種安全風險,包括:
- WebAssembly 沙箱
- 內存管理
- 代碼混淆
- 完整性檢查
#1。 WebAssembly 沙箱
WASM 在網絡瀏覽器中執行,就像 JavaScript 一樣。 它使用與 JavaScript 相同的虛擬機 (VM)。 沙箱有效地提供了一個安全的執行環境,並阻礙了幕後的運行。

因此,如果 JavaScript/WebAssembly 代碼包含惡意代碼,則很難檢測到,因為它是一個黑盒子。 此外,WASM 代碼採用可立即運行的二進制格式; 它運行得更快,使防病毒解決方案很難查找任何惡意代碼。 例如,代碼可能包含不需要的廣告或將用戶重定向到不需要的惡意軟件站點的能力。

此外,WebAssembly 過度依賴 JavaScript 在 Web 上運行也意味著它繼承了 JavaScript 漏洞。 這就是為什麼作為開發者,在編碼 WASM 時必須遵循 JavaScript 的安全預防措施。
#2。 內存管理
WASM 中的內存管理很棘手。 首先,它在 VM 中執行時不直接訪問物理內存。 這就是它使用主機內存的原因。
其次,在 WASM 中清理內存需要一個明確的過程,而相比之下,JavaScript 會自行清理。
此外,當 WASM 函數將輸出返回給 JavaScript 時,它會返回一個指向分配的 WASM 內存空間內位置的指針。 因此,如果聲明的內存已滿,WASM 程序可能會崩潰,從而破壞用戶體驗。 為了防止它,程序員需要使用消毒劑來調試他們的代碼或使用 emscripten 等工具鏈。

#3。 代碼混淆
WASM 的沙箱執行使其代碼變得模糊。 此外,WASM 二進制格式也不是人類可讀的,因此很難進行逆向工程,而逆向工程是識別惡意代碼所必需的。
由於缺乏人類可讀的格式,這些使得 WebAssembly 代碼難以調試。 這打開了許多安全漏洞,包括黑客隱藏竊取敏感信息的代碼或進行代碼注入以接管主機的能力。
#4。 完整性檢查
通過 Web 傳輸的任何數據都容易受到數據篡改的影響。 例如,黑客可以執行中間人攻擊來更改數據值。 這是 WASM 的一個問題,因為它沒有正確的方法來進行完整性檢查。
但是,它可以與 JavaScript 一起執行完整性檢查。 識別潛在 WASM 代碼漏洞的另一種方法是使用集成工具,例如 Jit。 它確保代碼不受不良行為者的影響,並且不會影響應用程序或周圍的雲基礎設施。

了解 WASM 安全模型
WebAssembly 非常重視安全性。 這就是為什麼在官方 WASM 文檔中,他們提到他們的安全模型負責兩個重要目標:
- 確保沒有錯誤或惡意模塊影響用戶
- 確保開發人員可以減輕任何安全風險並創建安全的應用程序,同時確保始終保持第 1 點。
WASM 安全模型知道 WebAssembly 應用程序獨立執行,同時無法逃脫其沙箱環境。 但是,API 可以開闢一條攻擊主機環境的途徑。
另一種容錯技術包括以有限的期望確定性地執行應用程序。 通過確保這兩個條件,大多數應用程序執行都被認為是安全的。
為了提高安全性,開發人員應該對信息流實施同源策略。 如果您正在為非 Web 開發,則必須使用 POSIX 安全模型。 如果您想閱讀更多關於其安全模型的信息,請查看:Security – WebAssembly。
WebAssembly 系統接口 (WASI)
WASI(WebAssembly 系統接口)在 WASM 非 Web 嵌入中也起著至關重要的作用,因為它提高了安全性。 它是一個模塊化系統接口,提供令人興奮的安全特性和便攜性。
事實上,它現在是 WebAssembly System Interface Subgroup Charter 的一部分,因此是標準化的。 由於 WASI,WASM 被廣泛應用於不同的邊緣/服務器計算領域。 此外,WASI 簡化了從網絡嵌入環境轉移到非網絡嵌入時的安全性。
最後的話
WebAssembly 的可移植性和安全性是兩大主題。 在面向初學者的 WebAssembly 的第 3 部分中,我們嘗試對其進行簡化和分解,尤其是對於初學者。
接下來,您可以查看面向開發人員和學習者的 JavaScript 備忘單。