不受信任代码缓解措施
2018 年初,来自 Google Project Zero 的研究人员披露了 一类新的攻击,这些攻击 利用 了许多 CPU 使用的推测执行优化。由于 V8 使用优化 JIT 编译器 TurboFan 来使 JavaScript 运行得更快,因此在某些情况下,它容易受到披露中描述的侧信道攻击。
如果您只执行可信代码,则不会有任何变化 #
如果您的产品仅使用 V8 的嵌入式实例来执行完全受您控制的 JavaScript 或 WebAssembly 代码,那么您对 V8 的使用可能不受推测性侧信道攻击 (SSCA) 漏洞的影响。仅运行您信任的代码的 Node.js 实例就是一个不受影响的例子。
为了利用此漏洞,攻击者必须在您的嵌入式环境中执行精心制作的 JavaScript 或 WebAssembly 代码。如果您作为开发人员完全控制嵌入式 V8 实例中执行的代码,那么这种情况不太可能发生。但是,如果您的嵌入式 V8 实例允许下载和执行任意或其他不受信任的 JavaScript 或 WebAssembly 代码,甚至生成并随后执行不受您完全控制的 JavaScript 或 WebAssembly 代码(例如,如果它使用它们作为编译目标),您可能需要考虑缓解措施。
如果您确实执行了不受信任的代码… #
更新到最新的 V8 以从缓解措施中受益并启用缓解措施 #
针对此类攻击的缓解措施从 V8 v6.4.388.18 开始在 V8 本身中提供,因此建议将您嵌入的 V8 副本更新到 v6.4.388.18 或更高版本。旧版本的 V8,包括仍然使用 FullCodeGen 和/或 CrankShaft 的 V8 版本,没有针对 SSCA 的缓解措施。
从 V8 v6.4.388.18 开始,V8 中引入了一个新的标志来帮助提供针对 SSCA 漏洞的保护。此标志称为 --untrusted-code-mitigations
,在运行时通过名为 v8_untrusted_code_mitigations
的构建时 GN 标志默认启用。
这些缓解措施由 --untrusted-code-mitigations
运行时标志启用
- 在 WebAssembly 和 asm.js 中对内存访问之前的地址进行掩码,以确保推测执行的内存加载无法访问 WebAssembly 和 asm.js 堆之外的内存。
- 对 JIT 代码中用于在推测执行路径中访问 JavaScript 数组和字符串的索引进行掩码,以确保推测加载不能使用数组和字符串进行到 JavaScript 代码无法访问的内存地址。
嵌入器应该意识到,缓解措施可能会带来性能权衡。实际影响在很大程度上取决于您的工作负载。对于 Speedometer 等工作负载,影响可以忽略不计,但对于更极端的计算工作负载,影响可能高达 15%。如果您完全信任嵌入式 V8 实例执行的 JavaScript 和 WebAssembly 代码,您可以在运行时通过指定标志 --no-untrusted-code-mitigations
来选择禁用这些 JIT 缓解措施。v8_untrusted_code_mitigations
GN 标志可用于在构建时启用或禁用缓解措施。
请注意,V8 默认情况下会在假设嵌入器将使用进程隔离的平台上禁用这些缓解措施,例如 Chromium 使用站点隔离的平台。
在单独的进程中沙箱化不受信任的执行 #
如果您在与任何敏感数据不同的进程中执行不受信任的 JavaScript 和 WebAssembly 代码,则 SSCA 的潜在影响会大大降低。通过进程隔离,SSCA 攻击只能观察到与执行代码一起沙箱化在同一进程中的数据,而不能观察到来自其他进程的数据。
考虑调整您提供的精确计时器 #
高精度计时器使观察 SSCA 漏洞中的侧信道变得更容易。如果您的产品提供不受信任的 JavaScript 或 WebAssembly 代码可以访问的高精度计时器,请考虑使这些计时器更粗糙或向其中添加抖动。