Porucha v Cloudflare spôsobená problémom v kóde v jazyku Lua

Po dvoch týždňoch od poslednej globálnej poruchy bola včera sieť na dodávanie obsahu Cloudflare, ktorá obsluhuje približne 20 % celkového svetového webového prenosu, na 25 minút čiastočne nedostupná. Počas incidentu sa približne tretina požiadaviek cez Cloudflare skončila vrátením prázdnej stránky s kódom chyby 500. Tentoraz bola príčinou problém, ktorý zostával roky prehliadaný v kóde jazyka Lua, použitom v systéme filtrácie prenosu WAF (Web Application Firewall) na blokovanie škodlivých požiadaviek.

Porucha v Cloudflare spôsobená problémom v kóde v jazyku Lua

Aby chránili systémy zákazníkov pred kritickou zraniteľnosťou (CVE-2025-55182) v serverových komponentoch rámca React, po zverejnení exploitu, inžinieri Cloudflare implementovali ochranu na úrovni WAF. S implementáciou ochrany však všetko neprebiehalo hladko: počas implementácie bol zvýšený veľkosť vyrovnávacej pamäte na kontrolu prenosu na proxy-serveroch, ale ukázalo sa, že nástroj používaný na testovanie WAF nepodporuje stanovenú veľkosť vyrovnávacej pamäte. Keďže tento nástroj nemá vplyv na prenos, rozhodlo sa ho vypnúť.

Na jeho vypnutie inžinieri využili subsystém „killswitch“ na rýchlu zmenu konfigurácie a vypnutie jednotlivých Lua spracovateľov na proxy serveroch bez nahradenia pravidiel. Tento spôsob vypnutia pravidiel sa občas používa na rýchle odstránenie chýb a vedie k preskočeniu vykonania časti Lua kódu. Inžinieri si však neuvedomili, že na vyvolanie vypínaného testovacieho nástroja v Lua pravidlách sa používal spôsob „execute“, ktorý spúšťa ďalší súbor pravidiel. Režim „killswitch“ sa nikdy predtým nepoužíval s pravidlami, ktoré majú volanie „execute“, a táto kombinácia nebola testovaná.

Aplikácia "killswitch" viedla k tomu, že kód na definovanie dodatočnej testovej sady pravidiel bol deaktivovaný, ale volanie tejto sady pravidiel cez "execute" ostalo. V kóde neboli žiadne ďalšie kontroly existencie objektu a predpokladalo sa, že pri existencii akcie "execute" v sade pravidiel, objekt "rule_result.execute" nevyhnutne existuje. Výsledkom bolo pokus o vykonanie metódy "execute" pre neinicializovaný objekt, čo viedlo k havarijnému ukončeniu spracovateľa s chybou "pokus o indexovanie poľa ‘execute’ (nil hodnota)". if rule_result.action == "execute" then rule_result.execute.results = ruleset_results[tonumber(rule_result.execute.results_index)] end

Zdroj: opennet.ru

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster