Duas semanas após a última falha global, ontem a rede de entrega de conteúdo Cloudflare, que atende cerca de 20% de todo o tráfego web mundial, ficou parcialmente indisponível por 25 minutos. Durante o incidente, aproximadamente um terço das requisições através do Cloudflare resultou na devolução de uma página em branco com código de erro 500. Desta vez, a causa foi um problema no código em Lua, que passou anos sem ser notado, aplicado no sistema de filtragem de tráfego WAF (Web Application Firewall) para bloquear requisições maliciosas.

Para proteger os sistemas dos clientes de uma vulnerabilidade crítica (CVE-2025-55182) nos componentes de servidor do framework React, após a divulgação pública de um exploit, os engenheiros da Cloudflare implementaram uma proteção no nível do WAF. No entanto, a implementação não ocorreu sem problemas: ao aumentar o tamanho do buffer para verificar o tráfego no proxy,servidores, ficou claro que a ferramenta usada para testar o WAF não suportava o novo tamanho do buffer. Como essa ferramenta não afetava o tráfego, foi decidido desativá-la.
Para a desativação, os engenheiros utilizaram o subsistema 'killswitch' para mudar rapidamente a configuração e desativar manipuladores Lua específicos nos servidores proxy sem substituir as regras. Esse método de desativação é periodicamente utilizado para corrigir erros rapidamente e resulta na omissão na execução de parte do código Lua. No entanto, os engenheiros não consideraram que, para chamar a ferramenta de teste a ser desativada nas regras Lua, foi utilizado o método 'execute', que aciona um conjunto adicional de regras. Anteriormente, o modo 'killswitch' nunca havia sido utilizado com regras que contêm a chamada 'execute', e essa combinação não foi testada.
A aplicação do "killswitch" resultou na desativação do código que define um conjunto adicional de regras de teste, mas a chamada desse conjunto de regras através de "execute" permaneceu. Não havia verificações adicionais no código para a existência do objeto, e assumiu-se que, na presença da ação "execute" no conjunto de regras, o objeto "rule_result.execute" existiria obrigatoriamente. Como resultado, houve uma tentativa de executar o método "execute" para um objeto não inicializado, o que levou ao encerramento abrupto do manipulador com o erro "attempt to index field ‘execute’ (a nil value)". if rule_result.action == "execute" then rule_result.execute.results = ruleset_results[tonumber(rule_result.execute.results_index)] end
Fonte: opennet.ru
