Сеть Bittorrent DHT позволяет найти источники торрента по хешу из магнет-ссылки. Сеть состоит из узлов которые могут быть как Bittorent клиентами так и вредоносными программами которые препятсвуют нормальной работе сети. Они мешают клиенту получить источники торрента, перенаправляют запросы на атакуемые узлы, заполняют список узлов бесполезными адресами.
Пока я работал над счетчиком пиров и сидов(DHT Scrape) в этой сети я наткнулся на такие виды атаки.
Порт номер 1
Некоторые узлы выдавали список узлов где в качестве порта был указан первый. В интернете была рекомендация не соеденятся с 0 по 1024 портом. На них находятся критически важные для работы интрнета сервисы. Узел приславший адреса с портом в этом отрезке игнорируется.
Зеркала
Есть узлы которые просто возвращают обратно присланный пакет. Получается что мы спрашиваем сами себя и себе же отвечаем. Поскольку узел ответил корректно он помечается некоторыми клиентами как активный и его адрес передатся другим узлам. Для того чтобы такие узлы исключить из сети надо проверять этот вариант.
Флуд портами
Некоторые узлы выдают один и тотже IP с кучей разных портов. Такое может случиться с узлом за NAT который меняет исходящий порт узла. В таком случе если узел с таким IP и ID уже подтвержден (т.е. с ним была связь) новая информация отбрасывается. В другом случае используется последняя или случайная запись для проверки.
Токен
В каждом пакете имеется токен который позволяет определить что наш запрос попал к адресату и он нам ответил исключая тем самым атаки с подменой адреса. Но надо проверять что токен (как и остальные строки) не вылезает за рамки пакета. Это может позволить читать данные из памяти следующей за пакетом.
Таймер
Токен не панацея от входящих запросов с подельным адресом. В таком случае разрешается только 2 подряд запроса в секунду от одного IP. В случае большего количества они просто игнорируются.
Локальные адреса
Некоторые узлы возврашают локальные адреса которые соответственно недоступны из интернета. Этот также может быть внутренний адрес роутера. Эти адреса также должны игнорироваться если конечно они не получены от узла в этой же локальной сети.
Публикуем только проверенные узлы
Когда у нас спрашивают список узлов из базы узлов выбираются только те от которых мы получали корректный отет на наш запрос (активные). Остальные (неопределнные) опрашиваются постепенно и удаются из базы при отсутствии ответа (мертвые).
Сеть G2 последнее время очень страдала от того что в ней курсирует большое количество адресов мертвых узлов. Это замедляет вход в сеть и поск по ней.
Храним базу узлов
После длительного перерыва в работе клиента в базе узлов все записи становятся просроченными. Но клиент должен использовать их для входа в сеть до получения достаточного количества активных узлов. Если все узлы мертвые то клиент обращается к входным узлам. На моем опыте даже очень старая база с достаточно большим количеством узлов позволяет войти в сеть.
Фильтруем биты
Для получения количества пиров и сидов раздачи в сети используется Фильтр Блума. Поддельные узлы могут заполнить его едницами и исказить тем самым цифры. Поэтому сравниваются данные минимум от трех узлов.
Заключение
Надеюсь данная статья поможет писать более эффективные и безопасные клиенты для P2P сетей.
Комментарии (13)
Arahnid
30.07.2015 16:04Кстати, по пункту «Храним базу узлов».
Какое количество оптимально? 255, 1024? Сколько лучше. Ведь чем база больше, тем дольше проверка по ней, а чем короче, тем больше шанс, что все узлы в базе будут мертвы.ivan386 Автор
30.07.2015 17:20База годичной давности позволила войти в сеть за 30 минут. С учетом того что порт не прописан в конфигурации NAT.
Frag
30.07.2015 16:49Мне, как пользователю торрент-клиента, ответа на вопрос в посте не дали, насколько я понимаю?
Тогда зачем такой жёлтый заголовок: «Как не стать ботом в Bittorrent DHT и других P2P сетях»?ivan386 Автор
30.07.2015 16:57Статья для программистов. Пользователю только правильный клиент использовать. Для того чтобы понять какой правильный их надо протестировать на эти уязвимости.
IRainman
02.08.2015 07:29+1Частично проблемы, по крайней мере первую, можно решить запретив клиенту подключаться к портам наиболее известных протоколов, например у меня в сборке utoorent настроен параметр:
Параметр bt.no_connect_to_services_list в Настройки -> Дополнительноbt.no_connect_to_services_list=1,4,20,21,22,23,24,25,43,53,69,80,81,82,110,123,135,137,138,139,143,161,162,179,194,264,411,412,443,445,465,587,593,989,990,992,993,995,1027,1080,1194,1200,1293,1721,1723,3128,3724,3389,3544,3899,4080,4081,4090,4500,4899,5004,5005,5800,5900,5938,6665,6666,6667,6668,6669,6679,6697,8008,8080,8090,8118,8123,9030,9050,9051,9150
Arahnid
Мысли интересные и верные. По некоторым пунктам совпадает с моими мыслями 1:1.
Но изложение… Скомкано как-то. Как будто автора осенило и он, пока не забыл, быстренько накидал мини-статейку.
ivan386 Автор
Статья действительно написана быстро.