Dopo due settimane dall'ultimo blackout globale, ieri la rete di distribuzione dei contenuti Cloudflare, che gestisce circa il 20% di tutto il traffico web mondiale, è stata parzialmente non disponibile per 25 minuti. Durante l'incidente, circa un terzo delle richieste tramite Cloudflare restituiva una pagina vuota con codice di errore 500. Questa volta, la causa è stata un problema nel codice Lua, rimasto inosservato per anni, utilizzato nel sistema di filtraggio del traffico WAF (Web Application Firewall) per bloccare le richieste dannose.

Per proteggere i sistemi dei client da una vulnerabilità critica (CVE-2025-55182) nei componenti server del framework React, dopo la pubblicazione di un exploit, gli ingegneri di Cloudflare hanno implementato misure di sicurezza a livello WAF. Tuttavia, l'implementazione non è stata priva di problemi: durante questo processo, è stato aumentato il dimensionamento del buffer per verificare il traffico sul proxy-server, ma si è scoperto che gli strumenti utilizzati per testare il WAF non supportano il nuovo dimensionamento del buffer. Poiché questo strumento non influisce sul traffico, si è deciso di disattivarlo.
Per disattivare, gli ingegneri hanno utilizzato il sottomodulo "killswitch" per modificare rapidamente la configurazione e disattivare singoli gestori Lua sui server proxy senza sostituire le regole. Questo metodo di disattivazione delle regole viene talvolta utilizzato per risolvere rapidamente problemi, ma causa l'omissione dell'esecuzione di una parte del codice Lua. Gli ingegneri non hanno considerato che per chiamare l'infrastruttura di test disattivata nelle regole Lua si utilizzava il metodo "execute", il quale avvia un ulteriore set di regole. In passato, la modalità "killswitch" non era mai stata utilizzata con regole che prevedono la chiamata di "execute", e questa combinazione non è stata testata.
L'uso del «killswitch» ha disattivato il codice per la definizione di un ulteriore set di regole di test, ma la chiamata a questo set di regole tramite «execute» è rimasta. Nel codice non erano presenti controlli aggiuntivi per l'esistenza dell'oggetto e si presumeva che se nel set di regole l'azione «execute» era presente, l'oggetto «rule_result.execute» esistesse necessariamente. Di conseguenza, si è tentato di eseguire il metodo «execute» su un oggetto non inizializzato, il che ha portato al crash del gestore con l'errore «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
