楼主: 相由心生123
123 0

Cloudflare因Rust二向箔瘫痪了互联网 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

14%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
40 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2018-2-25
最后登录
2018-2-25

楼主
相由心生123 发表于 2025-11-21 20:44:57 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

2023年11月18日,一场席卷全球的互联网服务大瘫痪悄然爆发。从ChatGPT到麦当劳自助点餐系统,甚至波及美国核电站的门禁控制,无数依赖网络的服务集体陷入HTTP 500错误状态。而这场风暴的起点,竟源于Cloudflare内部一次看似微不足道的权限变更——一根Rust代码中的.unwrap(),成了压垮全球网络生态的“最后一根稻草”。

Cloudflare作为全球顶级的内容分发与网络安全服务商,承担着“互联网门卫”的关键角色。几乎所有接入其服务的网站、应用和系统,都必须经过它的流量清洗与身份验证才能正常运行。一旦它出现故障,后果堪称数字世界的“断电”。[此处为图片1]

此次事故的核心,源自Cloudflare用于识别自动化机器人的“Bot-Management”系统。该系统依赖一个高性能分析数据库——ClickHouse,来存储和处理海量威胁情报数据。这些数据被整理成一份“特征文件”,相当于一份动态更新的“机器人通缉令”,并同步至全球所有边缘节点,用以实时拦截恶意请求。

工程师原本计划对ClickHouse的访问权限进行一次常规升级,意图让配置生成脚本能读取更多元数据以提升效率。然而,在执行过程中,由于未明确限定查询范围,脚本意外获取了底层分片(r0-Schema)的元信息。在此之前,该脚本仅能访问默认模式下的数据,生成的特征文件稳定维持在约60条记录。

权限放宽后,system.columns 表将分片相关的冗余元数据一并返回,导致原本精简的配置条目被重复填充,最终输出的特征文件膨胀至200多条记录,体积翻倍。这就像给安检人员突然塞进一本包含亲属关系、家庭住址的完整族谱,而非简单的身份核验清单,直接超出处理能力。

[此处为图片2]

真正引爆危机的是后续的数据加载机制。Cloudflare新一代FL2代理服务采用Rust语言开发,强调内存安全与高并发性能。为了优化资源分配,开发团队在代码中设定了一个硬性假设:特征文件的条目数不会超过200条。基于此,程序预设了固定大小的缓冲区,并使用了Rust中极具争议的操作——.unwrap()

这行关键代码如下:

let feats = parse_config(&buf).unwrap();

unwrap() 的语义极其强硬:若结果为 Ok,则解包值;若为 Err,则立即触发线程 panic,进程强制终止。这种写法在开发阶段便于调试,但在生产环境中无异于埋下定时炸弹。当超限的配置文件被载入时,parse_config 因格式异常返回 Err,随即引发整个FL2服务的崩溃。

更严重的是,服务崩溃后自动重启机制并未修复问题——每次重启都会重新拉取同一份“毒药”配置,再次触发panic,形成无限循环。大量节点几乎同时陷入崩溃与重启的死循环,造成“Thundering Herd”(惊群效应),即“雷霆万钧”式的连锁雪崩。

最终,这场由一条权限指令引发、经元数据泄露放大、再由一段不设防的Rust代码彻底引爆的事件,暴露了现代互联网架构中令人警醒的脆弱性:即便最先进、最可靠的技术堆栈,也可能因一个微小疏忽而导致全局性失效。这不是技术的失败,而是系统复杂性与人为假设之间失衡的必然代价。

Cloudflare官方报告揭示了一次堪称“自杀式崩溃”的严重事故:进程fl2_worker_thread因调用Result::unwrap()于一个错误值(Err)而触发恐慌,导致整个FL2服务瞬间终止。[此处为图片1]

作为Cloudflare全球流量调度与安全决策的核心组件,FL2一旦失效,成千上万用户的连接随即中断,终端用户面对的便是熟悉的HTTP 500错误页面——网络服务全面瘫痪的象征。

然而,真正的灾难才刚刚开始。服务器检测到核心进程死亡后,立即启动自动重启机制。但每次重启都会重新加载那组包含200多条规则的“致命配置”,再次触发.unwrap()操作,进而再度崩溃。这一过程不断循环,形成了典型的“启动死循环”(Boot-Loop)。

在全球范围内,数以万计的Cloudflare节点如同被推倒的多米诺骨牌,陷入“崩溃—重启—再崩溃”的无限循环中无法自拔。[此处为图片2]

连锁反应:从数字世界蔓延至现实社会

随着大量节点同时失效,“雷霆万钧”(Thundering Herd)效应随之爆发。少数仍在运行的节点突然承受远超负荷的流量冲击,迅速过载并相继崩溃,造成整体网络承载能力呈指数级下滑。

这场故障的影响早已超越传统互联网范畴,直接波及实体世界的关键基础设施:

  • 麦当劳门店的点餐系统大面积黑屏,员工被迫手写订单,字迹潦草到顾客怀疑菜单已被加密;
  • 美国某核电站的人员访问数据系统(PADS)出现认证失败,工作人员刷卡无反应,只能滞留在门外;
  • ChatGPT、Slack、Salesforce等主流SaaS平台登录异常,用户无法正常使用AI服务或企业协作工具;
  • 游戏玩家遭遇客户端卡在启动界面,无法进入游戏;
  • 微博热搜一度被“#半个地球崩了#”占据榜首,网友纷纷调侃:“这不是断网,是文明降级。”

门神倒下:身份验证体系集体失灵

Cloudflare的Turnstile(无感验证码)和Access(企业级访问控制)系统高度依赖FL2服务进行实时判断。当FL2崩溃时,这两大“数字门神”也随之停摆。

结果是,无数网站的登录入口、用户后台乃至支付流程全部冻结——没有守门人,谁也无法通行。

讽刺的是,一些专门用于报告网络状态的站点(如Downdetector),也因自身托管在Cloudflare平台上而同步下线,形成了“我要告诉你系统挂了,但我自己也挂了”的荒诞局面。[此处为图片3]

危机应对:工程师的极限操作

事故发生后,Cloudflare值班工程师展现了惊人的响应速度:

  • 10分钟内锁定问题根源——配置膨胀引发逻辑异常;
  • 20分钟完成回滚至“最后已知良好”版本;

  • 30分钟内将所有.unwrap()替换为更安全的match模式,并加入硬性查询限制;
  • 1小时左右,全球服务逐步恢复正常。

不过恢复过程中仍付出代价:伦敦节点临时关闭WARP服务,当地用户误以为英国“脱网脱欧”成真。

技术反思:一次.unwrap()引发的血案

事后复盘中,CTO发布长文总结三大教训:

  1. 内部配置也需严格校验:不能再假设“自己人传的数据一定可信”,必须像处理外部输入一样对待所有配置;
  2. 关键路径禁用unwrap:应采用“Fail Open”策略,宁可放行可疑请求,也不能让整个进程因单点错误崩溃;
  3. 优化数据库查询逻辑:为ClickHouse查询添加DISTINCT,避免重复记录引发连锁问题。

团队内部因此掀起一阵幽默风潮,有程序员评论:“以后代码Review先拍桌子,谁敢写unwrap就请他喝核电站冷却水。”

值得一提的是,尽管Rust语言以内存安全著称,但.unwrap()仍是其生态中的高危操作。官方文档明确建议生产环境使用match?运算符进行优雅错误处理,可惜仍有开发者心存侥幸。

这就像恋爱中明知对方情绪敏感,还偏要说一句“你有本事分手啊”,结果真分了又追悔莫及。

架构警示:现代系统的脆弱性暴露无遗

最终,通过紧急回滚配置和修复代码中的.unwrap()调用,服务得以恢复。但这起事件暴露出现代分布式架构的一个致命弱点:一个看似微不足道的代码逻辑,若出现在核心路径上,足以引发全球性连锁崩溃。

它提醒所有技术人员:在追求效率与自动化的同时,必须建立更强的容错机制、更严格的审查流程,以及对“信任边界”的重新定义——哪怕是最内部的模块,也不该拥有免检特权。

对于现代核心系统的构建,必须彻底摒弃对“内部生成数据”的无条件信任(Implicit Trust)。无论数据来源是内部配置还是消息队列,都应视同外部恶意输入一样进行严格的输入验证(Input Validation)。一旦检测到格式错误、数值越界或结构异常,系统必须立即拒绝该数据的使用,并触发最高级别的告警机制。

为了提升整体稳定性,核心业务逻辑应当与配置解析及校验模块实现严格隔离。即使在配置加载失败的情况下,主服务也应具备优雅降级的能力——例如回退至上一次确认有效的配置版本,从而保障服务持续可用。

[此处为图片1]

关键教训之一:核心组件必须遵循“宁可降级,不可崩溃”的设计原则。对于Cloudflare这类支撑全球网络流量的基础设施而言,系统韧性(Resilience)是最高优先级目标。任何形式的进程级崩溃(Panic)都是不可容忍的。

在代码层面,尤其应禁止在关键执行路径中使用可能引发panic的操作,如Rust语言中的.unwrap()或.expect()。取而代之的是,应广泛采用match表达式或?操作符,确保所有错误被显式处理,避免意外终止。

推行“失败即开放”(Fail Open)策略至关重要。当系统遭遇未预期的配置问题或解析异常时,正确的响应方式不是中断服务,而是维持现有运行状态,继续提供有限但可用的服务能力。这种“宁愿放过,不可错杀”的理念,远胜于“失败即关闭”(Fail Closed)所导致的大面积服务中断。

此次由Rust panic引发的Cloudflare服务中断事件,不仅是一次技术事故,更是一场对现代IT架构可靠性的全面压力测试。它警示我们:最强大的系统,往往因最细微的逻辑漏洞而崩塌。每一个潜在的单点故障(Single Points of Failure)都必须被识别并消除,唯有如此,才能构建出真正具备抗压能力的互联网基础设施。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:cloud Clou LAR CLO ARE

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2025-12-5 20:18