一个正则表达式搞垮了 Cloudflare,持续 27 分钟。
2019 年 7 月 2 日,UTC 时间 13:42:Cloudflare Web 应用程序防火墙的一条新规则在大约两秒钟内在全球 180 多个城市生效。
2019 年 7 月 2 日,UTC 时间 13:42:Cloudflare Web 应用程序防火墙的一条新规则在大约两秒钟内在全球 180 多个城市生效。这是一条模拟模式下的 XSS 规则,因此它不会阻止任何内容,但它仍然在每个请求上运行,并且以 .*(?:.*=.*) 结尾。PCRE 回溯,每个处理 HTTP 请求的 CPU 核心都达到 100%,每个由 Cloudflare 代理的网站都在 27 分钟内返回 502 错误;流量下降 82%。终止开关位于 Cloudflare Access 之后,而 Cloudflare Access 又位于 Cloudflare 之后。事后分析,来自 Cloudflare 自己的报告:数周前在旨在节省 CPU 的重构中移除的 CPU 保护措施,允许任何规则跳过测试阶段的程序,没有复杂性保证的引擎,11 个原因和 7 个修复方案。对修复方案的评价:SHIP IT。
本视频涵盖的内容
- UTC 时间 13:31–13:42:PR 合并,CI 通过(无 CPU 测试),Quicksilver 将规则推送到 180 多个城市;WAF 规则跳过 DOG → PIG → Canary 阶段
- 13:45–14:07:第一页;全球 CPU 100%,流量 −82%,到处都是 502 错误;内部控制面板位于 Cloudflare Access 之后,而 Cloudflare Access 已宕机;部分凭据已过期;一个不常演练的绕过方案
- 14:07–14:09:全球 WAF 终止;27 分钟后流量和 CPU 恢复正常;14:52 WAF 恢复,但没有该规则
- 7 月 2 日(UTC 时间 15:50)和 7 月 12 日:Cloudflare 发布了当日说明和完整的事后分析;重新添加了 CPU 保护措施,重新读取了 3,868 条规则,分阶段部署,转向线性时间正则表达式引擎
翻译的文字记录
译自英文原版旁白。可用音频和字幕由 YouTube 控制。
0:00 一个正则表达式在所有 Cloudflare 服务器上同时生效, 在接下来的二十七分钟里,它后面的网站都是 502 页面, 这对于防火墙来说,是可能的最严格的设置。 2019 年 7 月 2 日,UTC 时间 13:42。 Cloudflare 在两小时内发布:不是攻击,是错误部署, 流量下降 82%。 十天后,CTO John Graham-Cumming 发布了完整的事后分析, 包括正则表达式,Hacker News 给出了 698 分,
0:26 对于一次中断来说,这是一个起立鼓掌的成绩。 它如何发生,为何可能,以及谁真正应该承担责任。 这里是 The Daily Diff,事后分析。 13:31。一个拉取请求合并:一条新的防火墙规则,用于防范跨站 脚本攻击,处于模拟模式,因此它什么都不阻止。 13:37,测试通过;没有一个测试测量 CPU。 13:42,规则在两秒内推送到 180 个城市, 因为 WAF 规则跳过了其他发布会经历的 dog、pig 和 canary 阶段。
0:54 13:45,出现第一个页面。 13:49,Hacker News 上有一个关于状态页面的帖子, 上面仍然显示所有系统运行正常。 该规则以点星、点星、等于、点星结尾:任何内容, 然后是任何内容,然后是等号。 PCRE 贪婪地猜测,失败,然后回溯所有其他分割。 x 等于 x 需要 23 步。 等号后有二十个 x:555 步。
1:15 二十个 x,没有等号:4,067 步,什么也没找到。 在每个请求上运行,每个核心都达到百分之百, 彻底地什么都不做。 两个守卫本应该发现它。 数周前,规则的 CPU 限制在一次重构中被错误地移除, 这次重构旨在使 WAF 使用更少的 CPU。 而且该程序允许任何规则跳过测试阶段,因为规则是为了阻止实时 攻击而存在的;但这并不是紧急情况,它还是全球生效了。
1:37 14:00,WAF 被识别;不是攻击。 14:02,有人提议全球终止:一个组件, 关闭,全球范围。开关在 Cloudflare Access 之后。 Cloudflare Access 在 Cloudflare 之后。 一些凭据因未使用而过期,因此互联网上最快的网络 花了五分钟时间来绕过一个没有人演练过的方案。 14:07,终止。14:09,流量恢复正常。 git blame:单一速度的部署,全球范围;一个 CPU 保护措施被
2:04 意外重构移除;一个没有上限的正则表达式引擎。 不是编写规则的工程师:事后分析列出了 11 个原因, 没有指名道姓。影响范围:27 分钟,82% 的流量, 每个核心在每个城市都达到 100% CPU。 仪表盘和 API 位于同一个边缘之后,因此客户甚至无法关闭 它。Hacker News 上,事后分析的评论:他们有一个问题, 使用了一个正则表达式,现在他们有两个问题了。 老笑话了。仍然有效。
2:28 裁决,事后分析:SHIP IT。 CPU 保护措施回来了,所有 3,868 条规则都人工读取, 规则经过测试阶段,引擎转向 Ken Thompson 于 1968 年发布的 具有线性时间保证的引擎。 星期一:任何每个请求运行的东西都不能有点星点星, 并且将终止开关与它终止的东西分开。 给我发送你仍然不被允许谈论的事件, 在评论中,或者发送到 the daily diff dot dev。
2:53 这就是今天的 diff。 我是 Axrisi 的 Niko。 负责任地合并。
来源
- John Graham-Cumming, "Details of the Cloudflare outage on July 2, 2019" (Jul 12, 2019)blog.cloudflare.com
- Matthew Prince, "Cloudflare outage caused by bad software deploy (updated)" (Jul 2, 2019)blog.cloudflare.com
- Matthew Prince on X, Jul 2, 2019, 14:22 UTCx.com
- Matthew Prince on X, Jul 2, 2019, 14:36 UTC ("No evidence yet attack related")x.com
- Hacker News, Jul 2, 2019, 13:49 UTC — "Cloudflare Network Performance Issues" (631 points)news.ycombinator.com
- Hacker News, Jul 2, 2019 — "Cloudflare outage caused by bad software deploy" (348 points)news.ycombinator.com
- Hacker News, Jul 12, 2019 — "Details of the Cloudflare outage on July 2, 2019" (698 points)news.ycombinator.com
- TechCrunch, Jul 2, 2019techcrunch.com



