Протокол головоломки с управляемым туром

Протокол головоломки с управляемым туром (англ. Guided tour puzzle protocol, GTP) — это криптографический протокол, предназначенный для смягчения атак типа отказа в обслуживании на уровне приложений. Он создан для преодоления недостатков протоколов головоломок, основанных на вычислениях, в которых клиентам необходимо решать трудоёмкие задачи, требующие значительных процессорных или оперативных ресурсов и благоприятствующих клиентам с сильной вычислительной мощностью. Протокол головоломки с управляемым туром рассматривается как разновидность протокола доказательства выполнения работы (Proof-of-Work, POW).

Обзор

Протокол головоломки с управляемым туром близок по шагам к Client Puzzle Protocol. Каждый клиент должен пройти такой тур-головоломку до получения обслуживания от сервера, если сервер подозревает атаку или его загрузка превысила предустановленный порог. В упрощённом виде, головоломка с управляемым туром представляет собой прохождение тура, требующего совершения нескольких циклов «туда-обратно» к специальным узлам — «экскурсоводам» — в определённой последовательности. Эта последовательность неизвестна клиенту заранее, и только каждый очередной экскурсовод сообщает клиенту, к какому стоит обращаться следующим, чтобы пройти все точки тура в правильном порядке. Одна и та же точка-экскурсовод может встречаться в туре несколько раз, поэтому отдельный её проход называется «остановкой». Клиент узнаёт адрес следующей точки только после взаимодействия с текущей.

Решение головоломки заключается в прохождении тура в нужном порядке. Начав с первой «остановки», клиент связывается с каждым экскурсоводом и получает ответ, включающий уникальный токен. Токен из ответа текущей точки нужен для вычисления адреса следующей; первая точка вычисляется на основе токена, полученного от сервера при начале головоломки.

Клиент должен передавать полученный токен от текущего экскурсовода следующему, который использует его для собственной функции генерации токена. После завершения тура токен от последнего экскурсовода вместе с исходным токеном сервера отправляется обратно на сервер в подтверждение прохождения. Сервер может быстро проверить их корректность и предоставляет услугу лишь после успешной валидации[1].

Ход протокола

undefined

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

Детали каждого этапа протокола:

  • Запрос на услугу: Клиент отправляет серверу запрос. Если нагрузка нормальная — запрос обрабатывается стандартно; если сервер перегружен — инициируется «генерация головоломки».
  • Генерация головоломки: Сервер отвечает клиенту сообщением с заданием закончить управляемый тур. В сообщении содержатся длина тура и хеш , вычисляемый по формуле:
где — конкатенация, — уникальный идентификатор клиента (например, IP-адрес), — усечённая временная метка, а — криптографическая хеш-функция (например, SHA-1).
  • Решение головоломки: Клиент вычисляет индекс экскурсовода для -й остановки по формуле:
где . При контакте клиента , экскурсовод вычисляет хеш () по формуле:
где — номер остановки, — общий ключ экскурсовода и сервера. После получения ответа сервера клиент вычисляет индекс по формуле для и отправляет набор (, , ) экскурсоводу , где второе значение указывает текущую остановку. В ответ он получает , вычисляемый по формуле для . Далее клиент повторяет процесс раз, обращаясь к экскурсоводам . Последний ответ и исходный клиент отправляет серверу — это его решение.
  • Проверка: Сервер, получив связку (, ), сначала сверяет с ранее вычисленным значением по формуле для . При совпадении он пересчитывает цепочку хешей по формуле для и сверяет с финальным результатом . Если оба значения корректны, ресурсы для запроса выделяются. Поскольку сервер знает все секретные ключи (), он может восстановить всю цепочку без взаимодействия с экскурсоводами. Сервер и экскурсоводы должны использовать близко синхронизированные часы для корректных вычислений.

Сравнение с другими головоломками

Вычислительно-сложные протоколы головоломок позволяют смягчить атаки отказа в обслуживании: чем активнее атакующий, тем больше головоломок ему приходится решать за счёт собственных ресурсов. Однако клиенты с мощным оборудованием способны решать головоломки быстрее менее обеспеченных, вытесняя обычных пользователей[1][2][3][4].

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

Протокол головоломки с управляемым туром накладывает на клиента не вычислительную, а сетевую задержку через циклы туда-обратно. Таким образом, скорость поступления запросов регулируется задержками обработки, очередей и распространения на промежуточных маршрутизаторах, находящихся вне контроля конечных клиентов. Даже злоумышленник с большими вычислительными ресурсами не может получить преимущество относительно обычных пользователей[1].

Для клиента вычисления практически несложны, а сам тур состоит, как правило, из нескольких десятков обменов — тем самым нагрузка на канал ничтожна. Клиенты не несут дополнительных затрат, характерных для протоколов с вычислительными или память-ёмкими головоломками.

Примечания

Литература

  • Mehmud Abliz, Taieb Znati. A Guided Tour Puzzle for Denial of Service Prevention. В сборнике Proceedings of the Annual Computer Security Applications Conference (ACSAC) 2009, стр. 279–288, Гонолулу, Гавайи, декабрь 2009.
  • Martin Abadi, Mike Burrows, Mark Manasse, Ted Wobber. Moderately Hard, Memory-bound Functions. В сборнике Proceedings of NDSS 2003, стр. 25–39, 2003.
  • Cynthia Dwork, Andrew Goldberg, Moni Naor. On Memory-Bound Functions for Fighting Spam. В сборнике Proceedings of CRYPTO 2003, стр. 426–444, 2003.