+− THE DAILY DIFFdev & AI news
SHIP IT

Isang regex ang nagpabagsak sa Cloudflare. 27 minuto.

Hulyo 2, 2019, 13:42 UTC: isang bagong panuntunan para sa Web Application Firewall ng Cloudflare ay nagiging aktibo sa mahigit 180 lungsod sa loob ng humigit-kumulang dalawang segundo.

Hulyo 2, 2019, 13:42 UTC: isang bagong panuntunan para sa Web Application Firewall ng Cloudflare ay nagiging aktibo sa mahigit 180 lungsod sa loob ng humigit-kumulang dalawang segundo. Ito ay isang panuntunan ng XSS sa simulate mode, kaya wala itong binablock, ngunit tumatakbo pa rin ito sa bawat kahilingan, at nagtatapos ito sa .*(?:.*=.*). Ang PCRE ay nagba-backtrack, ang bawat CPU core na nagse-serve ng HTTP ay tumatama sa 100 %, at ang bawat Cloudflare-proxied site ay nagbabalik ng 502 sa loob ng 27 minuto; bumaba ang traffic ng 82 %. Ang kill switch ay nasa likod ng Cloudflare Access, na nasa likod ng Cloudflare. Postmortem, mula sa sariling sulat ng Cloudflare: ang CPU guard na tinanggal ilang linggo na ang nakaraan sa isang refactor na nilayon upang makatipid ng CPU, ang pamamaraang nagpapahintulot sa anumang panuntunan na laktawan ang staging, ang engine na walang garantiya sa kumplikadong, ang 11 sanhi at ang 7 ayos. Hatol sa ayos: SHIP IT.

Basahin ang nakasulat na edisyon (English) ↗

Ang sakop ng video na ito

  • 13:31–13:42 UTC: PR na-merge, CI green (walang CPU test), Quicksilver nagtulak ng panuntunan sa 180+ lungsod; WAF rules nilaktawan ang DOG → PIG → Canary stages
  • 13:45–14:07: unang pahina; CPU 100 % sa buong mundo, traffic −82 %, 502s sa lahat ng dako; ang internal control panel ay nasa likod ng Cloudflare Access, na down; ilang credentials ay nag-expire; isang bihirang nadrill na bypass
  • 14:07–14:09: global WAF terminate; traffic at CPU normal pagkatapos ng 27 minuto; 14:52 WAF bumalik minus ang panuntunan
  • Hul 2 (15:50 UTC) at Hul 12: Cloudflare nag-publish ng same-day note at ang buong postmortem; CPU guard muling idinagdag, 3,868 panuntunan muling binasa, staged rollouts, lumipat sa isang linear-time regex engine

Isinaling transcript

Isinalin mula sa orihinal na salaysay sa English. Ang available na audio at mga caption ay kinokontrol ng YouTube.

0:00 Isang regular na expression ang naging aktibo sa bawat Cloudflare server nang sabay-sabay, at sa loob ng susunod na dalawampu't pitong minuto ang mga site sa likod nito ay isang 502 na pahina, na, para sa isang firewall, ay ang pinakamahigpit na posibleng setting. Hulyo 2, 2019, 13:42 UTC. Nag-post ang Cloudflare sa loob ng dalawang oras: hindi atake, isang masamang deploy, bumaba ang trapiko ng 82 porsiyento. Sampung araw pagkaraan, inilathala ng CTO na si John Graham-Cumming ang buong postmortem, kasama ang regex, at binigyan ito ng Hacker News ng 698 puntos,

0:26 na para sa isang outage ay isang standing ovation. Paano ito nangyari, bakit ito posible, at sino talaga ang dapat sisihin. Ito ang The Daily Diff, postmortem. 13:31. Isang pull request ang nag-merge: isang bagong firewall rule laban sa cross-site scripting, sa simulate mode, kaya wala itong binablock. 13:37, pumasa ang mga test; walang sumusukat sa CPU. 13:42, ang panuntunan ay naipadala sa 180 lungsod sa loob ng dalawang segundo, dahil nilaktawan ng WAF rules ang dog, pig at canary stages na nakukuha ng ibang release.

0:54 13:45, ang unang pahina. 13:49, may thread ang Hacker News sa status page, na nagsasabi pa rin na lahat ng sistema ay operational. Nagtatapos ang panuntunan sa dot-star, dot-star, equals, dot-star: kahit ano, tapos kahit ano, tapos isang equals sign. Hulaan ng PCRE nang mapanibughuin, nabigo, at nag-backtrack sa bawat iba pang split. Ang x equals x ay tumatagal ng 23 hakbang. Dalawampung x pagkatapos ng equals: 555.

1:15 Dalawampung x, walang equals sign: 4,067 hakbang upang walang makita. Patakbuhin iyan sa bawat kahilingan at bawat core ay nasa isandaang porsiyento, walang ginagawa, nang lubusan. Dalawang bantay ang dapat na nakahuli dito. Ang limitasyon ng CPU sa mga panuntunan ay tinanggal nang hindi sinasadya ilang linggo na ang nakalipas, sa isang refactor na nilayon upang mas kaunting CPU ang gamitin ng WAF. At pinapayagan ng pamamaraan ang anumang panuntunan na laktawan ang staging, dahil ang mga panuntunan ay umiiral upang pigilan ang mga live na atake; hindi ito isang emergency, at naging pandaigdigan pa rin ito.

1:37 14:00, natukoy ang WAF; walang atake. 14:02, may nagmungkahi ng pandaigdigang pagtatapos: isang bahagi, patay, sa buong mundo. Ang switch ay nasa likod ng Cloudflare Access. Ang Cloudflare Access ay nasa likod ng Cloudflare. Ang ilang credentials ay nag-expire mula sa hindi paggamit, kaya ang pinakamabilis na network sa internet ay gumugol ng limang minuto sa isang bypass na hindi sinanay ng sinuman. 14:07, patayin. 14:09, normal na ang trapiko. git blame: isang rollout na may isang bilis, pandaigdigan; isang CPU guard na na-refactor nang

2:04 hindi sinasadya; isang regex engine na walang upper bound. Hindi ang engineer na nagsulat ng panuntunan: ang postmortem ay naglilista ng labing-isang sanhi at walang pinangalanan. Saklaw ng pinsala: 27 minuto, 82 porsiyento ng trapiko, 100 porsiyentong CPU sa bawat core, sa bawat lungsod. Ang dashboard at API ay nasa likod ng parehong edge, kaya hindi man lang maaaring i-off ng mga customer ito. Hacker News, sa ilalim ng postmortem: mayroon silang isang problema, gumamit ng regular expression, ngayon mayroon silang dalawa. Lumang biro. Nagko-compile pa rin.

2:28 Hatol, postmortem: SHIP IT. Bumalik ang CPU guard, lahat ng 3,868 panuntunan ay binabasa nang mano-mano, dumadaan ang mga panuntunan sa staging, at ang engine ay lumipat sa isang may linear-time guarantees, na inilathala ni Ken Thompson noong 1968. Lunes: walang dot-star dot-star sa anumang tumatakbo sa bawat kahilingan, at ilayo ang kill switch sa bagay na pinapatay nito. Ipadala sa akin ang insidente na hindi mo pa rin pinapayagang pag-usapan, sa mga komento, o sa the daily diff dot dev.

2:53 At iyan ang diff para ngayon. Ako si Niko mula sa Axrisi. Mag-merge nang may pananagutan.

Mga Pinagmulan

  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

Mga kaugnay na video