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 备忘单。