О конфиденциальности: мы не называем этого клиента, и это осознанное решение. Каждый наш проект защищен 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 часа.
- день 0
Обнаружение
Необычный трафик краулеров к админским и внутренним эндпоинтам зафиксирован в security events и алертах CDN.
- T + ~1,5 ч
Локализация
Доступ к админским и внутренним хостам ограничен только VPN; артефакты атакующего заблокированы на edge.
- T + ~2 ч
Исправление
Правила WAF переставлены, исключение по User-Agent заменено на сигнал verified bot, пробелы в сопоставлении закрыты.
- T + ~2,5 ч
Верификация
Матрица тестов с поддельными краулерами запущена извне VPN: ни один запрос не дошел до закрытых зон.
Что было под угрозой
Технически это была ошибка в порядке правил. Для бизнеса это были открытые двери к самым чувствительным частям платформы.
- 01
Данные клиентов
Админка дает доступ к учетным записям и данным клиентов. Несанкционированный доступ означал бы утечку персональных данных, о которой по GDPR нужно сообщить в течение 72 часов, с риском штрафов.
- 02
Внутренние системы
Внутренние API и service-to-service эндпоинты рассчитаны на то, что к ним обращаются доверенные сервисы. Если они доступны из интернета, через них можно проникнуть глубже в инфраструктуру.
- 03
Учетные данные и секреты
Во время автоматизированного сканирования атакующий искал открытые ключи и конфигурационные файлы. Один утекший секрет может открыть доступ к облачным аккаунтам, базам данных или сторонним интеграциям.
- 04
Комплаенс и договоры
Анкеты по безопасности, аудиты ISO 27001 и SOC 2 и договоры с клиентами исходят из того, что закрытые зоны действительно закрыты. Такой пробел разрушает это допущение.
- 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 проверяется первым
- Поддельный запрос Резидентный прокси-IP UA указывает Googlebot
- Правило WAF 1: Skip UA содержит название бота пропускает все следующие правила
- Не проверяются Геоблокировка IP-allowlist админки
- Дошел до origin Админка Внутренние API
После: сначала allowlist, только верифицированные боты
- Поддельный запрос Резидентный прокси-IP UA указывает Googlebot
- Правило 1: Allowlist Закрытые хосты VPN и IP сервисов
- Заблокировано: 403 до проверки любого исключения
- Исключение для краулеров теперь принимает только ботов, верифицированных CDN, на маркетинговых хостах и после allowlist.
До исправления первое правило доверяло заголовку, который контролирует атакующий, и отключало allowlist. После исправления allowlist выполняется первым.
Анализ и выводы
Мы связали всю активность с одним оператором и показали, как именно она проходила через edge.
- 01
Сопоставили слои логов
В логах приложения не было заголовков с реальным IP-адресом клиента и request ID, а в логах reverse proxy они были, поэтому мы использовали их, чтобы связать слои.
- 02
Атрибутировали по артефактам, а не по IP
Артефакты, повторявшиеся в запросах, связали 6 739 прокси-IP с одним актором.
- 03
Сквозно сопоставили CDN request ID
Те же запросы есть и в security events CDN с пометкой «исключение», и в логах origin, что исключило обход самого CDN.
CDN request ID
- Security events CDN исключение
- Логи reverse proxy request ID
- Логи приложения request ID
- 6 739 прокси-IP
- артефакты
- один актор
Первопричины
- 01
заголовку, который отправитель запроса задает сам, доверяли и проверяли его раньше allowlist
- 02
было несколько пробелов в сопоставлении правил
- 03
IP-ограничения применялись только на edge
Внедренные решения
Мы поставили allowlist перед всеми исключениями и перестали доверять тому, что отправитель запроса сообщает о себе сам.
- Запрос
- Allowlist выполняется до любого skip rule
- MFA одного сетевого доступа недостаточно
- Управляемые правила Cloudflare по-прежнему проверяют этот трафик
- Сигнал verified bot только для публичных маркетинговых хостов
- Нормализация URL WAF и origin видят одинаковый путь
- Origin
Сначала allowlist
Allowlist для админки и внутренних инструментов теперь выполняется перед любым skip rule, поэтому ни одно исключение не может его отключить. Кроме того, вход в админку и внутренние инструменты требует MFA, поэтому одного сетевого доступа недостаточно. На уровне edge исключение для краулеров теперь пропускает только кастомные правила, поэтому управляемые правила Cloudflare (managed rules) по-прежнему проверяют этот трафик. Нормализация URL гарантирует, что WAF и origin видят одинаковый путь.
- 02
Только верифицированные боты
Проверка User-Agent заменена на сигнал verified bot от CDN, который действует только для публичных маркетинговых хостов.
- 03
Более точное сопоставление
Правила для хоста и префикса пути, которые также проверяют сырой (raw) путь; остальные пробелы закрыты.
- 04
Меньшая публичная поверхность
Внутренние эндпоинты и эндпоинты service-to-service доступны только из VPN и с известных IP сервисов.
Проверено
Матрица тестов с поддельными краулерами запускается извне VPN, а ее результаты сверяются с security events CDN.
Дальнейшее усиление защиты приложения и allowlist на стороне origin сейчас внедряются как следующий этап работ.
| Поддельный краулер | Админка | Внутренние инструменты | Внутренние API |
|---|---|---|---|
| Googlebot | Заблокировано 403 | Заблокировано 403 | Заблокировано 403 |
| GPTBot | Заблокировано 403 | Заблокировано 403 | Заблокировано 403 |
извне VPN сверено с security events CDN
Рекомендации
- 01
Zero Trust для админки
Заменить IP-allowlist на доступ по идентичности (Cloudflare Access или SSO с MFA), чтобы каждая сессия в админке принадлежала проверенному пользователю, а не IP-адресу.
- 02
Защита на уровне origin
Применить те же ограничения на reverse proxy, чтобы одна ошибка в правилах edge больше не открывала закрытые зоны.
- 03
Регрессионные тесты
Запускать матрицу тестов с поддельными краулерами в CI после каждого изменения правил WAF.
- 04
Алерты
Настроить уведомления об аномалиях трафика на edge и об изменениях правил безопасности, чтобы замечать инциденты рано, еще до того, как их придется расследовать.
Результаты
Поддельный трафик краулеров больше не попадает в закрытые зоны, а настоящие поисковые краулеры, как и прежде, имеют доступ к публичным страницам.
-
Поддельные запросы краулеров к закрытым зонам
ДоДоходили до origin
ПослеБлокируются на edge
-
Что дает исключение для краулера
ДоЛюбой User-Agent с названием бота
ПослеКраулер, верифицированный CDN, только публичные хосты
-
Порядок правил
ДоСначала исключение
ПослеСначала allowlist
-
Уровни контроля доступа
ДоТолько edge
ПослеEdge и origin
-
Вредоносные запросы, дошедшие до закрытых зон
До14 700 за 2 дня
После0
-
Время на исправление после подключения
Дон/д
После2 часа
Стек и инструменты
-
Edge01
- Cloudflare WAF
- сигнал verified bot
- security events
-
Сеть02
- Облачный firewall, ограниченный диапазонами CDN
-
Reverse proxy03
- Traefik на Docker
-
Анализ04
- Корреляция логов на Python
- тестовая матрица на curl
Касается ли это вас?
Если ваш WAF пропускает поисковые системы или AI-краулеров, как это делает большинство компаний, чтобы не потерять SEO или появляться в ответах AI, у вас может быть такой же пробел. Проверить это можно примерно за пять минут:
- 01
Найдите исключения для ботов
В настройках WAF или CDN перечислите все правила, которые пропускают или разрешают ботов. Есть ли среди них такие, что проверяют только User-Agent?
- 02
Проверьте порядок правил
Выполняется ли какое-то skip- или allow-правило раньше IP-allowlist или геоблокировки, защищающих вашу админку?
- 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 можно обойти. Тестируйте только системы, которые принадлежат вам или на тестирование которых у вас есть разрешение.
- 04
Проверьте логи
Поищите User-Agent краулеров в запросах к админским или внутренним путям. Настоящим краулерам там делать нечего.