Защита Tor на базе proof-of-work: DDoS на onion-сервисы обходится дорого
Onion-сервис под флудом не может сделать того, что делает обычный сайт: ограничивать по IP нечего - ни посетители, ни атакующие свой адрес не раскрывают. Ответ Tor, появившийся в Tor 0.4.8 и анонсированный в блоге проекта в августе 2023 года, - назначить этапу представления цену в процессорном времени. Дизайн восходит к предложению 327, написанному в апреле 2020 года George Kadianakis, Mike Perry, David Goulet и tevador, где суть проблемы сформулирована прямо: построение rendezvous-цепочек дорого и для сервиса, и для сети, и одно лишь ограничение скорости этого никогда не меняло.
Головоломка, которая появляется только под нагрузкой
Схема прозрачна в смысле протокола: дополнительного кругового запроса-задания нет. Параметры головоломки лежат внутри дескриптора onion-сервиса, который клиенты и так загружают: метка версии, 32-байтовый seed, предложенный уровень усилия и срок действия. Пока предложенное усилие равно нулю, защита спит, и introductions идут ровно как раньше. Заметив перегрузку, сервис поднимает предложенное усилие. Клиенты тогда решают Equi-X - головоломочную функцию из спецификации предложения - над заданием, собранным из строки персонализации, ослеплённого ID сервиса, seed, случайного 16-байтового nonce и выбранного усилия. Решение размером около 43 байт едет внутри ячейки INTRODUCE1 как расширение. Согласно блогу Tor, первое решение стоит около 5 миллисекунд на быстрой машине и до примерно 30 на медленной; под продолжительной атакой требуемая работа может подбираться к минуте вычислений.Очередь платит усилием
Проверка решения намеренно дешёвая; дорогая часть - построение rendezvous-цепочки - откладывается. Прошедшие проверку запросы попадают в очередь с приоритетом по заявленному усилию, при равенстве побеждают более старые записи, а планировщик разбирает её в управляемом темпе. Сложность следует циклу «прибавь при росте, умножай при спаде» в 300-секундных окнах: пока очередь насыщена, сервис поднимает усилие до прежнего значения плюс один или до среднего усилия обработанных introductions - что больше; когда давление спадает, усилие уменьшается примерно на треть. Клиенты повторяют с нарастающим усилием - удвоение ниже 1 000, затем умножение на 1,5 - в границах, которые спецификация задаёт как 8 и 10 000. Seed'ы меняются примерно каждые два часа, прежний seed ненадолго остаётся валидным во избежание гонок.Почему обычные пользователи почти ничего не замечают
Поскольку головоломка существует лишь пока сервис под стрессом, обычный трафик при низкой нагрузке не платит ничего. Человек, открывающий несколько страниц во время атаки, тратит миллисекунды - блог сравнивает это с ожиданием медленного соединения, - тогда как атакующий, засылающий миллионы introductions, платит за каждую. Формулировка Tor Project:"Blocks attackers while giving real users a chance to reach their destination" - блог Tor Project, август 2023
Как сервисы включают защиту
Операторы управляют защитой через torrc. Переключатели, задокументированные в руководстве проекта по DoS-защите onion-сервисов:- HiddenServicePoWDefensesEnabled - публикует головоломку в дескрипторе и включает очередь с сортировкой по усилию
- HiddenServicePoWQueueRate и HiddenServicePoWQueueBurst - с какой скоростью проверенные запросы покидают очередь
- CompiledProofOfWorkHash - глобальная опция, выбирающая хеш-функцию для головоломок










