# 一個正規表達式擊潰了Cloudflare。持續27分鐘。

Published: 2026-09-12

2019年7月2日，世界標準時間13:42：一條針對Cloudflare網絡應用程式防火牆的新規則在約兩秒鐘內於180多個城市上線。這是一條模擬模式下的XSS規則，因此它不會阻擋任何東西，但它仍然會在每個請求上運行，並且以.\*(?:.\*=.\*)結尾。PCRE回溯，每個服務HTTP的CPU核心達到100%，每個透過Cloudflare代理的網站都會在27分鐘內返回502；流量下降82%。終止開關位於Cloudflare Access之後，而Cloudflare Access又位於Cloudflare之後。事後分析，來自Cloudflare自己的報告：數週前在一次旨在節省CPU的重構中移除了CPU保護，允許任何規則跳過測試階段的程序，沒有複雜度保證的引擎，11個原因和7個修復。關於修復的判斷：SHIP IT。

Canonical: https://thedailydiff.dev/zh-HK/video/2026-09-12-cloudflare-regex/

## 本影片涵蓋的內容

- 世界標準時間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日（世界標準時間15:50）和7月12日：Cloudflare發布了當日說明和完整的事後分析；重新添加了CPU保護，重新讀取了3,868條規則，分階段推出，轉向線性時間的正規表達式引擎

## 翻譯的文字記錄

從英文原文旁白翻譯。可用的音頻和字幕由 YouTube 控制。

0:00 一個正規表達式同時在每個Cloudflare伺服器上線， 在接下來的二十七分鐘裡，其背後的網站都顯示502頁面， 對於防火牆來說，這是最嚴格的設定。 2019年7月2日，世界標準時間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步才找不到任何東西。 在每個請求上運行，每個核心都達到100%， 徹底地什麼也沒做。 兩個防護措施本應能捕捉到它。 規則的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年發布。 星期一：任何在每個請求上運行的東西都不能有「點星點星」， 並且讓終止開關遠離它所終止的對象。 將你仍不被允許談論的事件發送給我， 在評論中，或發送至thedailydiff.dev。

2:53 這就是今天的diff。 我是Axrisi的Niko。 負責任地合併。

## 來源

- [John Graham-Cumming, "Details of the Cloudflare outage on July 2, 2019" (Jul 12, 2019)](https://blog.cloudflare.com/details-of-the-cloudflare-outage-on-july-2-2019/) — blog.cloudflare.com
- [Matthew Prince, "Cloudflare outage caused by bad software deploy (updated)" (Jul 2, 2019)](https://blog.cloudflare.com/cloudflare-outage/) — blog.cloudflare.com
- [Matthew Prince on X, Jul 2, 2019, 14:22 UTC](https://x.com/eastdakota/status/1146061591143538688) — x.com
- [Matthew Prince on X, Jul 2, 2019, 14:36 UTC ("No evidence yet attack related")](https://x.com/eastdakota/status/1146065231270907907) — x.com
- [Hacker News, Jul 2, 2019, 13:49 UTC — "Cloudflare Network Performance Issues" (631 points)](https://news.ycombinator.com/item?id=20334924) — news.ycombinator.com
- [Hacker News, Jul 2, 2019 — "Cloudflare outage caused by bad software deploy" (348 points)](https://news.ycombinator.com/item?id=20336332) — news.ycombinator.com
- [Hacker News, Jul 12, 2019 — "Details of the Cloudflare outage on July 2, 2019" (698 points)](https://news.ycombinator.com/item?id=20421538) — news.ycombinator.com
- [TechCrunch, Jul 2, 2019](https://techcrunch.com/2019/07/02/a-cloudflare-outage-is-impacting-sites-everywhere/) — techcrunch.com
