Una regex ha messo offline Cloudflare. 27 minuti.
2 luglio 2019, 13:42 UTC: una nuova regola per il Web Application Firewall di Cloudflare va online in oltre 180 città in circa due secondi.
2 luglio 2019, 13:42 UTC: una nuova regola per il Web Application Firewall di Cloudflare va online in oltre 180 città in circa due secondi. È una regola XSS in modalità simulazione, quindi non blocca nulla, ma viene comunque eseguita su ogni richiesta e termina con .*(?:.*=.*). Il PCRE esegue il backtracking, ogni core della CPU che serve richieste HTTP raggiunge il 100%, e ogni sito con proxy Cloudflare restituisce 502 per 27 minuti; il traffico scende dell'82%. L'interruttore di emergenza si trova dietro Cloudflare Access, che si trova dietro Cloudflare. Post-mortem, dal resoconto di Cloudflare: la protezione della CPU rimossa settimane prima in un refactoring inteso a risparmiare CPU, la procedura che permetteva a qualsiasi regola di saltare lo staging, il motore senza garanzia di complessità, le 11 cause e le 7 soluzioni. Verdetto sulla soluzione: SHIP IT.
Leggi l'edizione scritta (inglese) ↗
Contenuto di questo video
- 13:31–13:42 UTC: PR unita, CI verde (nessun test CPU), Quicksilver spinge la regola in oltre 180 città; le regole WAF saltano le fasi DOG → PIG → Canary
- 13:45–14:07: prima pagina; CPU al 100% in tutto il mondo, traffico −82%, 502 ovunque; il pannello di controllo interno è dietro Cloudflare Access, che è offline; alcune credenziali sono scadute; un bypass raramente testato
- 14:07–14:09: terminazione globale del WAF; traffico e CPU normali dopo 27 minuti; 14:52 WAF di nuovo online meno la regola
- 2 luglio (15:50 UTC) e 12 luglio: Cloudflare pubblica la nota dello stesso giorno e il post-mortem completo; protezione CPU riaggiunta, 3.868 regole rilette, rollout a fasi, passaggio a un motore regex a tempo lineare
Trascrizione tradotta
Tradotto dalla narrazione originale inglese. L'audio e i sottotitoli disponibili sono controllati da YouTube.
0:00 Un'espressione regolare va online su ogni server Cloudflare contemporaneamente, e per i successivi ventisette minuti i siti che si trovano dietro sono una pagina 502, che, per un firewall, è l'impostazione più rigida possibile. 2 luglio 2019, 13:42 UTC. Cloudflare posta entro due ore: non un attacco, un deployment errato, traffico in calo dell'82 percento. Dieci giorni dopo il CTO John Graham-Cumming pubblica il post-mortem completo, regex inclusa, e Hacker News gli dà 698 punti,
0:26 che per un'interruzione è una standing ovation. Come succede, perché è possibile e chi effettivamente viene incolpato. Questo è The Daily Diff, post-mortem. 13:31. Una pull request si unisce: una nuova regola firewall contro lo scripting cross-site, in modalità simulazione, quindi non blocca nulla. 13:37, i test passano; nessuno misura la CPU. 13:42, la regola viene spedita a 180 città in due secondi, perché le regole WAF saltano le fasi dog, pig e canary che altre release ottengono.
0:54 13:45, la prima pagina. 13:49, Hacker News ha un thread sulla pagina di stato, che dice ancora che tutti i sistemi sono operativi. La regola termina con punto-stella, punto-stella, uguale, punto-stella: qualsiasi cosa, poi qualsiasi cosa, poi un segno di uguale. PCRE indovina avidamente, fallisce e fa il backtracking attraverso ogni altra divisione. x uguale x richiede 23 passaggi. Venti x dopo l'uguale: 555.
1:15 Venti x, nessun segno di uguale: 4.067 passaggi per non trovare nulla. Esegui questo su ogni richiesta e ogni core è al cento per cento, non facendo nulla, completamente. Due guardie avrebbero dovuto rilevarlo. Il limite di CPU sulle regole era stato rimosso per errore settimane prima, in un refactoring inteso a far sì che il WAF usasse meno CPU. E la procedura permette a qualsiasi regola di saltare lo staging, perché le regole esistono per fermare gli attacchi in tempo reale; questa non era un'emergenza, ed è comunque andata a livello globale.
1:37 14:00, il WAF è identificato; nessun attacco. 14:02, qualcuno propone la terminazione globale: un componente, spento, in tutto il mondo. L'interruttore è dietro Cloudflare Access. Cloudflare Access è dietro Cloudflare. Alcune credenziali sono scadute per disuso, quindi la rete più veloce su internet passa cinque minuti su un bypass che nessuno aveva testato. 14:07, kill. 14:09, traffico normale. git blame: un rollout a una velocità, globale; una protezione CPU eliminata per
2:04 errore; un motore regex senza limite superiore. Non l'ingegnere che ha scritto la regola: il post-mortem elenca undici cause e non nomina nessuno. Raggio di esplosione: 27 minuti, 82 percento del traffico, 100 percento di CPU su ogni core, in ogni città. La dashboard e l'API si trovano dietro lo stesso edge, quindi i clienti non possono nemmeno spegnerlo. Hacker News, sotto il post-mortem: avevano un problema, hanno usato un'espressione regolare, ora ne hanno due. Vecchia battuta. Si compila ancora.
2:28 Verdetto, post-mortem: SHIP IT. La protezione CPU è tornata, tutte le 3.868 regole vengono lette a mano, le regole passano attraverso lo staging, e il motore si sposta a uno con garanzie a tempo lineare, pubblicato da Ken Thompson nel 1968. Lunedì: nessun punto-stella punto-stella in qualsiasi cosa che venga eseguita per richiesta, e tenere l'interruttore di emergenza separato dalla cosa che uccide. Inviami l'incidente di cui non ti è ancora permesso parlare, nei commenti, o a the daily diff dot dev.
2:53 E questa è la differenza per oggi. Sono Niko di Axrisi. Unire responsabilmente.
Fonti
- 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



