Кратко
- 2 июля 2019 года функционально одобренное правило WAF за секунды разошлось по глобальной сети Cloudflare; регулярное выражение вызывало огромный перебор с возвратом, процессы HTTP/HTTPS исчерпали CPU, и клиенты 27 минут получали ошибки 502.
- Быструю защиту не нужно отменять: экстренное глобальное действие отделяют от обычного изменения, до допуска обеспечивают ресурсную границу, расширяют живой трафик ступенями, а отключение, аутентификацию и статус держат вне зоны отказа управляемого edge.
Доставка была успешной
В 13:31 UTC инженер команды межсетевого экрана объединил одобренный pull request. В 13:37 TeamCity выполнил сборку и тесты. В 13:42 автоматический процесс начал распространять небольшое изменение правила обнаружения XSS.
Quicksilver доставил изменение по назначению. В отчёте Cloudflare система охватывала более 180 городов, в среднем обрабатывала примерно 350 изменений в секунду, а 99-й перцентиль всемирного распространения составлял 2,29 секунды. Более позднее архитектурное описание говорит о той же способности уже для сотен городов.
Скорость имела защитный смысл. При активно используемой уязвимости ожидание расширяет окно атаки. Cloudflare приводила быструю установку защиты от серьёзной уязвимости SharePoint как пример необходимой глобальной реакции.
Но изменение 2 июля не было экстренным. Стандартная процедура позволяла обычному правилу пройти прямо на весь мир. Тесты проверяли, блокируются ли опасные образцы и пропускаются ли допустимые. Они не измеряли максимум CPU, который один вход мог потребовать у выражения.
Одобрение оценивало логический ответ, но доставка выдавала большее полномочие: выполнять этот ответ на глобальном потоке. Quicksilver сократил расстояние между решением и полным радиусом настолько, что наблюдение началось после сходимости.
Верный результат не гарантирует приемлемую работу
Выражение исполнялось движком на основе PCRE. Движок с возвратом последовательно исследует возможные пути совпадения. Обычный шаблон быстро находит или исключает результат. Неудачное сочетание неоднозначных повторений с определённым входом может экспоненциально увеличить число путей.
Ответ остаётся правильным, а сервис исчезает в процессе его поиска.
У правила поэтому два контракта. Семантический определяет, что блокировать. Ресурсный ограничивает процессор, память и очередь для любого запроса. Проверка ожидаемых положительных и отрицательных примеров доказывает первый, но не второй.
WAF Cloudflare находился на пути HTTP/HTTPS и применял тысячи правил к огромному потоку. Когда новое выражение стало чрезвычайно дорогим на некоторых запросах, обслуживающие процессы исчерпали свои ядра. Прокси, CDN и WAF пострадали одновременно.
Фронтовые веб-серверы всё ещё имели свободные ядра, чтобы формировать страницы 502, однако не могли связаться с процессами HTTP/HTTPS. Это не полная смерть каждого сервера: работал слой, сообщавший об ошибке, но критический исполнительный слой был недоступен.
В цепочке Cloudflare было больше одного дефекта. Защита от чрезмерного CPU раньше существовала, но случайно исчезла при рефакторинге производительности. Движок не гарантировал сложность, тесты не обнаруживали неограниченный расход, а обычный порядок не требовал этапов. Свести всё к плохой строке означает не менять полномочия, превратившие её в глобальное событие.
Через три минуты мир уже сошёлся
В 13:45 внешний синтетический тест WAF вызвал первую страницу PagerDuty. Затем отказали другие сквозные проверки, упал глобальный трафик, распространились 502, а точки присутствия доложили об исчерпании CPU. Краткое сообщение указывает падение трафика Cloudflare на 82% в худший момент. Это не 82% Интернета.
Сначала предполагалась неизвестная атака. К 14:00 данные производительности, журналы и strace указали на WAF; атаку исключили. В 14:02 участники предложили global terminate — отключение одного компонента во всём мире.
Обычный откат не соответствовал скорости инцидента. Для точного возврата требовалось два раза собрать весь WAF. Доступным действием стало широкое лишение полномочия: отключить компонент, затем найти правило, проверить исправление и восстановить систему.
Средства управления сами зависели от пострадавшей зоны. Внутренняя аутентификация использовала Cloudflare Access. Обычная панель, Jira и система сборки оказались труднодоступны. Потребовался редко отрабатываемый обход, а у некоторых SRE истекли учётные данные — защитная функция отключила их после периода неиспользования.
В 14:07 глобальное отключение выполнили. К 14:09 CPU и трафик вернулись к ожидаемым уровням, а прочие механизмы защиты продолжили работу. Затем Cloudflare вывела платный клиентский поток из одного города и проверила там откат на части трафика. В 14:52 WAF был снова включён глобально.
Полный отчёт называет 27 минут недоступности, раннее сообщение — около 30. Значима иная разница: секунды для выдачи глобального права, минуты для обнаружения, отключение всего компонента для прекращения и более часа от начала до проверенного восстановления.
Ограниченный движок ограничивает автора
Cloudflare объявила возврат CPU-защиты, проверку всех 3 868 правил, профилирование производительности и переход на RE2 либо Rust-движок. В публикации июля 2020 года компания сообщила, что ещё в июле 2019-го WAF перешёл с PCRE-основы на реализацию, вдохновлённую RE2.
RE2 делает безопасность свойством исполнения. Время сопоставления асимптотически линейно по длине входа, память ограничена настраиваемым бюджетом, а исчерпание приводит к контролируемому отказу. Обратные ссылки и общие проверки окружения не поддерживаются там, где требуют перебора с возвратом.
Ограничение языка снимает часть риска до человеческого ревью. Некоторые удобные конструкции придётся переписать, но пропущенная ошибка уже не получает прежнее право на экспоненциальный поиск. Возможность становится уже по определению.
RE2 не обещает быть быстрее во всех случаях; сложные выражения несут постоянные накладные расходы. PCRE2, в свою очередь, документирует лимиты совпадений, глубины и кучи. Источники не устанавливают, были ли эти общие регуляторы активны у Cloudflare в 2019 году.
Последующее измерение показывает точную цель. Среднее потребление CPU после смены движка не изменилось измеримо, зато сократились выбросы времени в 95-м и 99-м перцентилях. Устойчивость лежала в хвосте: не каждый обычный запрос должен был стать дешевле, а редкий не должен был получить непомерную долю машины.
Движок не ограничивает автоматически декодирование, нормализацию, парсеры, кэш и взаимодействие правил. Бюджет нужен всему пути, вместе с репрезентативной и противодействующей нагрузкой.
Две полосы для разных рисков
Cloudflare предложила этапное распространение обычных правил, сохранив немедленный глобальный путь для активных атак. Так скорость остаётся способностью, но перестаёт быть ежедневным неявным правом.
Обычное правило проходит анализ сложности, враждебные входы и измерение полного пути; работает в теневом режиме; затем входит в один город, малую долю трафика и регион. На каждой ступени оценивают защитный результат, CPU правила, хвостовую задержку, ошибки и доступность процессов. Автоматический порог должен остановить продвижение.
Экстренная полоса сокращает наблюдение, однако требует названного инцидента, основания угрозы, владельца, срока, живых бюджетов и отдельного человека с правом отозвать. Срочность — явный обмен рисков, а не отсутствие контроля.
Канарейка полезна только при реальной независимости. Пять процентов площадок с общей хрупкой очередью или телеметрией не ограничат поражение и не дадут свидетельств. Нужны репрезентативный трафик, отделённая мощность и контрольная группа.
Отзыв правила должен быть быстрым изменением состояния, а не двойной сборкой. Один ключ выключает правило, другой — компонент. Оба проверяются при недоступных обычных панели, идентификации и сборке.
Контур управления должен пережить цель
Зависимость Cloudflare от собственных продуктов не создала выражение, но затруднила восстановление. Панель и API клиентов тоже проходили через пострадавший edge. Способность действовать уменьшилась именно в момент необходимости.
Независимость может быть узкой: экстренная аутентификация, публикация статуса, глобальное отключение, минимальная конфигурация, доступ к данным и клиентские действия для уменьшения потерь. Этой поверхности нужны изолированные ресурсы, маршруты и регулярно проверяемые учётные данные.
Running-Code Primacy Хэна Лу отделяет запись от реальности. Ревью, тикет и план отката координируют изменение, но сами не ограничивают CPU. Если исполняемый код исчерпал машину и закрыл доступ к управлению, метка одобрения не защищает.
Техническое владение также не равно практическому контролю. Команда отключения бесполезна, если её аутентификация, интерфейс, персонал и сборка зависят от отключаемого объекта. Полномочие измеряется возможностью действовать во время отказа.
Границы доказательств
Хронология, архитектура, причины и меры в основном исходят от самой Cloudflare. Детальность важна, но это самоотчёт компании. В источниках нет независимого полного числа затронутых клиентов, доменов, запросов или экономических потерь.
Cloudflare прямо исключила атаку. Здесь не утверждается враждебное намерение или намеренный запуск. Quicksilver не написал выражение и не удалил защиту; он расширил последствие, поскольку обычное одобрение могло использовать всю систему.
Материал 2020 года подтверждает смену движка и измеренные хвостовые эффекты, но не доказывает постоянную полноту каждого обещания 2019-го. Случай обосновывает модель контроля, а не будущую безошибочность компании или технологии.
Источники
- Cloudflare, полный разбор события 2 июля 2019 года
- Cloudflare, первоначальное сообщение
- Cloudflare, распределение конфигурации Quicksilver
- Cloudflare, последующий материал о WAF
- Google, устройство и гарантии RE2
- Спецификация нативного API PCRE2
- Heng Lu, Running-Code Primacy
- Heng Lu, On Data Sovereignty: Technical vs Practical Realities
Обзор для участников
Подробный контекст профиля
Войдите с подходящим уровнем подписки, чтобы открыть полный обзор и примечания к источникам.
Только для Стратегического сообщества
Стратегическое сообщество
Открыто всем читателям. Вступите и войдите, чтобы открыть обзоры профилей.
Вступить в Стратегическое сообществоТолько для Альянса лидеров
Альянс лидеров
Для проверенных владельцев IP-активов и руководителей. Войдите, чтобы открыть обзоры Альянса.
Вступить в Альянс лидеров
