摘要
- Cloudflare 表示,在 UTC 时间 11:05 部署的一项数据库访问控制变更,改变了一个 ClickHouse 元数据查询的输出,该查询未按数据库名称进行过滤。
- 修改后的查询返回了重复的列元数据,而此时显式授权正在数据库集群中滚动。基于该输出构建的 Bot 管理功能文件大小翻倍。
- 使用该文件的软件施加了大小限制。Cloudflare 的事后分析显示,一个使用
unwrap()的错误路径导致了核心代理路径中出现 panic 和 HTTP 5xx 错误。 - 该文件每五分钟生成一次。由于在特定时间只有部分数据库节点拥有更改后的权限,连续生成的文件可能在有效和无效之间交替。这导致了间歇性恢复,最初看起来像一次大规模攻击。
- Cloudflare 事后分析介绍称故障始于 11:20 UTC,而其详细时间线记录首次客户 HTTP 错误在 11:28 UTC。两种表述均应保留可见。
- 核心 CDN 和安全服务、Workers KV、Access、Turnstile、仪表盘登录以及部分邮件安全行为以不同方式受到影响。证据不支持称每项服务或客户完全不可用。
- OpenAI 报告在该重叠时段内出现网页访问错误,而其移动应用、API 和后端服务保持正常。这一区别显示同一依赖关系如何在不同产品表面上选择性失效。
- Cloudflare 的立即行动包括将生成的配置视为不受信任的输入、添加紧急开关以及审查模块故障行为。其后的 Code Orange 计划解决了配置的受控推出、接口契约和应急依赖问题。
- 另一起 Cloudflare 于 12 月 5 日发生的故障涉及另一全局配置路径。其触发原因不同,但进一步证明配置部署应获得与软件发布相当的控制。
- 问责制取决于对查询范围、制品验证、分发速度、回退行为、接口隔离、可观测性、回滚、客户沟通以及对所宣布修复措施在生产环境中运行的验证的控制。
权限变更成为全局流量的权力
第一个重要区别是变更发生的位置与其影响被允许传播的位置。Cloudflare 的事后分析将启动操作置于数据库权限部署中。该部署并未直接重写数据包处理逻辑,而是改变了一个元数据查询所能看到的内容。
该查询用于生成 Bot 管理功能文件。Cloudflare 解释称查询未按数据库名称过滤元数据。随着显式授权的部署,ClickHouse 以下层表中返回了列信息,从而导致重复行。生成器接受了这些行。最终的功能文件大小约为预期的两倍。
只考虑权限变更的工程师可能合理地将此归类为数据库控制操作。只考虑功能文件的工程师可能将其归类为内部配置更新。此次故障表明了为何这些标签不完整。该文件被 Cloudflare 网络上的软件消费,其内容影响了核心代理路径中的一个模块。一旦分发,该制品便具有实际权力,可以改变客户流量的成败。
即使该制品不是传统的二进制文件,这也是可执行的运营权力。“代码”和“配置”的区别对于所有权和工具来说是有用的,但它并不决定风险。风险取决于输入可能造成的影响。一个能够改变全局部署行为、耗尽解析器限制、选择安全操作或使组件崩溃的文件,应按照该权力进行治理。
这种框架并不意味着每个配置更新都需要与重大软件发布相同的仪式。它意味着控制应与爆炸半径、可逆性和故障行为成比例。一个带有受限默认值的区域偏好不会表现出与分布到全球、位于流量路径上的模块相同的风险。11 月的故障展示了当一个高权力配置通过一个未充分约束畸形或意外输出的路径时会发生什么。
因此,责任单位不是单一的数据库命令,而是整个链条。数据库团队控制了访问语义。查询所有者控制了范围和假设。生成器所有者控制了模式、基数和大小验证。分发系统控制了推出速度和范围。消费模块控制了错误处理。产品团队控制了接口依赖。事件团队控制了诊断、绕过和恢复。执行和可靠性领导层控制了哪些系统在事件发生前获得了发布级投资。
当问责制遵循这些控制面时,它变得更加清晰。当它被压缩为“人为错误”或只分配给批准权限变更的人时,它变得不太准确。
重建直接因果链
Cloudflare 的说明支持一个六部分序列。
首先,数据库访问控制变更于 11:05 UTC 开始。Cloudflare 正在转向数据库访问的显式权限。该变更改变了 Bot 管理功能文件生成器所用查询可见的元数据。
第二,该查询未将数据库名称作为过滤器包含在内。在变更的权限状态下,来自下层表的元数据出现在结果集中。返回了重复的列行。关键点不仅在于数据库产生了更多行。下游生成器依赖于这些行的唯一性和大小的隐含假设。
第三,生成器将重复行合并到功能文件中。在此边界上的一个健壮契约可以检查预期键是否唯一、模式是否有效、基数是否保持在已知或声明的范围内,以及最终制品是否低于运营最大值。Cloudflare 的事后分析显示,意外输出反而变成了可分发的文件。
第四,该文件通过 Cloudflare 的网络传播。分发将一个本地数据质量问题转化为全球运营事件。该分发的速度和范围并非偶然。它们在工程师获得足够证据以识别源头之前决定了爆炸半径。
第五,消费该文件的软件强制执行大小限制。限制通常是保护性控制。在这种情况下,对超限的处理是决定性的。Cloudflare 的示例标识了一个调用unwrap()的 Rust 错误路径。消费方没有保留已知良好的文件、仅拒绝新制品或降级受影响的分类功能,而是 panic。
第六,故障发生在核心流量和依赖服务共享的路径上。HTTP 5xx 响应出现在 Cloudflare 网络中。依赖核心代理或其后台服务的产品经历了自身的故障模式。
该序列分离了事故摘要中经常合并的三个概念。触发事件是数据库访问控制部署。直接故障机制是过大的生成功能文件导致其消费方 panic。根本控制失败是在查询语义、制品生成、全局分发和不安全消费之间缺乏有效屏障。
促成条件包括查询的不完整范围、缺乏足够的输入验证、文件的全球推出路径、消费者的失败语义以及附加在受影响路径上的产品依赖。检测和诊断因良好和不良制品的交替而复杂化。恢复需要的不仅仅是撤销数据库权限:工程师需要停止新文件的传播并恢复已知良好的配置,同时管理依赖服务。
这种分解很重要,因为每个类别暗示不同的修复。撤销启动变更可以结束一个事件。修复查询可以防止相同的重复行机制。添加模式和大小验证可以阻止更广泛的畸形制品。分阶段部署可以限制暴露。安全回退可以防止被拒绝的制品拖垮无关流量。更好的依赖隔离可以防止一个产品模块成为共同故障点。
一个仅记录“权限变更导致故障”的组织可能修复触发器,而系统仍容易受到不同的过大或畸形制品的攻击。一个仅记录“文件太大”的组织可能增加限制,同时保留不安全的全局传播。因果链的价值在于它防止将狭窄的修复误认为是持久的修复。
症状为何波动
功能文件每五分钟生成一次。Cloudflare 表示访问控制变更并未同时到达每个 ClickHouse 节点。在此过渡期间,生成作业可能从具有新授权的节点或尚未变更的节点接收输出。
这意味着输入并非始终不良。一次生成可能产生放大的功能文件。下一次可能产生有效文件。随着连续制品的传播,网络行为可能看似恢复然后再次失败。
这对工程和问责制都很重要。间歇性症状可能将响应者指向需求激增、攻击、网络不稳定或外部依赖。Cloudflare 表示其团队最初怀疑是超大规模分布式拒绝服务攻击。这是一种工作诊断,并非攻击发生的证据。该公司最终识别了一个内部配置链。
考虑到规模和模式,最初的怀疑是可以理解的,但延迟也揭示了一个可观测性问题。响应者能否快速看到每个位置加载了哪个版本和哈希的功能文件?他们能否将文件基数和大小的变化与 HTTP 错误率关联起来?生成器是否暴露了每个结果由哪个数据库节点提供?运营视图能否区分流量激增和核心代理 panic?
可观测性通常通过询问警报是否触发来评估。Cloudflare 的详细时间线记录了客户错误后自动检测迅速发生。更难的测试是证据是否指向失败的控件。一个说错误率高的警报可以确立紧迫性而不减少搜索空间。一个高权力配置系统需要足够的来源、分发和激活遥测来回答什么发生了变化、在哪里变化、哪个版本处于活动状态以及行为是否因版本而异。
波动也削弱了简单回退的假设。如果有效和无效文件交替,暂时的改善可能被误认为是成功补救。恢复应关联到已知制品、停止生成、控制分发和持续指标,而不仅仅是错误率的暂时下降。
因此,该事件为部分部署的控制变更提供了一个普遍教训。混合状态系统可能产生非单调的证据。一个负责任的推出设计假设新旧状态将共存,并测试在该期间查询、生成器和消费者是否正确。如果共存改变语义,推出计划必须约束顺序或添加兼容性逻辑。
时间线及其内部的证据缺口
Cloudflare 的事后分析呈现了两个开场时间。其介绍性说明称网络于 11:20 UTC 开始出现重大故障。详细时间线记录了 11:05 的数据库访问控制部署和 11:28 的首个客户 HTTP 错误。这些陈述不需要被强制成一个虚假的单一时间戳。它们可能反映不同的遥测或聚合级别。谨慎的重建应保留两者。
根据详细时间线,自动测试于 11:31 发现问题。手动调查于 11:32 开始。事件电话于 11:35 创建。这一顺序表明,一旦客户错误出现,检测和正式协调迅速跟进。
困难时期出现在检测之后。间歇性恢复和明显的规模将响应者引向攻击假设。与此同时,不良制品继续影响服务。检测失败与识别因果配置之间的差异是响应能力的核心衡量标准。
大约 13:05,Cloudflare 为 Workers KV 和 Access 实施了绕过。这些行动表明,即使在全局根本原因被完全移除之前,产品特定的缓解也是可能的。绕过也揭示了依赖边界:恢复一个网关或认证路径可以减少影响,而无需修复每个受影响的组件。
然后工作重点是将 Bot 管理恢复到上一个已知良好的功能文件。14:24,Cloudflare 停止新文件的生成和传播,并完成了替换测试。主要影响于 14:30 解决。Cloudflare 继续下游恢复,并报告所有服务于 17:06 解决。
在此时间线中有几个可问责的间隔。
第一个是从 11:05 到首次观察到的故障。这是部署前验证或分阶段暴露本可以防止全局事件的传播间隔。
第二个是从首次故障到自动检测。该间隔似乎很短,尽管 11:20 和 11:28 的不同表示阻止了虚假精度。
第三个是从检测到正确的因果诊断。公开记录描述了错误的攻击假设和交替的制品,但没有暴露每个内部决策或调查分支。这种不确定性应保持可见。
第四个是从诊断到全局遏制。停止文件生成和恢复已知良好制品是决定性行动。产品绕过更早地减少了危害。
第五个是从 14:30 的主要恢复到 17:06 的完全解决。这段尾部很重要,因为当一个全局平台的主错误率下降时,并不算完全恢复。队列、认证会话、依赖产品和客户系统可能以不同速度继续恢复。
时间线没有确立财务损失、合同处罚或受影响客户的普遍数量。Cloudflare 的状态和事后分析证据确立了服务行为和响应里程碑。任何关于损害的声明都需要单独的客户、合同或监管证据。
一次事故产生了若干不同的产品故障
宽泛的语言可能掩盖依赖设计如何塑造影响。Cloudflare 的事后分析在不同产品之间进行了区分,而不是说每项服务都以相同方式停止。
核心 CDN 和安全服务返回 HTTP 5xx 错误。这是代理路径故障最直接的表达。一个畸形的安全相关输入并未局限于机器人分类。它影响了普通流量的处理。
Workers KV 经历了高错误率,因为其网关使用了核心代理。底层存储概念和网关的依赖是不同的层。看到 KV 错误的客户不一定知道初始问题是 Bot 管理功能文件。
对于尚未拥有活动会话的用户,Cloudflare Access 经历了广泛的认证失败。这种区别很重要。现有会话和新认证路径可能有不同的依赖关系。说“Access 故障”不如识别哪个用户状态和接口故障信息丰富。
Turnstile 无法加载。由于 Turnstile 可以位于登录或表单流程内部,其故障可能使另一项服务看起来不可用,即使该服务的后端保持正常。这是共享安全依赖创建更大感知爆炸半径的一种机制。
Cloudflare 仪表盘大部分可操作,但许多用户无法登录。其登录流程依赖 Turnstile,且一些内部功能依赖 Workers KV。因此,管理界面在客户需要状态和控制的时刻变得更难使用。这不只是一个便利性问题。对管理和诊断功能的访问可能影响客户绕过事件的能力。
根据 Cloudflare 的说法,邮件投递继续,但 IP 信誉来源的临时丢失降低了部分邮件安全检测。这是一种降级控制状态,而非完全服务缺失。它提出了一个不同的决策:在减少检测的情况下继续投递是否比阻止邮件或使产品失败更安全。
这些区别显示了为什么接口契约应属于事件治理。每个依赖关系应指定当上游输入不可用、无效或过时时会发生什么。选择可能是保留已知良好值、使用中性默认值、拒绝风险操作、绕过非必要的分类步骤或使请求失败。没有通用答案。必须有深思熟虑的答案。
产品地图也有助于分配责任。拥有功能文件的团队控制其有效性。核心代理团队控制消费行为。产品团队控制其服务是否同步依赖受影响路径以及是否有绕过。平台领导层控制共享依赖的标准。客户控制其自身的一些替代路径,但他们无法在事件期间重新设计 Cloudflare 的内部耦合。
OpenAI 展示了选择性的客户方边界
OpenAI 的状态记录在重叠时段提供了主要的客户方视图。OpenAI 报告称,一些用户在访问其基于浏览器的消费者服务 platform.openai.com、Sora.com 和 openai.com 时遇到 HTTP 403 或 504 错误。它将该问题归因于上游第三方网络提供商有缺陷的配置推出。
同一记录称 OpenAI 的移动消费者和 Sora 应用、API 流量和后端服务保持正常。在提供商回滚变更后开始恢复。OpenAI 描述受影响时段大约为太平洋时间 3:30 AM 至 6:40 AM。
这个证据很有用,因为它防止了两个相反的错误。第一个是将 Cloudflare 事件视为对下游客户不可见。OpenAI 记录了真实的网页访问影响。第二个是声称所有 OpenAI 服务都失败了。其状态记录绘制了关于未受影响应用、API 和后端服务的明确边界。
这种差异可能反映了产品路径和依赖选择,但公开证据并未披露 OpenAI 的私有网络设计、合同条款或成本。该记录支持说网页访问依赖受影响的上游路径,而其他表面未经历相同故障。它不支持虚构冗余架构或声称违反服务级别协议。
选择性影响本身就是一个风险信号。一家公司可能认为拥有提供商多样性,因为某些工作负载使用不同路径,但如果公共网页入口点故障,用户仍可能感知到重大故障。相反,未受影响的 API 可能允许企业客户在浏览器访问降级时继续运营。依赖评估应衡量关键用户旅程,而不仅仅是统计供应商数量。
OpenAI 的经历也说明了为什么客户沟通应标识表面。“我们受到上游提供商影响”不如指定网页、移动、API 和后端状态更具可操作性。决定是否切换渠道的客户需要这种粒度。
触发事件、直接原因和促成条件
分配责任需要比“原因”更精确的词汇。
触发事件是变更后的数据库权限的部署。没有那次变更,查询不会通过这种机制产生相同的重复元数据。
直接技术原因是创建和分发过大的 Bot 管理功能文件,随后在消费者中进行不安全处理。翻倍的文件超出限制,错误路径导致 panic。
根本控制问题是内部生成的制品能够在没有充分验证和安全故障行为的情况下跨越全球运营边界。查询、生成器、分发者和消费者共同缺乏能够在影响核心流量之前阻止意外状态的屏障。
促成条件包括查询缺少数据库名称过滤器、推出期间的混合数据库状态、频繁的文件生成、快速的全球传播、消费者在错误路径上使用unwrap(),以及其他产品附加到受影响的代理行为。
检测问题不是缺乏警报。自动测试检测到错误。更重要的限制是因果可见性。交替文件和类似攻击的症状复杂化了识别。
响应问题是从广泛的事件信号过渡到配置路径的控制所需的时间。13:05 的产品绕过减少了一些影响,而最终遏制来自停止新功能文件的生成和传播并恢复已知良好文件。
恢复问题超出了核心代理。Cloudflare 报告主要影响于 14:30 解决,但所有系统于 17:06 解决。下游服务需要时间恢复正常。
这些类别防止问责制停留在更改权限的人身上。那个人可能控制了触发器。他们不一定拥有查询的假设、功能文件模式、分发架构、panic 行为或组织的配置发布标准。
它们也防止相反的错误,即将“系统”作为责任方,从而使任何团队都不负责任。每个控制都有所有者或应该有所有者。调查应识别谁可以更改查询、谁批准了制品契约、谁设定了推出政策、谁审查了消费者错误路径以及谁可以要求更安全的设计。
配置应受后果治理
软件组织通常维护成熟的二进制发布控制,同时允许配置通过更快的渠道移动。这种区别可能是合理的。配置常被用于避免重建软件、响应威胁和快速改变行为。
当配置具有广泛权力但接收较弱验证时,速度变得危险。11 月的事件显示了三个应提高控制水平的属性。
第一个是覆盖范围。功能文件被广泛分发到 Cloudflare 的网络。
第二个是耦合。消费模块运行在一条路径上,其故障影响核心流量和依赖产品。
第三个是脆弱性。文件大小的意外增加没有产生有界的拒绝。它导致了 panic。
一个基于后果的治理模型会将此类制品归类为高风险发布对象。该分类可能要求类型化模式、唯一性约束、基数阈值、最大尺寸检查、代表性消费者测试、金丝雀部署、限速传播、自动回退和已知良好回退。
控制必须覆盖转换,而不仅仅是稳定状态。数据库权限推出可能暂时暴露混合元数据。模式迁移可能使新旧读取器共存。生成器可能观察到部分部署。仅评估最终预期状态的测试恰恰错过了创建波动功能文件的条件。
配置管道还应记录来源。响应全局事件的运营商应能够回答哪个源查询产生了制品、哪个数据库节点响应了它、哪个代码版本生成了它、哪些验证通过、其大小和基数是多少、部署在哪里以及哪些消费者激活了它。
这并不意味着每个变更都需要缓慢的手动委员会。自动化可以提供更强的控制并保持快速。模式验证、差异风险评分、金丝雀、自动回退和签名来源可以使配置管道比很大程度上不可见的全局推送更安全、更响应。
问责测试是组织是否投资于与其赋予制品的权力相称的控制。如果对象可以停止全球流量,称其为“配置”不是辩护。
故障打开和故障关闭是接口决策
Cloudflare 的后续分析为故障语义问题提供了不寻常的可见性。如果 Bot 管理功能文件无效,系统可以保留已验证的先前文件或使用中性分类。如果 Bot 管理模块失败,不相关的流量可以继续,而不是从核心代理路径接收错误。
这听起来像是支持故障打开行为的论点,但该原则需要限制。安全和身份系统有时保护资源,在不确定性下允许访问会造成不可接受的损害。失败的授权检查可能需要拒绝请求。不可用的机器人分数可能可以默认为中性值。不可用的可选信誉信号可能证明具有明确监控的降级检查是合理的。正确的选择取决于接口和威胁模型。
当行为是偶然时,控制失败发生。Panic 不是文档化的风险决策。它将输入错误转化为运行时的默认故障结果。该结果可能比产品所有者意图广泛得多。
因此,每个高风险接口应定义:
- 哪些输入是强制性的,哪些是建议性的;
- 是否可接受过时的已知良好值;
- 保留值的最大年龄;
- 中性默认值是否增加安全或可用性风险;
- 在不确定性下应拒绝哪些请求;
- 降级模式如何向运营商和客户展示;
- 何时紧急开关可以禁用依赖功能;
- 谁有权进入和退出该模式;
- 所选行为如何测试。
对于 Bot 管理,公开的修复讨论表明,中性分类或保留默认值本可以防止无效文件停止不相关的流量。这是来自该模块的具体教训。它不应被概括为声称所有 Cloudflare 安全功能应故障打开。
好的故障语义也限制隐藏的降级。如果系统在没有安全信号的情况下继续运行,运营商应知道检测质量已变化。Cloudflare 的邮件安全示例说明了此问题:投递继续,而 IP 信誉来源暂时不可用。继续服务可以是合理的,但它创建了可问责的义务来测量和沟通减少的控制。
爆炸半径在接口处设计
该事件通过几个接口移动:数据库到查询、查询到生成器、生成器到文件、文件到分发者、分发者到消费者、消费者到核心代理、代理到产品。每个接口都是减少爆炸半径的机会。
在数据库边界,查询可以明确约束数据库身份并验证唯一性。
在生成器边界,系统可以拒绝重复键、意外的基数或过大的大小。
在分发边界,金丝雀可以在全局传播之前在小范围内暴露 panic。
在消费者边界,模块可以拒绝新文件,同时保留已知良好版本。
在代理边界,模块故障可以从普通流量中隔离出来,如果安全模型允许的话。
在产品边界,Access、Workers KV、Turnstile 和管理功能可以记录和测试绕过或替代路径。
存在多个可能屏障是重要的。可靠系统不应依赖一个完美的团队。数据库团队可能无法预测查询交互。生成器仍应检测异常输出。生成器可能错过它。金丝雀仍应显示消费者故障。金丝雀可能失败。消费者仍应安全降级。
这种深度防御模型不同于在启动变更中添加更多审查。审查是有用的,但审查者无法预测复杂全局平台中的每一次交互。健壮架构假设缺陷将穿过一个边界,并限制其下一步可做什么。
董事会应要求在这些接口处有证据,而不仅仅是事故行动列表完整的声明。有用的证据包括畸形文件的拒绝测试、显示金丝雀持续时间和扩展标准的部署指标、自动回退演习、紧急开关演练以及证明核心流量在可选模块故障时继续的演示。
检测很快,诊断更难
Cloudflare 的时间线表明,自动测试在详细表格中首次客户错误后几分钟内检测到问题。这是一个积极的控件。这意味着组织不仅仅依赖客户工单。
然而,事故仍然严重,因为知道流量正在故障与知道原因不同。初始 DDoS 假设和交替症状延长了遏制路径。
更强的诊断系统会将变更事件与服务行为联系起来。这包括数据库访问控制部署、功能文件大小和哈希变化、分发状态、消费者激活和 panic 签名。相关性不需要假设每个近期变更都有罪。它应使变更来源足够可见以快速测试。
文件的五分钟生成周期可能提供了自然的诊断键。如果错误率随着制品代际变化,响应者可以比较良好和不良文件哈希并回溯到其源查询。Cloudflare 是否拥有其中的一些可见性尚未由公开记录完全确定。关键是全局配置平台应使此类分析成为常规。
诊断访问还必须在事故中幸存。Cloudflare 后来的 Code Orange 讨论包括应急访问和循环依赖。可靠性团队不能仅依赖故障平台进行认证、仪表盘、部署控制或状态通信。独立路径成本高昂,但其价值在平台范围事件期间最大。
因此,检测的问责措施应包括因果隔离的时间,而不仅仅是首次警报的时间。一个组织可以报告出色的警报延迟,同时仍然缺乏阻止传播所需的证据。
即时修复和随后的 Code Orange 计划
Cloudflare 的初始事后分析列出了几个补救方向。它说内部生成的配置应被视为不受信任的输入。它描述了全局紧急开关、防止诊断输出耗尽资源的工作以及核心代理模块中错误处理的审查。
这些行动针对不同的故障类别。输入验证针对畸形或意外的制品。紧急开关在功能变得危险时提供遏制。资源控制防止故障排除数据造成二次故障。错误处理审查搜索其他路径,其中一个模块可能使更广泛的流量崩溃。
后来的“小规模故障”和 Code Orange 计划扩大了范围。Cloudflare 对比了成熟的软件二进制部署控制和能够快速改变全球行为的配置系统。它承诺将受控推出原则应用于网络配置、审查故障模式和接口契约,并改进应急程序和循环依赖。
即时修复和结构修复之间的区别很重要。对 ClickHouse 查询的补丁和更大的文件限制可以防止精确重复,同时使其他配置系统暴露。一个对高权力配置进行分类、分阶段部署和测试故障行为的计划可以减少更广泛类别的事件。
承诺不是证明。公开路线图确立了管理层的认可和声明的方向。修复证据需要可衡量的实施。例如:
- 现在有多少百分比的全局有效配置类型使用分阶段推出?
- 自动停止前的最大暴露是多少?
- 哪些制品模式强制唯一性、基数和大小?
- 金丝雀拒绝不良配置的频率如何?
- 每个核心模块是否可以在不重新启动代理的情况下禁用或降级?
- 最近何时演练了已知良好恢复和紧急开关?
- 哪些运营工具具有独立的认证和网络路径?
- 仍然有哪些公开例外、谁拥有它们以及何时到期?
11 月的事后分析和随后的计划共同创建了一个问责基线。Cloudflare 不仅可以因其道歉或发布详细解释而被评估,还可以根据名称列出的控制类别是否成为可观察的做法来评估。
12 月 5 日故障是比较证据,而非同一事件
2025 年 12 月 5 日,Cloudflare 经历了另一次与全局配置系统相关的故障。Cloudflare 称变更发生在响应 React Server Components 漏洞时。它以某种方式传播,导致约 28% 的 HTTP 流量子集出现错误,持续约 25 分钟。
技术触发因素不同于 11 月的 ClickHouse 和 Bot 管理链。这些事件不应合并为一个根本原因。然而,12 月确实强化了 Code Orange 工作中识别出的一个治理问题:配置改变全球行为的速度可能快于现有控制检测和遏制缺陷的能力。
当两个事件共享控制弱点而非触发因素时,修复标准应包括特异性和普遍性。组织必须修复每个直接机制。还必须识别共享类别,例如高速全局配置而没有充分的分阶段暴露。
12 月较短的持续时间与 11 月的恢复相比,并不会使该事件无关紧要。它提供了一个早期测试,检查修复计划是否已覆盖所有相关配置路径,以及紧急安全变更是否接受了与普通配置相同的发布纪律。
公开记录本身无法显示哪些 11 月的行动已在 12 月 5 日之前完成,或完成的控制是否失败。这需要内部实施和异常数据。尽管如此,该序列为董事会和客户提供了一个精确的问题:到那个日期,哪些配置类别在受控边界内,哪些仍在外部,以及为什么?
9 月仪表盘故障显示了分离的价值
Cloudflare 2025 年 9 月 12 日的仪表盘和 API 事件提供了一个有用的反面比较。一个 ReactuseEffect依赖问题在服务部署期间生成了对 Tenant Service 的重复调用。Tenant Service 过载,依赖授权的 API 失败。
Cloudflare 表示数据平面保持分离。普通流量投递未以相同方式受影响。用户经历了仪表盘和 API 问题,但故障没有获得 11 月事件的核心流量爆炸半径。
这种比较并不意味着管理平面故障是次要的。客户可能需要仪表盘和 API 来响应威胁或绕过故障。它表明即使控制平面有严重缺陷,架构分离也可以限制后果。
11 月跨越了不同的边界。生成的安全功能文件到达了核心代理路径中的软件,其故障影响了流量本身。因此,这两个事件说明了接口放置的实际含义。缺陷的严重性不仅取决于失败的代码,还取决于该代码被允许停止的内容。
这就是为什么依赖关系图应包括故障权限。一个组件可能被逻辑上描述为“Bot 管理”,同时物理上运行在共享代理内部。仪表盘登录可能依赖 Turnstile 和 Workers KV。产品名称不揭示完整的耦合。运营商需要经过测试的地图,显示哪个故障可以阻止哪个用户旅程。
客户问责仍然真实但不对称
Cloudflare 客户没有控制 ClickHouse 查询、功能文件生成器、全局分发者或代理 panic。这些控制的主要责任属于 Cloudflare。
客户仍然控制他们自己的服务如何依赖 Cloudflare。他们可以映射关键用户旅程,在合理的情况下分离网页和 API 路径,维护替代状态和管理访问,决定在提供商事件期间源站访问是否可能,测试 DNS 或流量故障转移,并沟通降级模式。
这些选项并非对每个客户都同样实用。多提供商架构可能昂贵并引入自身复杂性。安全策略可能有意阻止直接源站访问。有状态会话、证书、路由和应用行为可能使故障转移比采购语言所暗示的更慢。
问责制不要求假装每个客户都可以消除依赖。它要求决策者知道哪些功能依赖提供商,哪些替代方案实际有效,切换需要多长时间,以及变通方案创造哪些风险。
OpenAI 不同的网页和 API 影响显示了为什么这种分析应是具体的。使用未受影响 API 路径的企业可能继续服务其自身用户,而依赖浏览器的员工遇到错误。另一个客户可能将所有流量放在一条路径上。提供商集中度不是通过徽标数量衡量,而是通过关键工作必须通过的路径衡量。
合同和服务信用可以分配一些财务后果,但这里审查的公开来源没有确立特定条款或支出。客户不应将信用视为弹性控制。运营问题仍然是服务是否可以在其自身容忍度内继续或恢复。
沟通应暴露边界和不确定性
Cloudflare 的详细事后分析很有价值,因为它标识了启动变更、查询行为、生成制品、消费者故障和特定产品影响。这种详细程度允许客户更新其依赖和风险模型。
沟通仍需要仔细阅读。叙述中的 11:20 与详细时间线中的 11:28 之间的差异应被保留,而不是默默统一。初始攻击假设不应被重复为实际攻击。产品降级不应被变成普遍不可用。
事件期间的状态沟通应回答四个实际问题:
- 哪些产品表面正在故障?
- 哪些表面保持健康?
- 哪些变通方案安全且可用?
- 什么证据支持估计的恢复状态?
客户还需要独立的方式接收该信息。如果用于管理服务的相同身份、仪表盘或网络路径受到影响,仅状态页面可能无法提供足够的运营访问。应急路径必须被保护、限制和测试,但它们不得与它们旨在恢复的系统共享每个依赖。
事件后,沟通应分离已确认的事实、推论和开放问题。Cloudflare 确认了内部配置链。它宣布了修复工作。公开记录本身并不证明每个修复已跨所有配置系统实施。这是客户和董事会应该要求后续指标而不是从发布推断完成的时刻。
什么证据能证明持久的修复
持久的修复记录应比已完成工单列表更具体。
对于查询和数据契约,Cloudflare 应能显示生成器使用显式的数据库和表身份、拒绝重复键、验证模式版本并强制执行预期基数。测试应包括混合权限状态和部分推出。
对于制品验证,证据应包括分发前的最大尺寸检查、消费者兼容性测试和拒绝行为。被拒绝的制品不应仅仅因为它由内部系统生产就替换已知良好制品。
对于部署,证据应显示分阶段暴露。配置应通过小型代表性群体移动,在那里停留足够长的时间以获得有意义信号,并且仅在定义条件通过时扩展。当错误率、panic 或制品异常超过阈值时,系统应自动停止或回退。
对于故障语义,每个核心模块应有显式策略。测试应演示当输入缺失、过时、畸形或过大时会发生什么。安全默认值应根据安全和可用性风险进行证明。
对于依赖隔离,Cloudflare 应映射哪些产品依赖核心代理、Workers KV、Turnstile、Access 和共享身份路径。绕过应在事件前测试,而不是在客户故障时发明。
对于可观测性,响应者应能将活动制品追溯到其源查询、生成器版本、验证结果、哈希、大小、推出队列和激活时间。他们应能快速比较故障队列与健康队列。
对于事件访问,应演练独立认证、部署和通信路径。应急控制应对命名响应者可用、防止滥用并在使用后可观察。
对于客户问责,产品文档应标识有意义的依赖和回退行为,而不披露敏感内部细节。客户需要知道哪些服务可能一起降级以及哪些替代接口仍然可用。
对于治理,例外应是可见的。如果高权力配置还不能使用分阶段推出,领导层应知道原因、补偿控制、所有者和截止日期。隐藏的例外是声明的计划失去运营力量的地方。
最强的指标不是是否出现另一个相同的过大 Bot 管理文件。而是组织能否证明畸形的高权力配置在更广泛的平台上被拒绝、遏制和可恢复。
董事会层面的问责清单
董事会和高级运营商不需要批准单个功能文件。他们需要证据表明组织已治理了这些文件拥有的权力。
第一个问题是清单:哪些配置系统可以改变全局流量、认证、安全分类、路由或管理访问?
第二个是所有权:每个系统的源数据、生成器、分发路径、消费者和故障策略的所有者是谁?
第三个是契约强度:模式、唯一性、基数、大小和兼容性约束是否由机器强制执行?
第四个是转换安全性:测试是否覆盖混合版本、部分权限变更、过时输入和回退状态?
第五个是分阶段暴露:有缺陷制品能否在效果被测量之前到达整个网络?
第六个是回退:保留了哪些已知良好或中性状态,以及何时拒绝比降级服务更安全?
第七个是隔离:可选的安全或分析模块能否失败而不停止不相关的流量?
第八个是可观测性:响应者能否在几分钟内将错误与精确的制品和源变更联系起来?
第九个是控制访问:在平台事件期间,响应者是否保留独立的状态、认证和回退路径?
第十个是客户证据:受影响和未受影响的表面是否足够精确地沟通,以便客户采取行动?
第十一个是修复验证:哪些 Code Orange 承诺已实施、什么生产指标证明了它们以及哪些例外仍然存在?
第十二个是跨事件学习:12 月的配置故障是否揭示了未覆盖的类别、不完整的推出或新控制的失败?
这些问题分配了责任,而不假装复杂系统可以无缺陷。目标是防止一个缺陷获得无限权力。
问责制遵循预防、遏制和恢复的权力
Cloudflare 的 11 月故障很重要,因为因果链既是技术的也是组织的。权限变更改变了元数据。元数据改变了生成的文件。文件全局移动了。消费者 panic 将一个模块的无效输入转化为共享流量故障。产品依赖扩大了影响。交替制品复杂化了诊断。恢复依赖于停止传播和恢复已知良好状态。
没有单一标签能捕捉这个链条。它不是攻击。它不止是一个糟糕的数据库命令。它不仅仅是通过增加文件限制来解决。它是未能根据其运营权力治理配置。
Cloudflare 控制了创建和分发制品的内部系统。其责任包括查询设计、验证、推出、回退、隔离、诊断、恢复和修复证明。客户控制了自己的依赖地图和连续性选择,但他们的控制更窄且在下游。
最有用的结果不是承诺这次确切事件永不重演。而是未来意外输入将小规模失败的证据。这需要多个屏障:显式数据契约、分阶段分发、安全消费者行为、独立恢复访问和可见例外。
配置可以比软件更快更改,因为速度有价值。一旦配置也能停止全球流量,没有遏制的速度就成为治理决策。11 月 18 日的故障使该决策可见。
来源
- https://blog.cloudflare.com/18-november-2025-outage/
- https://blog.cloudflare.com/fail-small-resilience-plan/
- https://blog.cloudflare.com/5-december-2025-outage/
- https://blog.cloudflare.com/deep-dive-into-cloudflares-sept-12-dashboard-and-api-outage/
- https://blog.cloudflare.com/q4-2025-internet-disruption-summary/
- https://status.openai.com/incidents/01KABE2437NJYKBFHT22SD3H92/write-up
- https://status.openai.com/incidents/01KABE2437NJYKBFHT22SD3H92
- https://developers.cloudflare.com/bots/get-started/bot-management/
- https://developers.cloudflare.com/bots/reference/bot-management-variables/
- https://developers.cloudflare.com/kv/concepts/how-kv-works/
- https://developers.cloudflare.com/turnstile/
- https://developers.cloudflare.com/cloudflare-one/access-controls/
- https://developers.cloudflare.com/ruleset-engine/about/
- https://developers.cloudflare.com/workers/versions-and-deployments/
- https://developers.cloudflare.com/workers/versions-and-deployments/gradual-deployments/
- https://developers.cloudflare.com/workers/versions-and-deployments/version-overrides/
- https://developers.cloudflare.com/workers/versions-and-deployments/rollbacks/
- https://developers.cloudflare.com/workers/observability/

