Pas dy javësh nga rasti i fundit global të dështimit, dje rrjeti i shpërndarjes së përmbajtjes Cloudflare, që shërben për rreth 20% të të gjithë trafikut web global, ishte pjesërisht i papërballueshëm për 25 minuta. Gjatë incidentit, rreth një e treta e kërkesave përmes Cloudflare përfunduan me kthimin e një faqeje të zbrazët me kodin e gabimit 500. Këtë herë, arsyeja ishte një problem në kodin e gjuhës Lua që kishte mbetur i paditur për shumë vite, i përdorur në sistemin e filtrimit të trafikut WAF (Web Application Firewall) për bllokimin e kërkesave të dëmshme.

Për të mbrojtur sistemet e klientëve nga një vulnerabilitet kritik (CVE-2025-55182) në komponentët server të karkasës React, pas shfaqjes së një eksploit në publik, inxhinierët e Cloudflare zbatuan mbrojtjen në nivel WAF. Me implementimin e mbrojtjes, gjithçka nuk shkoi sipas parashikimeve: gjatë procesit të implementimit u rrit madhësia e buferit për verifikimin e trafikut në proxy-serverë, por doli se mjeti i përdorur për testimin e WAF-it nuk mbështet madhësinë e caktuar të buferit. Duke qenë se ky mjet nuk ndikon në trafik, u vendos të çaktivizohej.
Për të çaktivizuar, inxhinierët përdorën sistemin «killswitch» për të ndryshuar shpejt konfigurimin dhe për të çaktivizuar trajtuesit e veçantë Lua në serverat proxy pa e ndryshuar rregullin. Një metodë e tillë çaktivizimi rregullisht përdoret për të korrigjuar shpejt gabimet dhe sjell në humbjen e ekzekutimit të pjesëve të kodit Lua. Megjithatë, inxhinierët nuk e morën parasysh që për thirrjen e instrumenteve të testimit të çaktivizuar në rregullat Lua ishte përdorur metoda «execute», e cila aktivizon një grup të shtuar rregullash. Më parë, modelet «killswitch» kurrë nuk ishin aplikuar me rregulla që kishin thirrjen «execute», dhe kjo kombinim nuk ishte testuar.
PĂ«rdorimi i «killswitch» ka bĂ«rĂ« qĂ« kodi pĂ«r definimin e njĂ« grumbulli shtesĂ« tĂ« rregullave tĂ« çaktivizohet, por thirrja e kĂ«tij grumbulli pĂ«rmes «execute» ka mbetur. NĂ« kod nuk kishte verifikime tĂ« tjera pĂ«r ekzistencĂ«n e objektit dhe supozohej se, nĂ«se nĂ« grumbullin e rregullave kishte njĂ« veprim «execute», objekti «rule_result.execute» patjetĂ«r ekzistonte. Si rezultat, u pĂ«rpoq tĂ« ekzekutonte metodĂ«n «execute» pĂ«r njĂ« objekt tĂ« pa inicializuar, gjĂ« qĂ« çoi nĂ« mbarimin e papritur tĂ« trajtuesit me gabimin «pĂ«rpjekje pĂ«r tĂ« indeksuar fushĂ«n âexecuteâ (njĂ« vlerĂ« nil). nĂ«se rule_result.action == «execute» atĂ«herĂ« rule_result.execute.results = ruleset_results[tonumber(rule_result.execute.results_index)] fund
Burimi: opennet.ru
