一個正規表達式擊潰了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。 負責任地合併。
來源
- 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



