Опишите ваш проект
Наши специалисты свяжутся с вами в ближайшее время
Отправив запрос вы получаете:
  • Письмо или звонок от нашего менеджера
  • Оценку своего проекта
  • Личную встречу, при необходимости
  • Конфиденциальность гарантирована!
Maxim Kaschjev
Ваш менеджер
Максим Кащеев
С удовольствием ответим на все ваши вопросы
Задать вопрос
image

Обход Cloudflare WAF

О конфиденциальности: мы не называем этого клиента, и это осознанное решение. Каждый наш проект защищен NDA, а детали кейсов мы публикуем только после того, как проблема исправлена и клиент согласовал обезличенную версию. Все цифры ниже обезличены. Если вы работаете с нами, ваша инфраструктура получает такую же защиту.

Обзор

WAF клиента позволял поисковым системам и AI-краулерам обходить геоблокировку. Атакующие воспользовались этим, выдавая себя за таких краулеров. За 2 дня 14 700 вредоносных запросов с 6 739 резидентных прокси-IP добрались до админских и внутренних эндпоинтов, которые вообще не должны были быть доступны из интернета. Сопоставив логи CDN, reverse proxy и приложения, мы связали всю активность с одним оператором. Затем нашли первопричину, исключение в WAF, которое доверяло заголовку User-Agent, и закрыли его за 2 часа после начала работы. После исправления все защищенные эндпоинты отклоняют поддельный трафик краулеров во всех 54 тестовых сценариях.

Ключевые цифры

  • 14 700

    вредоносных запросов за 2 дня

  • 6 739

    резидентных прокси-IP и 17 поддельных User-Agent краулеров

  • 9 892

    эндпоинта под риском: админка, внутренние API, service-to-service эндпоинты

  • 1 час

    Время обнаружения

  • 2 часа

    Время исправления

  • 0

    поддельных запросов доходят до закрытых зон после исправления

Хронология инцидента

От первого алерта до проверенного исправления: 3 часа.

  1. день 0

    Обнаружение

    Необычный трафик краулеров к админским и внутренним эндпоинтам зафиксирован в security events и алертах CDN.

  2. T + ~1,5 ч

    Локализация

    Доступ к админским и внутренним хостам ограничен только VPN; артефакты атакующего заблокированы на edge.

  3. T + ~2 ч

    Исправление

    Правила WAF переставлены, исключение по User-Agent заменено на сигнал verified bot, пробелы в сопоставлении закрыты.

  4. T + ~2,5 ч

    Верификация

    Матрица тестов с поддельными краулерами запущена извне VPN: ни один запрос не дошел до закрытых зон.

Что было под угрозой

Технически это была ошибка в порядке правил. Для бизнеса это были открытые двери к самым чувствительным частям платформы.

  1. 01

    Данные клиентов

    Админка дает доступ к учетным записям и данным клиентов. Несанкционированный доступ означал бы утечку персональных данных, о которой по GDPR нужно сообщить в течение 72 часов, с риском штрафов.

  2. 02

    Внутренние системы

    Внутренние API и service-to-service эндпоинты рассчитаны на то, что к ним обращаются доверенные сервисы. Если они доступны из интернета, через них можно проникнуть глубже в инфраструктуру.

  3. 03

    Учетные данные и секреты

    Во время автоматизированного сканирования атакующий искал открытые ключи и конфигурационные файлы. Один утекший секрет может открыть доступ к облачным аккаунтам, базам данных или сторонним интеграциям.

  4. 04

    Комплаенс и договоры

    Анкеты по безопасности, аудиты ISO 27001 и SOC 2 и договоры с клиентами исходят из того, что закрытые зоны действительно закрыты. Такой пробел разрушает это допущение.

  5. 05

    Простой

    Длительная атака на эндпоинты бэк-офиса может замедлить или вывести из строя инструменты, которыми команда пользуется каждый день.

Вызовы

Трафик выглядел как обычные краулеры, и именно поэтому он прошел.

Ротация идентичностей

Атакующий чередовал 17 User-Agent краулеров (Googlebot, GPTBot и другие) и 6 739 резидентных IP, поэтому блокировка только по IP или User-Agent не успевала.

Шум как прикрытие

Короткий громкий всплеск автоматизированного сканирования секретов маскировал более медленную целенаправленную атаку на админские и внутренние эндпоинты.

автоматизированное сканирование секретов атака на админские и внутренние эндпоинты

Админские и внутренние зоны были защищены IP-allowlist на уровне CDN. Чтобы легитимные поисковые боты не попадали под геоблокировку, правило-исключение в WAF (skip rule) пропускало любой запрос, в User-Agent которого было название известного бота, и это правило выполнялось первым. Поскольку User-Agent задает сам отправитель, любой мог отключить allowlist, вписав название краулера в один заголовок. Почти каждый вредоносный запрос содержал название краулера, и ни один не пришел от настоящего краулера.

Поддельный заголовок краулера отключал все правила после него

Порядок проверки правил WAF / до и после исправления

До: исключение по User-Agent проверяется первым

  1. Поддельный запрос Резидентный прокси-IP UA указывает Googlebot
  2. Правило WAF 1: Skip UA содержит название бота пропускает все следующие правила
  3. Не проверяются Геоблокировка IP-allowlist админки
  4. Дошел до origin Админка Внутренние API

После: сначала allowlist, только верифицированные боты

  1. Поддельный запрос Резидентный прокси-IP UA указывает Googlebot
  2. Правило 1: Allowlist Закрытые хосты VPN и IP сервисов
  3. Заблокировано: 403 до проверки любого исключения
  4. Исключение для краулеров теперь принимает только ботов, верифицированных CDN, на маркетинговых хостах и после allowlist.

До исправления первое правило доверяло заголовку, который контролирует атакующий, и отключало allowlist. После исправления allowlist выполняется первым.

Анализ и выводы

Мы связали всю активность с одним оператором и показали, как именно она проходила через edge.

  1. 01

    Сопоставили слои логов

    В логах приложения не было заголовков с реальным IP-адресом клиента и request ID, а в логах reverse proxy они были, поэтому мы использовали их, чтобы связать слои.

  2. 02

    Атрибутировали по артефактам, а не по IP

    Артефакты, повторявшиеся в запросах, связали 6 739 прокси-IP с одним актором.

  3. 03

    Сквозно сопоставили CDN request ID

    Те же запросы есть и в security events CDN с пометкой «исключение», и в логах origin, что исключило обход самого CDN.

01 03 Сопоставление слоев логов и сквозное сопоставление CDN request ID

CDN request ID

  • Security events CDN исключение
  • Логи reverse proxy request ID
  • Логи приложения request ID
02 Атрибуция по артефактам, а не по IP
  • 6 739 прокси-IP
  • артефакты
  • один актор

Первопричины

  1. 01

    заголовку, который отправитель запроса задает сам, доверяли и проверяли его раньше allowlist

  2. 02

    было несколько пробелов в сопоставлении правил

  3. 03

    IP-ограничения применялись только на edge

Внедренные решения

Мы поставили allowlist перед всеми исключениями и перестали доверять тому, что отправитель запроса сообщает о себе сам.

Путь запроса после исправления: allowlist, MFA, управляемые правила Cloudflare, сигнал verified bot, нормализация URL, origin
  1. Запрос
  2. Allowlist выполняется до любого skip rule
  3. MFA одного сетевого доступа недостаточно
  4. Управляемые правила Cloudflare по-прежнему проверяют этот трафик
  5. Сигнал verified bot только для публичных маркетинговых хостов
  6. Нормализация URL WAF и origin видят одинаковый путь
  7. Origin
01

Сначала allowlist

