Awaria w Cloudflare z powodu problemu w kodzie w języku Lua

Dwa tygodnie po ostatniej globalnej awarii, wczoraj sieć dostarczania treści Cloudflare, obsługująca około 20% całego światowego ruchu internetowego, była częściowo niedostępna przez 25 minut. W czasie incydentu około jedna trzecia zapytań przez Cloudflare kończyła się zwróceniem pustej strony z kodem błędu 500. Tym razem przyczyną była problem, który pozostawał niezauważony przez wiele lat w kodzie na języku Lua, stosowanym w systemie filtrowania ruchu WAF (Web Application Firewall) do blokowania złośliwych zapytań.

Awaria w Cloudflare z powodu problemu w kodzie w języku Lua

Aby chronić systemy klientów przed krytyczną luką (CVE-2025-55182) w komponentach serwerowych frameworka React, po pojawieniu się eksploitu w zasobach publicznych, inżynierowie Cloudflare wdrożyli ochronę na poziomie WAF. W trakcie wdrażania nie wszystko poszło gładko: podczas implementacji zwiększono rozmiar bufora do sprawdzania ruchu na proxy-serwerach, ale okazało się, że używane do testowania narzędzie WAF nie obsługuje ustalonego rozmiaru bufora. Ponieważ to narzędzie nie wpływa na ruch, podjęto decyzję o jego wyłączeniu.

Aby wyłączyć, inżynierowie skorzystali z podsystemu „killswitch”, który umożliwia szybkie zmiany konfiguracji i wyłączenie poszczególnych procesorów Lua na serwerach proxy bez zmiany reguł. Taki sposób wyłączania reguł jest okresowo stosowany do szybkiego usuwania błędów i prowadzi do pomijania wykonania części kodu Lua. Przy tym inżynierowie nie uwzględnili, że do wywoływania wyłączanego narzędzia testowego w regułach Lua zastosowano metodę „execute”, uruchamiającą dodatkowy zestaw reguł. Tryb „killswitch” nigdy wcześniej nie był stosowany z regułami, które miały wywołanie „execute”, i ta kombinacja nie była testowana.

Wprowadzenie "killswitch" spowodowało, że kod odpowiedzialny za zdefiniowanie dodatkowego zestawu reguł został wyłączony, ale wywołanie tego zestawu reguł przez "execute" pozostało. W kodzie nie było dodatkowych sprawdzeń istnienia obiektu, co sugerowało, że w przypadku istnienia w zestawie reguł akcji "execute", obiekt "rule_result.execute" musi istnieć. W efekcie doszło do próby wykonania metody "execute" dla niezinicjalizowanego obiektu, co doprowadziło do awaryjnego zakończenia obsługi z błędem "próba indeksowania pola 'execute' (wartość nil)". if rule_result.action == "execute" then rule_result.execute.results = ruleset_results[tonumber(rule_result.execute.results_index)] end

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster