一场持续25分钟的故障,导致全球约28%的网站服务中断。

事件的源头并非外部攻击,而是源于Cloudflare自身的一次配置错误。更值得关注的是,这已是该平台在短短两周内发生的第二次大规模服务中断。
12月5日,Cloudflare的边缘节点开始大规模返回HTTP 500内部服务器错误。问题的根源并非安全威胁,而是其为了应对React Server Components暴露出的一个严重安全漏洞所采取的加固措施,这次故障可以说是由React的漏洞间接引发的。Cloudflare团队首先将Web应用防火墙(WAF)的缓冲区大小扩大至1MB,随后又关闭了一个内部测试工具。本意是为了更快地保护开发者,但这些操作却意外激活了运行在旧版FL1代理中、一段“沉睡”了可能长达15年的Lua代码缺陷:当某条规则被跳过时,其对应的对象并未被正确生成,系统后续尝试访问了一个nil值,直接导致了500错误。

Lua语言诞生于1993年,在2008年左右已相当成熟。Cloudflare于2009年成立,2010年服务上线后,Lua便成为其早期网络堆栈的基石之一。这也意味着部分历史代码因深度嵌入核心系统而难以彻底替换,潜在的缺陷可能在多年后被完全意想不到的操作序列激活。
尽管受影响的仅限于仍在使用旧版FL1代理并开启了特定托管规则集的客户,但这部分流量却占据了Cloudflare总流量的28%。颇具讽刺意味的是,已经用Rust重写并投入使用的新版FL2代理完全不存在此类问题。
更令人不安的是,此次事故与11月18日发生的那次故障模式高度相似:紧急发布补丁 → 全球范围同步生效 → 击中老旧代码路径 → 引发大规模服务瘫痪。Cloudflare在第一次事故后曾承诺改造其发布体系,但改造尚未完成,新的事故已然发生。
事后,Cloudflare宣布冻结所有网络变更,并将发布流程、应急响应能力以及故障开放(fail-open)容错机制列为最高优先级的改进事项。根本问题已然清晰:在一个高度复杂、全球分布的庞大系统中,即便是一行多年未曾执行的陈旧代码,只要与一次“全球同步推送”相结合,便足以引发波及半个互联网的连锁故障。
这两次密集发生的事故揭示了一个严峻的事实:在安全性要求不断提高、系统复杂度持续增长的互联网基础设施领域,如何避免“被自己的更新所击倒”,已经成为一个比抵御外部攻击更为紧迫和关键的工程挑战。
|