
Cloudflare Workers 远程 Spectre 攻击重评估
2021 年评估了针对 Cloudflare Workers 的远程 Spectre 攻击,推出动态进程隔离(DyPrIs)防护机制。后来稳定 Spectre 攻击出现新技术,重新评估攻击风险。研究发现 DyPrIs 局限性,展示攻击能以 99% 准确率每秒泄漏多达 12 比特数据,改进 DyPrIs 集成 V8 沙箱和进程内隔离机制。今天发布论文阐述 2024 年至 2025 年初研究内容。目前生产系统已缓解攻击,过去三年未发现主动利用迹象。
Cloudflare Workers 安全模型
Cloudflare Workers 可在边缘运行不受信任 JavaScript 代码,借助 V8 隔离机制实现语言层面隔离,数万个租户共享同一操作系统进程,每个 Worker 有独立 JavaScript 堆,运行时周围设多层防护,但 Worker 进程任意读取漏洞可能致跨租户数据泄露,如进程内 Spectre 漏洞。
Spectre
将 CPU 推测执行类比徒步旅行,预测正确节省时间,错误则需回滚。推测执行指令为临时指令,统称临时执行,会在微架构状态留痕迹,攻击者可利用 Spectre 临时访问越界内存,编码比特信息到缓存状态,通过访问延迟推断比特是否设置。Cloudflare Workers 采取冻结本地定时器等措施防范攻击。
攻击原语
远程 Spectre 攻击需远程定时器测量泄漏比特时间,Cloudflare Workers 平台限制定时器。成功实施攻击需解决攻击者和受害者共置、找可靠远程定时器、采取额外稳定措施等挑战。
Spectre 小工具
借助合适小工具,攻击者可临时访问越界内存并编码比特到缓存,通过测量内存访问延迟确认数据是否缓存。攻击中使用两种小工具,分别用于泄漏压缩堆指针和从任意用户空间 64 位指针处泄漏数据。
信号放大
缓存命中和未命中差异小,远程定时器有噪声,需信号放大区分。Stephen Röttger 和 Artur Janc 发现利用 L1 缓存 PLRU 策略放大单次内存访问的方法,可使目标行保留在缓存或导致大量 L1 未命中。
远程定时器
信号放大后,有噪声的远程定时器足以区分编码比特,如与外部服务器建立 WebSocket 连接。论文评估多种定时器设置,可在较大拓扑距离下实现亚毫秒级分辨率。
可重复测量
单次测量难区分计时编码数据,需重复测量并重置缓存状态,逐出推测分支依赖值和探测行。经典方法构建逐出集成本高,Dougall Johnson 提出基于鸽巢原理的更优雅方法,分配大量数据使随机缓存行大概率被逐出。
攻击者与受害者隔离实例的共置
攻击者和受害者隔离实例需在同一边缘服务器同一进程中调度,在 Cloudflare Workers 中较易实现,可通过调用受害者脚本和发送子请求使其保持活跃,还可选择非高峰时段共置数据中心攻击。
突破隔离实例的资源限制
Cloudflare Workers 运行时对隔离实例有限制,常规 Worker 连续请求落同一边缘服务器不可靠,Durable Objects 可解决问题,将传入 WebSocket 消息视为调用,重置限制。但隔离实例单线程,同步代码执行时不处理消息,需在突发操作间让步保持实例活跃。
整合所有要素
将基于树的 PLRU 放大与测量循环结合,增加时间差异,使信号能使用远程 WebSocket 定时器分类。在生产环境演示端到端攻击,实现攻击者、受害者和远程定时器共置,增加校准步骤,从 Worker 中泄漏数据,实现每秒 12 比特泄漏率,准确率超 99%。攻击鲁棒性好,CPU 利用率高时仍可行。
为何未被检测到?
DyPrIs 监控硬件性能计数器,攻击未被察觉有两个因素:一是 DyPrIs 在脚本调用结束后隔离,攻击中 Durable Object 保持活动技巧使数据泄漏先完成;二是 DyPrIs 归一化处理分支预测错误,远程定时器和 WebSocket 流量使归一化比率降至阈值以下,攻击看似普通 I/O 密集型 Worker。
我们做出的改进
从三方面改进:一是 V8 沙箱,移除 JavaScript 堆大部分区域原始 64 位指针,降低内存损坏原语实用性,但不能完全缓解 Spectre 攻击;二是硬件辅助的进程内隔离,2025 年 9 月部署使用 MPK 的进程内隔离机制,改变攻击风险模型,减少数据泄漏范围,但有局限性;三是改进的 DyPrIs,将长时间运行和 I/O 密集型工作负载作为安全问题处理,研究将远程计时行为作为额外维度添加。
致谢
感谢爱丁堡大学的 Haocheng Xiao 及其导师 Sam Ainsworth 和 Nigel Topham 为提高 JavaScript 中 Spectre 攻击可靠性做的贡献。
邀请参与
通过漏洞赏金计划寻求高质量提交,运行时内存安全漏洞是高价值目标,可在 GitHub 上找到 workerd 的 Fuzzilli 集成和 workerd 源代码。

492

被折叠的 条评论
为什么被折叠?



