En regex fällde Cloudflare. 27 minuter.
2 juli 2019, 13:42 UTC: en ny regel för Cloudflares Web Application Firewall driftsätts i över 180 städer på cirka två sekunder.
2 juli 2019, 13:42 UTC: en ny regel för Cloudflares Web Application Firewall driftsätts i över 180 städer på cirka två sekunder. Det är en XSS-regel i simuleringsläge, så den blockerar ingenting, men den körs fortfarande på varje begäran, och den slutar med .*(?:.*=.*). PCRE backtrackar, varje CPU-kärna som hanterar HTTP träffar 100 %, och varje Cloudflare-proxyserverad webbplats returnerar 502 i 27 minuter; trafiken sjunker med 82 %. Nödstoppet sitter bakom Cloudflare Access, som sitter bakom Cloudflare. Postmortem, från Cloudflares egen redogörelse: CPU-skyddet som togs bort veckor tidigare i en refaktorering menad att spara CPU, proceduren som lät alla regler hoppa över staging, motorn utan komplexitetsgaranti, de 11 orsakerna och de 7 lösningarna. Dom över lösningen: SHIP IT.
Läs den skrivna upplagan (engelska) ↗
Vad den här videon täcker
- 13:31–13:42 UTC: PR sammanslagen, CI grön (inget CPU-test), Quicksilver skickar regeln till 180+ städer; WAF-regler hoppar över DOG → PIG → Canary-stegen
- 13:45–14:07: första sidan; CPU 100 % världsomspännande, trafik -82 %, 502:or överallt; den interna kontrollpanelen är bakom Cloudflare Access, som är nere; vissa uppgifter har gått ut; en sällan övad bypass
- 14:07–14:09: global WAF-terminering; trafik och CPU normal efter 27 minuter; 14:52 WAF tillbaka minus regeln
- 2 juli (15:50 UTC) och 12 juli: Cloudflare publicerar samma-dag-notisen och den fullständiga postmortem; CPU-skydd återinsatt, 3 868 regler omlästa, stegvisa utrullningar, övergång till en linjär-tid regex-motor
Översatt transkription
Översatt från den ursprungliga engelska berättelsen. Tillgängligt ljud och undertexter styrs av YouTube.
0:00 Ett reguljärt uttryck går live på varje Cloudflare-server samtidigt, och under de kommande tjugosju minuterna är webbplatserna bakom den en 502-sida, vilket, för en brandvägg, är den strängast möjliga inställningen. 2 juli 2019, 13:42 UTC. Cloudflare postar inom två timmar: inte en attack, en dålig utrullning, trafiken ner 82 procent. Tio dagar senare publicerar CTO John Graham-Cumming hela postmortem, regex inkluderad, och Hacker News ger den 698 poäng,
0:26 vilket för ett avbrott är en stående ovation. Hur det händer, varför det är möjligt, och vem som faktiskt får skulden. Detta är The Daily Diff, postmortem. 13:31. En pull request slås samman: en ny brandväggsregel mot cross-site scripting, i simuleringsläge, så den blockerar ingenting. 13:37, tester godkänns; ingen mäter CPU. 13:42, regeln skickas till 180 städer på två sekunder, eftersom WAF-regler hoppar över dog-, pig- och canary-stadierna som andra releaser får.
0:54 13:45, den första sidan. 13:49, Hacker News har en tråd om statussidan, som fortfarande säger att alla system är operativa. Regeln slutar i punkt-stjärna, punkt-stjärna, likamed, punkt-stjärna: vad som helst, sedan vad som helst, sedan ett likhetstecken. PCRE gissar girigt, misslyckas och backtrackar genom varje annan delning. x likamed x tar 23 steg. Tjugo x efter likamed: 555.
1:15 Tjugo x, inget likhetstecken: 4 067 steg för att hitta ingenting. Kör det på varje begäran och varje kärna är på hundra procent, gör ingenting, noggrant. Två skydd borde ha fångat det. CPU-gränsen på regler togs bort av misstag veckor tidigare, i en refaktorering menad att få WAF att använda mindre CPU. Och proceduren låter alla regler hoppa över staging, eftersom regler existerar för att stoppa live attacker; denna var ingen nödsituation, och den gick globalt ändå.
1:37 14:00, WAF identifieras; ingen attack. 14:02, någon föreslår den globala termineringen: en komponent, av, världsomspännande. Omkopplaren är bakom Cloudflare Access. Cloudflare Access är bakom Cloudflare. Vissa uppgifter har gått ut på grund av bristande användning, så det snabbaste nätverket på internet spenderar fem minuter på en bypass som ingen övat på. 14:07, döda. 14:09, trafik normal. git blame: en utrullning med en hastighet, global; ett CPU-skydd refaktoriserat bort av
2:04 misstag; en regex-motor utan övre gräns. Inte ingenjören som skrev regeln: postmortem listar elva orsaker och nämner ingen. Skadeutbredning: 27 minuter, 82 procent av trafiken, 100 procent CPU på varje kärna, i varje stad. Instrumentpanelen och API:et sitter bakom samma edge, så kunder kan inte ens stänga av det. Hacker News, under postmortem: de hade ett problem, använde ett reguljärt uttryck, nu har de två. Gammalt skämt. Kompilerar fortfarande.
2:28 Dom, postmortem: SHIP IT. CPU-skyddet är tillbaka, alla 3 868 regler läses för hand, regler går igenom staging, och motorn flyttar till en med linjär-tids garantier, publicerad av Ken Thompson 1968. Måndag: inget punkt-stjärna punkt-stjärna i något som körs per begäran, och håll nödstoppet borta från det det dödar. Skicka mig incidenten du fortfarande inte får prata om, i kommentarerna, eller på the daily diff dot dev.
2:53 Och det var dagens diff. Jag är Niko från Axrisi. Slå samman ansvarsfullt.
Källor
- 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



