В середине-конце июня 2026 года Read the Docs пережил крупнейшую атаку за свою историю: инцидент длился почти десять дней. В пике сервис получал 5,5 миллиона запросов в минуту против обычного суточного пика менее 100 тысяч — более чем в 50 раз выше нормы и более чем в 10 раз крупнее всего, с чем сервис сталкивался раньше.
Атака была распределённой: вредные запросы шли с миллионов уникальных IP-адресов из сотен сетей (ASN) по всему миру, включая residential IP-блоки и хостинг-провайдеров, одновременно из всех стран. Разбор команды Read the Docs полезен не столько перечнем мер, сколько тем, какие допущения о защите публичного сервиса перестали работать.
Что именно атаковали
Целями были сразу несколько поверхностей: публичная документация сообщества, коммерчески размещённая документация и панели управления для авторов, требующие входа.
Ключевая механика — охота за промахами кэшаcache miss, ситуация, когда запрос не может быть обслужен из кэша и доходит до исходного сервера. Такой запрос дороже кэшированного: кэшированный отдаёт периферия, а промах доходит до исходных серверов и ложится на них нагрузкой — именно поэтому атакующие стремились находить некэшируемые пути. Атакующие целенаправленно искали URL, которые не кэшируются на периферии:
- несуществующие страницы с уникальными путями (404);
- временные редиректы (302).
Атака началась на небольшом числе доменов, где были обнаружены временные редиректы (302), которые не кэшировались на периферии и обслуживались Python-бэкендом, а не Nginxвеб-сервер и обратный прокси, обычно отдающий статику и редиректы без обращения к прикладному коду. Определяли они это по скорости ответа CDN: если запрос кэшируется, ответ приходит быстро, если нет — медленнее. Найти несколько некэшируемых запросов достаточно, чтобы получить вектор атаки.
Отдельно атакующие рандомизировали HTTP-заголовки и параметры TLS-соединений, чтобы обойти сигнатурные фильтры (JA3/JA4).
«Йо-йо»-ритм против автоскейлинга
Атакующие знали, что перед сервисом стоит WAFweb application firewall, фильтр запросов на уровне приложения с лимитами, и подбирали тактику, чтобы наносить ущерб вопреки им. Они наращивали нагрузку, чтобы выявить пороги срабатывания лимитов, а затем отступали, давая окнам лимитов истечь, — такое поведение в разборе называют «йо-йо»-ритмом.
Цель — вызывать периодическую деградацию сервиса. Без кэширования и лимитов сервис просто расширяется под нагрузку за счёт владельца: чем больше запросов, тем больше машин приходится держать запущенными, и тем дороже обходится атака.
Предыстория: почему лимитов по 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Инструмент инфраструктуры как кода, через который в разборе управляли правилами ограничения скорости, периферии и WAF. дало возможность быстро и безопасно ревьюить, тестировать, версионировать и раскатывать сложные фильтрующие правила.
Escape hatch для реальных пользователей
Отдельное решение — всегда давать реальным пользователям возможность выйти из-под ограничений. Read the Docs очень редко выдаёт полные блокировки или баны конкретным IP либо user agentстрока, которой браузер представляется серверу и по которой сервис отличает один клиент от другого. Вместо этого применяется «худшая» мера — проверка, которую человек проходит незаметно, а автоматический скрипт — нет. Если пользователь её проходит, его, скорее всего, больше не будут проверять в течение примерно следующих суток.
Ограничения и открытые вопросы
Разбор не приводит точных дат начала и окончания атаки — только период «середина-конец июня 2026 года» и продолжительность «почти десять дней». Не раскрывается и то, как именно завершился инцидент: описанные меры — перенос редиректов на периферию, лимиты по ASN и отпечаткам, «penalty box» — поданы как набор защиты, а не как хронология с точкой выхода из атаки.