Allowlist для админки и внутренних инструментов теперь выполняется перед любым skip rule, поэтому ни одно исключение не может его отключить. Кроме того, вход в админку и внутренние инструменты требует MFA, поэтому одного сетевого доступа недостаточно. На уровне edge исключение для краулеров теперь пропускает только кастомные правила, поэтому управляемые правила Cloudflare (managed rules) по-прежнему проверяют этот трафик. Нормализация URL гарантирует, что WAF и origin видят одинаковый путь.

  1. 02

    Только верифицированные боты

    Проверка User-Agent заменена на сигнал verified bot от CDN, который действует только для публичных маркетинговых хостов.

  2. 03

    Более точное сопоставление

    Правила для хоста и префикса пути, которые также проверяют сырой (raw) путь; остальные пробелы закрыты.

  3. 04

    Меньшая публичная поверхность

    Внутренние эндпоинты и эндпоинты service-to-service доступны только из VPN и с известных IP сервисов.

05

Проверено

Матрица тестов с поддельными краулерами запускается извне VPN, а ее результаты сверяются с security events CDN.

Дальнейшее усиление защиты приложения и allowlist на стороне origin сейчас внедряются как следующий этап работ.

Матрица тестов с поддельными краулерами
Поддельный краулер Админка Внутренние инструменты Внутренние API
Googlebot Заблокировано 403 Заблокировано 403 Заблокировано 403
GPTBot Заблокировано 403 Заблокировано 403 Заблокировано 403

извне VPN сверено с security events CDN

Рекомендации

  1. 01

    Zero Trust для админки

    Заменить IP-allowlist на доступ по идентичности (Cloudflare Access или SSO с MFA), чтобы каждая сессия в админке принадлежала проверенному пользователю, а не IP-адресу.

  2. 02

    Защита на уровне origin

    Применить те же ограничения на reverse proxy, чтобы одна ошибка в правилах edge больше не открывала закрытые зоны.

  3. 03

    Регрессионные тесты

    Запускать матрицу тестов с поддельными краулерами в CI после каждого изменения правил WAF.

  4. 04

    Алерты

    Настроить уведомления об аномалиях трафика на edge и об изменениях правил безопасности, чтобы замечать инциденты рано, еще до того, как их придется расследовать.

Результаты

Поддельный трафик краулеров больше не попадает в закрытые зоны, а настоящие поисковые краулеры, как и прежде, имеют доступ к публичным страницам.

  • Поддельные запросы краулеров к закрытым зонам

    ДоДоходили до origin

    ПослеБлокируются на edge

  • Что дает исключение для краулера

    ДоЛюбой User-Agent с названием бота

    ПослеКраулер, верифицированный CDN, только публичные хосты

  • Порядок правил

    ДоСначала исключение

    ПослеСначала allowlist

  • Уровни контроля доступа

    ДоТолько edge

    ПослеEdge и origin

  • Вредоносные запросы, дошедшие до закрытых зон

    До14 700 за 2 дня

    После0

  • Время на исправление после подключения

    Дон/д

    После2 часа

Стек и инструменты

  1. Edge01

    • Cloudflare WAF
    • сигнал verified bot
    • security events
  2. Сеть02

    • Облачный firewall, ограниченный диапазонами CDN
  3. Reverse proxy03

    • Traefik на Docker
  4. Анализ04

    • Корреляция логов на Python
    • тестовая матрица на curl

Касается ли это вас?

Если ваш WAF пропускает поисковые системы или AI-краулеров, как это делает большинство компаний, чтобы не потерять SEO или появляться в ответах AI, у вас может быть такой же пробел. Проверить это можно примерно за пять минут:

  1. 01

    Найдите исключения для ботов

    В настройках WAF или CDN перечислите все правила, которые пропускают или разрешают ботов. Есть ли среди них такие, что проверяют только User-Agent?

  2. 02

    Проверьте порядок правил

    Выполняется ли какое-то skip- или allow-правило раньше IP-allowlist или геоблокировки, защищающих вашу админку?

  3. 03

    Протестируйте

    Из сети вне вашего allowlist запросите URL админки с User-Agent краулера:

    curl -I -A "Googlebot/2.1 (+http://www.google.com/bot.html)" https://your-domain.com/admin

    Любой ответ, кроме блокировки (403 или challenge), означает, что allowlist можно обойти. Тестируйте только системы, которые принадлежат вам или на тестирование которых у вас есть разрешение.

  4. 04

    Проверьте логи

    Поищите User-Agent краулеров в запросах к админским или внутренним путям. Настоящим краулерам там делать нечего.