+− THE DAILY DIFFdev & AI news
SHIP IT

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

2019年7月2日,世界標準時間13:42:一條針對Cloudflare網絡應用程式防火牆的新規則在約兩秒鐘內於180多個城市上線。

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。

閱讀書面版本(英文) ↗

本影片涵蓋的內容

  • 世界標準時間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。 負責任地合併。

來源

  1. John Graham-Cumming, "Details of the Cloudflare outage on July 2, 2019" (Jul 12, 2019)blog.cloudflare.com
  2. Matthew Prince, "Cloudflare outage caused by bad software deploy (updated)" (Jul 2, 2019)blog.cloudflare.com
  3. Matthew Prince on X, Jul 2, 2019, 14:22 UTCx.com
  4. Matthew Prince on X, Jul 2, 2019, 14:36 UTC ("No evidence yet attack related")x.com
  5. Hacker News, Jul 2, 2019, 13:49 UTC — "Cloudflare Network Performance Issues" (631 points)news.ycombinator.com
  6. Hacker News, Jul 2, 2019 — "Cloudflare outage caused by bad software deploy" (348 points)news.ycombinator.com
  7. Hacker News, Jul 12, 2019 — "Details of the Cloudflare outage on July 2, 2019" (698 points)news.ycombinator.com
  8. TechCrunch, Jul 2, 2019techcrunch.com

相關影片

postmortem · zh-HK · 2026年9月19日

Google Cloud 在空白欄位當機。三小時。

一個帶有幾個空白欄位的策略行觸發了空指標,Google Cloud 立即在所有區域當機 — 然後 Cloudflare 也隨之故障。2025 年 6 月 12 日,世界標準時間 17:49:Service Control,一個批准所有 Google Cloud API 請求的二進位檔案,讀取了一個帶有「非預期空白欄位」的配額策略變更,觸發了兩週前發布但沒有空值檢查和功能旗標的程式碼路徑,並在所有區

2:57 ↗
postmortem · zh-HK · 2026年9月16日

Facebook從互聯網上刪除了自己。長達六小時。

Facebook將自己的地址從互聯網上移除,當其工程師趕來恢復時,門禁讀取器也失靈了,因為它們也依賴Facebook運作。2021年10月4日,UTC時間15:40:一個例行的骨幹網絡維護指令導致Facebook所有數據中心之間的連接中斷;旨在阻止此類操作的審核工具存在錯誤;Facebook的名稱伺服器由於無法連接數據中心,依設計撤回了自己的BGP路由——於是facebook.com、Instag

3:01 ↗
postmortem · zh-HK · 2026年9月22日

重啟令 Telstra 倒退回 2006 年。九百萬部電話。

墨爾本的一名工程師在凌晨 2 時 50 分重啟計時機箱,到早餐時,澳洲最大的流動網絡竟以為是 2006 年 11 月。2026 年 7 月 8 日:Telstra NTP 機箱中的 GPS 卡在更換電源期間重啟,其韌體從未有 GPS 週數滾動更新,因此它選擇了舊的紀元,倒退了 1,024 週。由於 2025 年 10 月的變通方法使該卡成為網絡唯一的 stratum-1 來源 — 以及 2020

3:15 ↗