Regex je srušio Cloudflare. 27 minuta.
2.
2. jula 2019, 13:42 UTC: jedno novo pravilo za Cloudflare-ov Web Application Firewall postaje aktivno u više od 180 gradova za oko dvije sekunde. To je XSS pravilo u simulacionom režimu, tako da ništa ne blokira, ali se ipak pokreće na svakom zahtjevu, a završava se sa .*(?:.*=.*). PCRE se vraća unazad, svako CPU jezgro koje opslužuje HTTP dostiže 100%, i svaka stranica koju je proxy-ovao Cloudflare vraća 502 tokom 27 minuta; promet pada za 82%. Prekidač za isključenje se nalazi iza Cloudflare Access-a, koji se nalazi iza Cloudflare-a. Postmortem, iz Cloudflare-ovog vlastitog izvještaja: CPU zaštita uklonjena sedmicama ranije u refaktorisanju namijenjenom za uštedu CPU-a, procedura koja je omogućila bilo kojem pravilu da preskoči fazu testiranja, mehanizam bez garancije složenosti, 11 uzroka i 7 rješenja. Presuda o popravci: SHIP IT.
Pročitajte pisano izdanje (engleski) ↗
Šta ovaj video pokriva
- 13:31–13:42 UTC: PR spojen, CI zelen (bez CPU testa), Quicksilver gura pravilo u više od 180 gradova; WAF pravila preskaču DOG → PIG → Canary faze
- 13:45–14:07: prva stranica; CPU 100% širom svijeta, promet -82%, 502s svuda; interna kontrolna ploča je iza Cloudflare Accessa, koji je isključen; neki akreditivi su istekli; rijetko vježbani zaobilazni put
- 14:07–14:09: globalno WAF isključenje; promet i CPU normalni nakon 27 minuta; 14:52 WAF se vraća bez pravila
- 2. jula (15:50 UTC) i 12. jula: Cloudflare objavljuje bilješku istog dana i potpuni postmortem; CPU zaštita ponovo dodana, 3.868 pravila ponovo pročitano, fazna implementacija, prelazak na regex mehanizam s linearnim vremenom
Prevedeni transkript
Prevedeno iz originalne engleske naracije. Dostupan zvuk i titlovi kontroliše YouTube.
0:00 Jedan regularni izraz postaje aktivan na svakom Cloudflare serveru istovremeno, i sljedećih dvadeset sedam minuta stranice iza njega su stranica 502, što je, za firewall, najstroža moguća postavka. 2. jul 2019. godine, 13:42 UTC. Cloudflare objavljuje u roku od dva sata: nije napad, loša implementacija, promet smanjen za 82 posto. Deset dana kasnije tehnički direktor John Graham-Cumming objavljuje potpuni postmortem, uključujući regex, a Hacker News mu daje 698 bodova,
0:26 što je za prekid rada stojeće ovacije. Kako se to događa, zašto je to moguće i ko je zapravo kriv. Ovo je The Daily Diff, postmortem. 13:31. Spaja se pull request: jedno novo pravilo firewall-a protiv cross-site skriptovanja, u simulacijskom modu, tako da ništa ne blokira. 13:37, testovi prolaze; nijedan ne mjeri CPU. 13:42, pravilo se šalje u 180 gradova za dvije sekunde, jer WAF pravila preskaču faze "pas", "svinja" i "kanarinac" koje dobivaju druga izdanja.
0:54 13:45, prva stranica. 13:49, Hacker News ima temu o stranici statusa, koja i dalje kaže da su svi sistemi operativni. Pravilo završava s tačka-zvijezda, tačka-zvijezda, jednako, tačka-zvijezda: bilo šta, zatim bilo šta, pa znak jednakosti. PCRE pretpostavlja pohlepno, ne uspijeva, i vraća se kroz svaki drugi razdvojeni dio. x jednako x traje 23 koraka. Dvadeset x-ova nakon znaka jednakosti: 555.
1:15 Dvadeset x-ova, bez znaka jednakosti: 4.067 koraka da se ništa ne pronađe. Pokrenite to na svakom zahtjevu i svako jezgro je na sto posto, ne radeći ništa, temeljito. Dva čuvara su to trebala uhvatiti. CPU ograničenje na pravilima je greškom uklonjeno sedmicama ranije, u refaktorisanju namijenjenom da WAF koristi manje CPU-a. A procedura dopušta bilo kojem pravilu da preskoči fazu testiranja, jer pravila postoje da zaustave žive napade; ovaj nije bio hitan, a ipak je otišao globalno.
1:37 14:00, WAF je identificiran; nema napada. 14:02, neko predlaže globalno gašenje: jedna komponenta, isključena, širom svijeta. Prekidač je iza Cloudflare Accessa. Cloudflare Access je iza Cloudflare-a. Neki akreditivi su istekli zbog neupotrebe, tako da najbrža mreža na internetu provodi pet minuta na zaobilaznom putu koji niko nije vježbao. 14:07, ubij. 14:09, promet normalan. git blame: implementacija s jednom brzinom, globalna; CPU zaštita refaktorisana
2:04 greškom; regex mehanizam bez gornje granice. Nije inženjer koji je napisao pravilo: postmortem navodi jedanaest uzroka i nikoga ne imenuje. Radijus eksplozije: 27 minuta, 82 posto prometa, 100 posto CPU-a na svakom jezgru, u svakom gradu. Kontrolna tabla i API nalaze se iza istog ruba, tako da korisnici ne mogu ni isključiti ga. Hacker News, ispod postmortema: imali su jedan problem, koristili su regularni izraz, sada ih imaju dva. Stara šala. Još uvijek se kompajlira.
2:28 Presuda, postmortem: SHIP IT. CPU zaštita je vraćena, svih 3.868 pravila se čitaju ručno, pravila prolaze kroz fazu testiranja, a mehanizam se prebacuje na onaj s linearnim vremenom garancije, objavljen od strane Kena Thompsona 1968. godine. Ponedjeljak: bez tačka-zvijezda tačka-zvijezda u bilo čemu što se pokreće po zahtjevu, i držite prekidač za isključenje podalje od stvari koju ubija. Pošaljite mi incident o kojem još uvijek ne smijete govoriti, u komentarima, ili na the daily diff dot dev.
2:53 I to je diff za danas. Ja sam Niko iz Axrisija. Spajajte odgovorno.
Izvori
- 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



