对 Cloudflare Workers 的远程 Spectre 攻击的重新审视
在 2021 年,我们评估了针对 Cloudflare Workers 的远程 Spectre 攻击。根据结果,我们推出了一种生产防御机制,称为动态进程隔离 (DyPrIs),它能够识别恶意脚本并将其隔离到单独的进程中。从那时起,该领域中稳定 Spectre 攻击的新技术不断被发现。为了了解这些技术是否对我们的 Workers 生产环境构成威胁,我们决定重新内部评估远程 Spectre 攻击。在生产环境中构建一个更新的概念验证使我们能够在生产工作负载下实证评估 Spectre 攻击的风险。为了在生产环境中发起成功的旁路攻击,外部攻击者必须克服额外的障碍,例如共享硬件资源上的活动、中断、上下文切换和粗粒度定时器。我们的研究发现 DyPrIs 实现中的一个限制,并且我们成功展示了在 Cloudflare Workers 的生产环境中可靠地泄露高达 12 位/秒,准确率为 99% 的远程 Spectre 攻击。由于这项研究,我们改进了 DyPrIs,集成了 V8 沙箱和内进程隔离机制,进一步降低了内存泄露攻击的风险。今天,我们发布了一篇描述我们发现的论文,由 Albert Pedersen、Haocheng Xiao、Sam Ainsworth、Nigel Topham 和 Martin Schwarzl 共同撰写。这篇论文涵盖了 2024 年和 2025 年初的研究。请注意,由于 Cloudflare Workers 运行时团队采取的对策,所呈现的攻击在生产系统中已被缓解。在过去三年中,我们没有发现任何活跃利用的迹象。Cloudflare Workers 安全模型 Cloudflare Workers 在边缘运行不受信任的 JavaScript。通过语言级隔离,采用 V8 隔离体,成千上万的租户可以共享同一个操作系统进程。每个 Worker 具有自己的独立 JavaScript 堆。这一设计保持了启动延迟较低,并使我们能够以比完整进程隔离更高效的方式运行许多租户。在运行时,我们有多层防御,例如自动化 V8 补丁管道、由 Linux 命名空间和 seccomp 过滤器组成的两层沙箱、Cap’n Proto RPC,以及将某些脚本调度到单独进程沙箱中的可能性。然而,Worker 进程中的单个任意读取漏洞可能导致跨租户泄漏。一种非常难以缓解的漏洞利用了预测执行的特性,即进程内的 Spectre 。你可以将预测执行想象成远足。在某个时刻,你到达一个分支,必须预测该走哪里。如果预测正确,你节省了一些时间,可以在山间小屋享受阳光和清爽的饮料。然而,如果你朝错误的方向推测,就必须掉头。小径看起来没被触动,但你的脚印仍留在泥土中。CPU 中的预测执行也是如此。分支预测提前对分支的结果进行有根据的猜测,CPU 预测性地执行该结果。如果预测正确,预测性执行节省了一些时间。然而,如果预测不正确,CPU 必须放弃结果,回滚并执行另一个分支。由于这些预测性执行的指令只在 CPU 流水线中暂时存在,并且从未被永久保留或提交,文献上将其称为瞬态指令,并将这一概念概括为瞬态执行。然而,由于瞬态执行,微架构状态中仍会留下部分痕迹,例如 CPU 缓存。因此,攻击者可以利用 Spectre 暂时访问越界内存,将单个位的信息编码到缓存状态中,并利用重新访问数据的延迟来推测该位是否被设置。为了缓解进程内的 Spectre 攻击,Cloudflare Workers 冻结本地定时器,禁止多线程和共享内存,主动检测、定期打乱内存,并将看起来恶意的脚本隔离到单独进程中。攻击原语 远程 Spectre 攻击的高级概述。攻击者需要一个远程定时器来测量探测瞬态泄露位是 ‘0’ 还是 ‘1’ 所需的时间。Cloudflare Workers 平台故意限制定时器。在仅 CPU 执行期间,时间实际上被冻结。Date.now() 和 performance.now() 不提供持续推进的高分辨率时钟。没有共享内存,也没有多线程,因此经典的通过 SharedArrayBuffer 的计时器不可用。要成功发起攻击,需要解决几个挑战。首先,Workers 运行时是有限的,必须保证攻击者和受害者之间的共址。其次,必须发现一个可靠的、理想是共址的远程定时器,这样才能让攻击得以进行。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