Uma regex derrubou a Cloudflare. 27 minutos.
2 de julho de 2019, 13:42 UTC: uma nova regra para o Firewall de Aplicações Web da Cloudflare entra em funcionamento em mais de 180 cidades em cerca de dois segundos.
2 de julho de 2019, 13:42 UTC: uma nova regra para o Firewall de Aplicações Web da Cloudflare entra em funcionamento em mais de 180 cidades em cerca de dois segundos. É uma regra XSS em modo de simulação, por isso não bloqueia nada, mas continua a ser executada em cada pedido, e termina em .*(?:.*=.*). O PCRE retrocede, cada núcleo de CPU a servir pedidos HTTP atinge 100 %, e cada site com proxy Cloudflare devolve 502 durante 27 minutos; o tráfego cai 82 %. O "kill switch" está atrás do Cloudflare Access, que está atrás da Cloudflare. Postmortem, da própria análise da Cloudflare: o "CPU guard" removido semanas antes numa refatoração destinada a poupar CPU, o procedimento que permitia a qualquer regra ignorar a fase de teste, o motor sem garantia de complexidade, as 11 causas e as 7 correções. Veredito sobre a correção: SHIP IT.
Ler a edição escrita (Inglês) ↗
O que este vídeo aborda
- 13:31–13:42 UTC: PR unido, CI verde (sem teste de CPU), Quicksilver envia a regra para mais de 180 cidades; as regras WAF ignoram as fases DOG → PIG → Canary
- 13:45–14:07: primeira página; CPU 100 % em todo o mundo, tráfego −82 %, 502s em todo o lado; o painel de controlo interno está atrás do Cloudflare Access, que está em baixo; algumas credenciais expiraram; um "bypass" raramente treinado
- 14:07–14:09: término global do WAF; tráfego e CPU normais após 27 minutos; 14:52 WAF de volta menos a regra
- 2 de julho (15:50 UTC) e 12 de julho: Cloudflare publica a nota do mesmo dia e o postmortem completo; "CPU guard" readicionado, 3.868 regras relidas, implementações faseadas, transição para um motor regex de tempo linear
Transcrição traduzida
Traduzido da narração original em inglês. Áudio e legendas disponíveis são controlados pelo YouTube.
0:00 Uma expressão regular entra em funcionamento em todos os servidores da Cloudflare de uma só vez, e durante os próximos vinte e sete minutos os sites atrás dela são uma página 502, o que, para uma firewall, é a configuração mais rigorosa possível. 2 de julho de 2019, 13:42 UTC. A Cloudflare publica em duas horas: não é um ataque, uma má implementação, tráfego em baixa de 82 por cento. Dez dias depois, o CTO John Graham-Cumming publica o postmortem completo, regex incluída, e o Hacker News dá-lhe 698 pontos,
0:26 o que para uma interrupção é uma ovação de pé. Como acontece, por que é possível e quem realmente leva a culpa. Isto é The Daily Diff, postmortem. 13:31. Um "pull request" é unido: uma nova regra de firewall contra "cross-site scripting", em modo de simulação, por isso não bloqueia nada. 13:37, os testes passam; nenhum mede a CPU. 13:42, a regra é enviada para 180 cidades em dois segundos, porque as regras WAF ignoram as fases "dog", "pig" e "canary" que outras versões obtêm.
0:54 13:45, a primeira página. 13:49, o Hacker News tem um tópico na página de estado, que ainda diz que todos os sistemas estão operacionais. A regra termina em "dot-star", "dot-star", "equals", "dot-star": qualquer coisa, depois qualquer coisa, depois um sinal de igual. O PCRE tenta avidamente, falha e retrocede através de todas as outras divisões. x igual a x leva 23 passos. Vinte x's depois do igual: 555.
1:15 Vinte x's, sem sinal de igual: 4.067 passos para não encontrar nada. Execute isso em cada pedido e cada núcleo estará a cem por cento, sem fazer nada, completamente. Duas proteções deveriam ter detetado isso. O limite de CPU nas regras foi removido por engano semanas antes, numa refatoração destinada a fazer com que o WAF usasse menos CPU. E o procedimento permite que qualquer regra ignore a fase de testes, porque as regras existem para parar ataques em tempo real; esta não era uma emergência, e mesmo assim tornou-se global.
1:37 14:00, o WAF é identificado; sem ataque. 14:02, alguém propõe o término global: um componente, desligado, em todo o mundo. O "switch" está atrás do Cloudflare Access. O Cloudflare Access está atrás da Cloudflare. Algumas credenciais expiraram por desuso, então a rede mais rápida da internet passa cinco minutos num "bypass" que ninguém treinou. 14:07, matar. 14:09, tráfego normal. git blame: uma implementação com uma velocidade, global; uma proteção de CPU refatorada por
2:04 acidente; um motor de regex sem limite superior. Não o engenheiro que escreveu a regra: o postmortem lista onze causas e não nomeia ninguém. Raio de impacto: 27 minutos, 82 por cento do tráfego, 100 por cento de CPU em cada núcleo, em cada cidade. O "dashboard" e a API estão atrás da mesma "edge", então os clientes nem conseguem desligá-lo. Hacker News, sob o postmortem: eles tinham um problema, usaram uma expressão regular, agora têm dois. Piada antiga. Ainda compila.
2:28 Veredito, postmortem: SHIP IT. A proteção da CPU está de volta, todas as 3.868 regras são lidas manualmente, as regras passam por fases de teste, e o motor muda para um com garantias de tempo linear, publicado por Ken Thompson em 1968. Segunda-feira: sem "dot-star dot-star" em nada que corra por pedido, e mantenha o "kill switch" longe do que ele mata. Envie-me o incidente sobre o qual ainda não lhe é permitido falar, nos comentários, ou em the daily diff dot dev.
2:53 E essa é a diferença de hoje. Eu sou o Niko da Axrisi. Mesclar com responsabilidade.
Fontes
- 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



