Назад к блогу

Что показала десятидневная DDoS-атака на Read the Docs

Что показала десятидневная DDoS-атака на Read the Docs

Разбор десятидневной DDoS-атаки на Read the Docs — редкая возможность увидеть, как ломаются привычные модели защиты публичных сервисов: атакующие били не по мощности, а по некэшируемым путям и порогам лимитов, играя на автоскейлинге. История полезна не списком контрмер, а тем, какие допущения о блокировках по IP и кэшировании перестали работать в эпоху дешёвых прокси-сетей и ИИ-краулеров.

В середине-конце июня 2026 года Read the Docs пережил крупнейшую атаку за свою историю: инцидент длился почти десять дней. В пике сервис получал 5,5 миллиона запросов в минуту против обычного суточного пика менее 100 тысяч — более чем в 50 раз выше нормы и более чем в 10 раз крупнее всего, с чем сервис сталкивался раньше.

Атака была распределённой: вредные запросы шли с миллионов уникальных IP-адресов из сотен сетей (ASN) по всему миру, включая residential IP-блоки и хостинг-провайдеров, одновременно из всех стран. Разбор команды Read the Docs полезен не столько перечнем мер, сколько тем, какие допущения о защите публичного сервиса перестали работать.

Что именно атаковали

Целями были сразу несколько поверхностей: публичная документация сообщества, коммерчески размещённая документация и панели управления для авторов, требующие входа.

Ключевая механика — охота за промахами кэша. Такой запрос дороже кэшированного: кэшированный отдаёт периферия, а промах доходит до исходных серверов и ложится на них нагрузкой — именно поэтому атакующие стремились находить некэшируемые пути. Атакующие целенаправленно искали URL, которые не кэшируются на периферии:

  • несуществующие страницы с уникальными путями (404);
  • временные редиректы (302).

Атака началась на небольшом числе доменов, где были обнаружены временные редиректы (302), которые не кэшировались на периферии и обслуживались Python-бэкендом, а не Nginx. Определяли они это по скорости ответа CDN: если запрос кэшируется, ответ приходит быстро, если нет — медленнее. Найти несколько некэшируемых запросов достаточно, чтобы получить вектор атаки.

Отдельно атакующие рандомизировали HTTP-заголовки и параметры TLS-соединений, чтобы обойти сигнатурные фильтры (JA3/JA4).

«Йо-йо»-ритм против автоскейлинга

Атакующие знали, что перед сервисом стоит WAF с лимитами, и подбирали тактику, чтобы наносить ущерб вопреки им. Они наращивали нагрузку, чтобы выявить пороги срабатывания лимитов, а затем отступали, давая окнам лимитов истечь, — такое поведение в разборе называют «йо-йо»-ритмом.

Цель — вызывать периодическую деградацию сервиса. Без кэширования и лимитов сервис просто расширяется под нагрузку за счёт владельца: чем больше запросов, тем больше машин приходится держать запущенными, и тем дороже обходится атака.

Предыстория: почему лимитов по IP хватало годами

До июня 2026 года защита Read the Docs опиралась на допущение, что распределённые атаки можно сдерживать блокировками по IP. У сервиса было множество правил ограничения скорости, основанных на IP.

Прежние атаки были проще и не настолько распределёнными. Новая оказалась более распределённой, быстро адаптировалась к защите и целенаправленно била по областям, обходящим кэширование. Блокировка по IP для распределённых атак признана устаревшей: ботнеты и крупные скраперы используют прокси-сервисы, которые делают простые IP-блоки бесполезными.

Картина угроз менялась постепенно: примерно два года назад начался заметный рост, связанный с распространением ИИ-краулеров, и стало просто подключить сгенерированный ИИ скрапер к прокси-сети. ИИ-инструменты и прокси-сети делают такие атаки дешевле и доступнее — они перестают быть уделом крупных корпоративных целей и становятся базовой реальностью для любого публичного сервиса.

Реакция: первые полчаса

Атаку обнаружили, когда сработала страница дежурного: команда эксплуатации была вызвана из-за короткого сбоя в течение нескольких минут. Пользователи могли не заметить сбоя, потому что уже закэшированная документация продолжала отдаваться.

Первое тактическое решение — перенести обслуживание временных редиректов (302) на периферию Cloudflare вместо собственных серверов. Сделали это примерно за полчаса. Логика простая: самый быстрый запрос — тот, который обслуживается CDN или WAF, потому что до origin он не доходит вовсе.

Показательный эпизод — жёстко заданный редирект Nginx (простая директива rewrite с регулярным выражением). Такой редирект обычно легко выдерживает тысячи запросов в секунду, но атакующие перегружали его трафиком, достаточным для отбрасывания запросов даже на горизонтально масштабируемой инфраструктуре.

Что это меняет на практике

Разбор формулирует несколько выводов, применимых к любому публичному сервису.

Блокировка по IP устарела для распределённых атак. Взамен нужны более широкие лимиты — не только по IP, но и по ASN, именам хостов и другим признакам. Read the Docs применяла правила по тысячам хостов и сотням тысяч поддоменов, по ASN, отпечаткам браузера и их комбинациям.

Кэшировать нужно агрессивно. Первая линия защиты — CDN, при которой до origin доходит минимум запросов. Кэш конкретного сайта документации сбрасывается при обновлении. Даже очень короткоживущие кэшированные ответы через заголовок Cache-Control для редиректов и обычных ответов 200 помогают: атакующие определяют некэшируемые запросы именно по скорости ответа CDN. Ответы 200 всегда кэшируются и почти не создают проблем — а вот избыток редиректов и 404 служит сигналом для ограничения скорости.

Защищать поверхности промахов кэша. Атакующие активно ищут некэшируемые пути: динамические редиректы, поисковые эндпоинты, 404. Когда дорогих запросов становится слишком много, Read the Docs ограничивает скорость по отпечатку браузера, ASN или конкретному домену — такие правила в разборе называют «penalty box»: это набор правил, который при избытке дорогих запросов начинает ограничивать скорость по отпечатку браузера, ASN или целому домену.

Целевые проверки лучше грубых инструментов. Вместо сплошного JavaScript-челленджа применялись ограничение скорости и целевые проверки вместе с кэшированием и переносом функций на периферию. Сочетание эвристик управления ботами с лимитами позволило смягчить атаку с минимальным влиянием на легитимных пользователей.

Инфраструктура как код. Управление правилами периферии и WAF через Terraform дало возможность быстро и безопасно ревьюить, тестировать, версионировать и раскатывать сложные фильтрующие правила.

Escape hatch для реальных пользователей

Отдельное решение — всегда давать реальным пользователям возможность выйти из-под ограничений. Read the Docs очень редко выдаёт полные блокировки или баны конкретным IP либо user agent. Вместо этого применяется «худшая» мера — проверка, которую человек проходит незаметно, а автоматический скрипт — нет. Если пользователь её проходит, его, скорее всего, больше не будут проверять в течение примерно следующих суток.

Ограничения и открытые вопросы

Разбор не приводит точных дат начала и окончания атаки — только период «середина-конец июня 2026 года» и продолжительность «почти десять дней». Не раскрывается и то, как именно завершился инцидент: описанные меры — перенос редиректов на периферию, лимиты по ASN и отпечаткам, «penalty box» — поданы как набор защиты, а не как хронология с точкой выхода из атаки.

Источники

Похожее