Сбой в Cloudflare из-за проблемы в коде на языке Lua

Спустя две недели с момента прошлого глобального сбоя вчера сеть доставки контента Cloudflare, обслуживающая около 20% всего мирового web-трафика, на 25 минут частично оказалась недоступной. Во время инцидента примерно треть запросов через Cloudflare завершалось возвращением пустой страницы с кодом ошибки 500. На этот раз, причиной стала остававшаяся много лет незамеченной проблема в коде на языке Lua, применяемом в системе фильтрации трафика WAF (Web Application Firewall) для блокирования вредоносных запросов.

 Сбой в Cloudflare из-за проблемы в коде на языке Lua

Чтобы защитить системы клиентов от критической уязвимости (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

Добавить комментарий