След като преди две седмици имаше глобален срив, вчера мрежата за разпространение на съдържание Cloudflare, обслужваща около 20% от общия световен уеб трафик, беше частично недостъпна за 25 минути. По време на инцидента около една трета от заявките през Cloudflare завършваха с празна страница и код за грешка 500. Този път причината беше проблем в кода на Lua, който е незабелязан от години и се използва в системата за филтриране на трафика WAF (Web Application Firewall) за блокиране на злонамерени заявки.

За да защитят системите на клиентите от критичната уязвимост (CVE-2025-55182) в сървърните компоненти на фреймворка React, след като експлоитът стана публично достъпен, инженерите на Cloudflare внедриха защита на нивото на WAF. При внедряването не всичко мина гладко: размерът на буфера за проверка на трафика за прокси-сервизите беше увеличен,сървъри, но се оказа, че инструментариумът за тестване на WAF не поддържа зададения размер на буфера. Тъй като този инструментариум не влияе на трафика, беше решено да бъде деактивиран.
За деактивирането инженерите използваха подсистемата „killswitch“ за бърза промяна на конфигурацията и деактивиране на отделни Lua обработчици на прокси сървърите без замяна на правилата. Този метод за деактивиране на правила периодично се използва за бързо отстраняване на грешки и води до пропуск на изпълнението на част от Lua кода. При това инженерите не взеха предвид, че за извикване на деактивирания тестов инструментариум в Lua правилата е използван методът „execute“, който стартира допълнителен набор от правила. Режимът „killswitch“ никога не е бил прилаган с правила, имащи извикване „execute“, и тази комбинация не е била тествана.
Прилагането на «killswitch» доведе до това, че кодът за определяне на допълнителен тестов набор от правила беше деактивиран, но извикването на този набор правила чрез «execute» остана. В кода нямаше допълнителни проверки за съществуването на обекта и се подразбираше, че при наличието на действието «execute» в набора от правила, обектът «rule_result.execute» безусловно съществува. В резултат на това се опита да бъде извикан методът «execute» за неинициализиран обект, което доведе до аварийно прекратяване на обработчика с грешка «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
Източник: opennet.ru
