每个成功的平台都需要让其他人编写在其中运行的代码。用户插件、自定义企业客户端功能、合作伙伴扩展、通过 API 发送的业务规则。问题总是相同的:如何在您控制的基础设施上运行不是您编写的代码,而不会将其变成漏洞?传统的应对措施成本高昂、缓慢或脆弱。 [WebAssembly1 提供了不同的答案 - 要理解其中的原因,就需要了解是什么让问题变得困难。
为什么传统解决方案无法扩展
许多团队的第一次尝试是 0 或等效的:在运行时直接执行代码字符串。它的实施速度很快,但维护起来却是灾难性的。插件代码可以访问主机进程拥有的所有内容——内存、网络、文件系统。恶意或简单的错误插件可能会导致整个流程瘫痪或从其他租户中窃取数据。
第二次尝试是插件微服务:每个扩展都在一个隔离的容器中运行。从安全角度来看它是有效的,但运营成本随着插件数量的增加而线性增长。在具有数百个扩展的平台上,为每个客户端维护一个容器是不可行的。每个跨容器调用的延迟也会影响亚毫秒级的操作。
具有 Linux 命名空间的子进程是另一种选择 - 比容器更轻,但具有初始化开销以及 seccomp 和 cgroup 的复杂性,以确保真正的隔离。它需要一个深入了解内核模型的团队。所有这些方法的共同问题是它们将隔离视为外部事物:您使用操作系统机制围绕不受信任的代码构建围栏。 Wasm 颠倒了这个逻辑。
功能模型:默认为零
WebAssembly 模块从零功能开始。从字面上看,没有。他无法打开文件。无法发出网络请求。无法读取环境变量。它无法访问其自身线性内存之外的任何字节。如果模块在主机未显式提供相应接口的情况下尝试任何这些操作,则该操作会失败 - 不是在运行时出现异常,而是在结构上失败,因为模块调用的函数根本不存在于执行环境中。
这称为基于功能的安全性,它在概念上不同于本机代码继承的环境权限模型。当您加载本机库时,它会以完整进程权限运行。当您加载 Wasm 模块时,它会在没有任何权限的情况下启动,并且您作为主机可以决定交付什么。
安全接口位于主机集成代码中。您向模块公开了准确的有意义的功能——访问 Figma 画布 API,但不访问文件系统;可以访问 Shopify 订单数据,但不能访问 [数据库2 凭据。该模块会执行您允许它执行的所有操作,仅此而已。攻击面是明确说明的,而不是推断的。
真实平台如何使用它
Figma 是最著名的例子。插件系统在 Wasm 沙箱中运行每个插件。该插件可以访问画布 API——它可以读取和修改元素、创建图层、访问文本属性——但它无法访问该合约之外的任何内容。插件无法读取操作系统文件或进行任意网络调用。这不是使用政策;这在技术上是不可能的。这就是为什么您可以安装来自未知开发人员的 Figma 插件,并有合理的信心相信它不会泄露您的文件。
Shopify 做出了与 Shopify Functions 类似的决定:折扣、购物车验证和运输规则的自定义逻辑由商家作为 Wasm 模块发送。每次调用都会接收请求数据,在每次调用的严格 CPU 和内存限制内执行,并返回结果。代码编写不佳的商家不会导致平台崩溃或访问其他商家的数据。
Envoy Proxy 对自定义流量过滤器使用相同的模型。使用 Envoy 作为代理的公司(例如 Istio 和 AWS App Mesh)可以编写 Wasm 过滤器来处理传输中的请求和响应。过滤器可以访问标头和正文,但无法访问代理的内部状态。无需开放系统核心即可扩展。游戏引擎通过独立的路径达到相同的模型:允许玩家添加内容的模组系统需要运行陌生人的代码而不损害主机游戏,而 Wasm 通过相同的功能机制解决了这个问题。
编写插件的成本
这种安全感是有代价的。为基于 Wasm 的平台编写插件比编写 JavaScript 或 Python 更困难。
第一个摩擦是工具链:编译 Wasm 需要兼容的编译器——Rust 和 C/C++ 有成熟的支持,Go 有实验性支持,Python 和 Ruby 有限制。第二个是系统访问:在沙箱内,除了主机公开的内容之外,无法直接访问任何内容。如果主机未提供相应的接口,则直接进行 HTTP 调用的库将无法工作。这迫使设计纪律一开始可能会令人沮丧。
在平台方面,复杂性在于很好地定义暴露给模块的API。设计不佳的 API 要么限制太多(插件无法满足其需要),要么限制太宽松,从而损害安全性。该合同不仅涉及工程,还涉及产品和安全工作。
什么时候投资这个模型才有意义
该决定具有明确的轮廓。当您与无法保证代码质量的外部开发人员一起构建平台时,这是有意义的。当您需要为每个租户进行定制并具有单独的资源限制时,这是有意义的——每个客户端都有自己的逻辑,但没有一个客户端独占 CPU 或内存。当您分发将在您不完全控制的基础设施上运行的代码时,这是有意义的。
当插件是内部的并且您信任编写它们的团队时,这是没有意义的。当您想要减轻的威胁在模型中不存在时,工具链开销和系统约束会产生真正无与伦比的摩擦。底线是这样的:向你无法控制的受众提供向外的可扩展性,这就是 Wasm 所提供的。
另请阅读
- [关键基础设施和能源依赖:管理者需要了解什么3
- [领导者的量子准备:现在该做什么(和不该做什么)4
- [WebAssembly 和可移植组件:组件模型的承诺5
- [WebAssembly 处于边缘:为什么快速启动和隔离很重要6?
- [面向领导者的 WebAssembly:当架构决策值得时7
- [应用程序身份验证:完整的安全性和用户体验指南8