Análise pós-incidente da indisponibilidade da Cloudflare em 18 de novembro de 2025
(blog.cloudflare.com)- Em 18 de novembro de 2025, às 11h20 (UTC), a função central de entrega de tráfego da rede da Cloudflare foi interrompida, fazendo com que usuários do mundo todo vissem páginas de erro
- A causa foi o crescimento anormal do arquivo de
featuredo sistema de Bot Management devido a uma mudança de permissões no banco de dados, sem relação com ataque cibernético - Esse aumento no tamanho do arquivo fez com que o software de roteamento de tráfego excedesse seu limite e falhasse, gerando erros HTTP 5xx em larga escala
- Por volta de 14h30, a distribuição do arquivo problemático foi interrompida e ele foi substituído pela versão anterior estável, restaurando a entrega central de tráfego; todos os serviços foram normalizados às 17h06
- A Cloudflare avaliou o caso como a pior indisponibilidade desde 2019 e está avançando com medidas para evitar recorrência, como validação reforçada de arquivos de configuração e adoção de um kill switch global
Visão geral da indisponibilidade
- Por volta de 11h20, ocorreu uma falha na entrega central de tráfego na rede da Cloudflare, e os usuários passaram a ver páginas internas de erro da Cloudflare
- A causa não foi ataque cibernético nem ação maliciosa; o gatilho direto foi uma mudança de permissões no sistema de banco de dados
- Com essa mudança, o tamanho do arquivo de
featureusado pelo sistema de Bot Management dobrou e foi distribuído por toda a rede - Durante a leitura desse arquivo pelo software de roteamento de tráfego, o limite de tamanho do arquivo foi excedido, provocando erro no sistema
- No início, o problema foi confundido com um grande ataque DDoS, mas, após a identificação da causa, a recuperação avançou com a substituição pelo arquivo estável anterior
Evolução e impacto da indisponibilidade
- Antes das 11h20, a taxa de erros 5xx estava em nível normal, mas depois disso houve disparo nos erros devido à distribuição do arquivo de
featureincorreto - Em alguns nós do cluster de banco de dados ClickHouse, resultados incorretos de consulta passaram a ser gerados a cada 5 minutos, e arquivos normais e anormais eram distribuídos alternadamente, fazendo o sistema repetir ciclos de recuperação e falha
- A partir de 14h30, a geração do arquivo problemático foi interrompida e um arquivo correto foi inserido manualmente, com recuperação após reinicialização do proxy principal
- Às 17h06, todos os serviços voltaram ao normal
| Serviço | Impacto |
|---|---|
| Core CDN e serviços de segurança | Ocorrência de erros HTTP 5xx |
| Turnstile | Falha no carregamento, impossibilidade de login |
| Workers KV | Forte aumento de erros 5xx por falha de gateway |
| Dashboard | Impossibilidade de login devido à falha do Turnstile |
| Email Security | Queda temporária na precisão da detecção de spam, falha em parte das movimentações automáticas |
| Access | Muitas falhas de autenticação, com sessões existentes mantidas |
- Durante a indisponibilidade, houve aumento na latência de resposta do CDN, causado pelo pico no uso de CPU do sistema de depuração
Causa da indisponibilidade: sistema de Bot Management
- O módulo de Bot Management da Cloudflare usa modelos de machine learning para gerar uma pontuação de bot para cada requisição
- O arquivo de configuração de
featureusado como entrada do modelo é distribuído para toda a rede a cada poucos minutos para responder às ameaças mais recentes - Devido a uma mudança no comportamento de consultas do ClickHouse, muitas linhas de
featureduplicadas foram incluídas, aumentando o tamanho do arquivo - Isso fez com que o módulo de Bot Management falhasse e retornasse respostas HTTP 5xx, afetando também Workers KV e Access
- No novo mecanismo de proxy FL2, ocorreram erros 5xx; na versão antiga FL, a pontuação de bot foi definida como 0, aumentando falsos positivos
Mudança no comportamento de consultas do ClickHouse
- Às 11h05, foi implantada uma mudança nas permissões de acesso ao banco de dados do ClickHouse
- Antes, era possível consultar apenas os metadados do banco
default, mas, após a mudança, os metadados do bancor0também passaram a ficar expostos - A consulta de geração do arquivo de
featuredo Bot Management foi executada sem filtro por nome do banco de dados, resultando no retorno de colunas duplicadas - Com isso, o número de linhas no arquivo de
featuremais que dobrou, ultrapassando o limite do sistema
Pré-alocação de memória e panic do sistema
- O módulo de Bot Management faz pré-alocação de memória com limite máximo de 200
featuresde machine learning - Como o arquivo incorreto passou a incluir mais de 200
features, ocorreu um panic no código Rust, com a mensagem
thread fl2_worker_thread panicked: called Result::unwrap() on an Err value - Isso levou à ocorrência em massa de erros HTTP 5xx
Outros impactos e processo de recuperação
- Workers KV e Access dependiam do proxy principal, ampliando o impacto da indisponibilidade
- Às 13h04, foi aplicado um patch para que o Workers KV contornasse o proxy, reduzindo a taxa de erros
- O Dashboard ficou inacessível para login devido à dependência de Turnstile e Workers KV
- Houve duas quedas de disponibilidade: 11h30–13h10 e 14h40–15h30
- O backlog e as requisições de retry aumentaram a latência, com recuperação por volta de 15h30
- Após 14h30, a maior parte dos serviços voltou ao normal; a recuperação completa ocorreu às 17h06
Medidas para evitar recorrência
- Reforço da validação de entrada de arquivos de configuração gerados pela Cloudflare
- Ampliação do kill switch global de funcionalidades
- Prevenção de esgotamento de recursos do sistema causado por relatórios de erro
- Revisão das condições de erro em todo o módulo de proxy principal
Resumo da linha do tempo (UTC)
| Horário | Estado | Descrição |
|---|---|---|
| 11h05 | Normal | Implantação da mudança de controle de acesso ao banco de dados |
| 11h28 | Início do impacto | Primeiro erro observado no tráfego de clientes |
| 11h32–13h05 | Investigação em andamento | Análise da causa dos erros no Workers KV e tentativas de mitigação |
| 13h05 | Impacto reduzido | Aplicação de bypass para Workers KV e Access |
| 13h37 | Foco na recuperação | Preparação do rollback do arquivo de configuração do Bot Management |
| 14h24 | Distribuição do arquivo problemático interrompida | Teste do arquivo correto concluído |
| 14h30 | Principal impacto resolvido | Distribuição global do arquivo correto e início da recuperação dos serviços |
| 17h06 | Recuperação completa | Normalização concluída de todos os serviços |
Conclusão
- Esta indisponibilidade ocorreu pela interação entre a lógica de geração do arquivo de configuração do Bot Management e uma mudança nas permissões do banco de dados
- A Cloudflare a classificou como a interrupção de rede mais grave desde 2019
- A empresa pretende avançar com melhorias estruturais para reforçar a resiliência do sistema e fortalecer mecanismos automatizados de defesa
8 comentários
Problemas relacionados a arquivos de configuração acontecem em qualquer lugar.
Quando a Cloudflare saiu do ar e todo tipo de serviço parou, foi um inferno mesmo..
O documento de análise da causa foi publicado bem rápido, né?
Aliás, o autor deste texto era o CEO.
Opiniões no Hacker News
Isso é uma história de incidente de
.unwrap()de vários milhões de dólaresChamar
.unwrap()em um caminho central da infraestrutura da internet equivale a declarar: “isso nunca vai falhar; se falhar, mata a thread imediatamente”O compilador de Rust força a possibilidade de falha a ser expressa explicitamente, mas eles escolheram o pânico em vez de tratar isso com elegância
Parece um caso clássico do antipadrão “parse, don’t validate”
.unwrap(). Talvez porque ele apareça com frequência em código de exemploEm código de produção real,
.unwrap()e.expect()deveriam ser revisados como se fossempanicSe você usa
.unwrap()em código de produção, deveria ser obrigatório adicionar um comentário de “INFALLIBILITY”, e isso pode ser imposto comclippy::unwrap_usedNão foi apenas por causa do
.unwrap(), mas porque a consulta não distinguia o banco de dados, o que aumentou o payload, e porque o ClickHouse expôs mais bancos de dadosEm vez de concluir simplesmente que “foi por causa do unwrap”, acho mais importante melhorar o design para que um kill switch global ou algo semelhante não sobrecarregue os recursos do sistema
A camada FL2 deveria capturar o pânico de cada componente, mas fail-open nem sempre é melhor
É preciso adicionar lógica para decidir explicitamente, no nível do FL2, se um pânico deve ser capturado e tratado
Em um sistema com sharding, também fico curioso por que não houve rollout gradual e monitoramento
!e unwrap explícito com?Eu quase nunca uso unwrap implícito. Mesmo quando o valor é garantido, sempre trato explicitamente
Por exemplo, defino
@IBOutlet weak var someView?em vez de@IBOutlet weak var someView!É uma abordagem meio belt & suspenders
É realmente impressionante terem publicado o post mortem menos de 24 horas após a falha
Na maioria das grandes empresas, seria quase impossível publicar o código por causa da revisão de vários stakeholders
Ao ler a explicação da Cloudflare sobre a falha, fiquei me perguntando: “por que a recuperação demorou tanto?”
Entendi a causa da falha, mas se a maior parte da rede caiu, parece que reverter a alteração de configuração mais recente deveria ser a prioridade número 1
Claro, isso fica óbvio olhando depois, mas foi impressionante terem começado a investigação em apenas 7 minutos
Esse caso parece parecido com o incidente da CrowdStrike
Um arquivo de configuração gerado automaticamente quebrou o software e se espalhou pela rede inteira
Entendo a necessidade de fazer deploy rápido, mas isso mostrou a ausência de rollout gradual e estratégia de rollback
Olhando para o plano de melhorias futuras anunciado pela Cloudflare, há itens como
mas deploy canário ou rollout gradual de configuração não aparece
Um switch global pode ser perigoso e, com um único bug, pode parar o sistema inteiro
Também fico em dúvida sobre por que usaram o ClickHouse como repositório de feature flags. A documentação de deduplicação do ClickHouse também menciona riscos
Se houvesse um mapeamento de dependências entre serviços, seria muito mais fácil rastrear a causa
Deploy de código é tratado com cuidado, mas deploy de configuração não. É preciso encarar configuração como código
Achei interessante a parte em que a página de status caiu e isso levou a acharem que era um ataque
Dizem que ela é totalmente separada da infraestrutura da Cloudflare, mas não há explicação de por que caiu junto
Eu integrei o Turnstile com uma estratégia fail-open, e isso ajudou nesta falha
Se o JS não carrega, permito o envio com um token fictício e, mesmo quando a validação falha no backend, trato como fail-open
Alguns usuários ainda foram bloqueados, mas o impacto geral foi reduzido
É uma abordagem possível porque existem outros mecanismos de mitigação de bots
Mas isso parece funcionar apenas quando não se trata de um ataque direcionado
Fico me perguntando por que permitiram
.unwrap()no código da CloudflareNo mínimo, deveriam ter usado
expect("isso nunca deveria acontecer")A filosofia de tratar erros como valores existe justamente para evitar esse tipo de problema, e também teria tornado o diagnóstico muito mais fácil
Em código que inclui chamadas de rede, há possibilidades demais de falha
Durante o desenvolvimento eu uso
.unwrap(), mas em produção às vezes deixoexpect()mesmo assim, porque há casos em que simplesmente não existe como continuarA verdadeira lição é que funções demais dependem de poucos players
A dinâmica de vencedores levam tudo está se aprofundando, e a resiliência do sistema está diminuindo
Claro que eles conquistaram essa posição por mérito, mas parece exagerado esperar que a internet esteja sempre “funcionando normalmente”
A ideia de que “com Rust tudo é seguro” é exagerada
Em qualquer linguagem, se você usar errado, é como apontar a arma para o próprio pé
Até uma empresa do porte da CF usa
.unwrap(), caramba. Como é que esse código foi parar em produção?Não parece que o problema seja o
unwrap.O problema fundamental é a consulta incorreta.
Mas também acho que foi um problema terem pulado a validação do problema com
unwrap.Mesmo que surgisse um problema internamente, se tivessem tratado o erro, o tráfego não teria caído.