Synth Daily

2025年12月5日 Cloudflare 宕机事件

2025年12月5日,Cloudflare 因一次代码部署错误,导致其部分网络服务中断约 25分钟,影响了大约 28%的HTTP流量。此次故障的直接原因是在调整配置以应对一个安全漏洞时,意外触发了一个潜藏多年的代码缺陷,导致大量请求返回 HTTP 500 错误。官方声明此次事件与任何形式的网络攻击无关,并为近期连续发生的故障致歉,承诺将加紧改进部署与回滚机制,以提升系统稳定性。

故障背景与原因

为了保护客户免受一个新发现的 React Server Components 漏洞(CVE-2025-55182)的影响,Cloudflare 正在进行一项变更,旨在将其 Web 应用程序防火墙(WAF)的请求体缓冲区大小从 128KB 增加到 1MB。

  • 触发点: 在此变更的逐步部署过程中,一个用于测试新规则的内部工具出现了错误。为了优先保障安全补丁的推出,团队决定通过全局配置系统禁用这个内部工具。

  • 根本原因: 这个禁用操作被立即应用到全网。然而,在旧版的代理服务(FL1)中,该操作触发了一个隐藏的代码错误,导致代理程序崩溃并向用户返回 HTTP 500 错误

  • 影响范围: 只有同时使用旧版代理(FL1)和 Cloudflare 托管规则集的客户受到了影响。

技术细节:一个潜藏多年的错误

故障源于规则集系统中的一个逻辑缺陷。该系统允许一条规则“执行”(execute)另一套规则,而内部测试工具正是利用此功能来验证新规则。

当我们尝试使用紧急开关(killswitch)来禁用一条“执行”规则时,代码正确地跳过了该规则的评估。然而,后续的处理代码并未考虑到这种情况,它仍然假设一个与“执行”操作相关的对象存在。

  • 错误逻辑: 由于规则被跳过,代码尝试访问一个不存在(nil)的对象,从而引发了致命的 Lua 运行时错误:attempt to index field 'execute' (a nil value)

  • 潜在问题: 这是一个潜藏多年的代码错误。在用 Rust 语言重写的新版代理(FL2)中,由于其更严格的类型系统,这类错误在编译阶段就会被阻止,因此新版代理未受影响。

反思与改进措施

Cloudflare 承认,这次事件与不久前(11月18日)发生的另一起大规模服务中断暴露了类似的问题:一个单一的变更就能导致全网范围的故障。

“这类事件,以及它们如此密集地发生,对于我们这样的网络来说是不可接受的。我们再次为给客户和整个互联网带来的影响和痛苦表示歉意。”

为防止问题重演,公司正在优先进行以下几项关键改进:

  • 增强的部署与版本控制: 将配置变更纳入与软件发布同等级别的渐进式部署流程,包含严格的健康检查和快速回滚能力。
  • 简化的紧急处理能力: 确保在更多故障场景下,核心运维操作仍能顺利执行。
  • “Fail-Open”(故障时放行)机制: 调整系统默认行为,当遇到损坏或无效的配置时,系统应记录错误并默认放行流量,而不是直接中断服务。

在相关改进措施部署完成前,Cloudflare 将严格限制对其网络的变更。

事件时间线 (UTC 时间)

  • 08:47: 事件开始 - 错误的配置变更开始部署到网络。
  • 08:48: 全面影响 - 变更在网络中完全扩散。
  • 08:50: 宣告事件 - 自动化监控系统发出警报。
  • 09:11: 开始恢复 - 错误的配置变更被撤销。
  • 09:12: 事件结束 - 撤销操作完成,所有流量恢复正常。