Опишіть ваш проєкт
Наші спеціалісти звʼяжуться з вами найближчим часом
Надіславши запит, ви отримуєте:
  • Лист чи дзвінок від нашого менеджера
  • Оцінку свого проєкту
  • Особисту зустріч, за необхідності
  • Конфіденційність гарантовано!
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 краулерів у запитах до адмінських чи внутрішніх шляхів. Справжнім краулерам там нічого робити.