Chyba v Cloudflare kvůli problému v kódu napsaném v jazyce Lua

Po dvou týdnech od posledního globálního výpadku byla včera na 25 minut částečně nedostupná síť Cloudflare, která zajišťuje přibližně 20 % celosvětového webového provozu. Během incidentu přibližně třetina požadavků přes Cloudflare končila prázdnou stránkou s chybovým kódem 500. Příčinou tentokrát byla léta přehlížená chyba v kódu napsaném v jazyce Lua, který se používá v systému filtrování provozu WAF (Web Application Firewall) k blokování škodlivých požadavků.

Chyba v Cloudflare kvůli problému v kódu napsaném v jazyce Lua

Aby ochránili systémy klientů před kritickou zranitelností (CVE-2025-55182) v serverových komponentách frameworku React, inženýři Cloudflare implementovali ochranu na úrovni WAF po zveřejnění exploitů. Při zavádění ochrany však nedošlo vše úplně hladce: při nasazení byl zvýšen velikost vyrovnávací paměti pro kontrolu provozu na proxy-serverech, ale ukázalo se, že nástroj používaný pro testování WAF nepodporuje nastavenou velikost vyrovnávací paměti. Vzhledem k tomu, že tento nástroj nemá vliv na provoz, bylo rozhodnuto jej deaktivovat.

K deaktivaci inženýři využili subsystém „killswitch“ pro rychlou změnu konfigurace a deaktivaci jednotlivých Lua zpracovatelů na proxy serverech bez výměny pravidel. Tento způsob deaktivace pravidel se občas používá k rychlému odstranění chyb a vede k vynechání provádění části kódu Lua. Přitom inženýři nezohlednili, že pro vyvolání deaktivovaného testovacího nástroje se v Lua pravidlech používala metoda „execute“, která spouští další sadu pravidel. Režim „killswitch“ nebyl nikdy předtím použit s pravidly, která obsahovala vyvolání „execute“, a tato kombinace nebyla testována.

Použití "killswitch" vedlo k tomu, že kód definující další testovací sadu pravidel byl deaktivován, ale volání této sady pravidel pomocí "execute" zůstalo. V kódu nebyla další ověření existence objektu a předpokládalo se, že pokud je v sadě pravidel akce "execute", objekt "rule_result.execute" určitě existuje. Nakonec došlo k pokusu o vykonání metody "execute" pro neinicializovaný objekt, což vedlo k havárii zpracovatele s chybou "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

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster