+− THE DAILY DIFFdev & AI news
SHIP IT

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

  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

Vídeos relacionados