image

Сеть Bittorrent DHT позволяет найти источники торрента по хешу из магнет-ссылки. Сеть состоит из узлов которые могут быть как Bittorent клиентами так и вредоносными программами которые препятсвуют нормальной работе сети. Они мешают клиенту получить источники торрента, перенаправляют запросы на атакуемые узлы, заполняют список узлов бесполезными адресами.

Пока я работал над счетчиком пиров и сидов(DHT Scrape) в этой сети я наткнулся на такие виды атаки.

Порт номер 1



Некоторые узлы выдавали список узлов где в качестве порта был указан первый. В интернете была рекомендация не соеденятся с 0 по 1024 портом. На них находятся критически важные для работы интрнета сервисы. Узел приславший адреса с портом в этом отрезке игнорируется.

Зеркала



Есть узлы которые просто возвращают обратно присланный пакет. Получается что мы спрашиваем сами себя и себе же отвечаем. Поскольку узел ответил корректно он помечается некоторыми клиентами как активный и его адрес передатся другим узлам. Для того чтобы такие узлы исключить из сети надо проверять этот вариант.

Флуд портами



Некоторые узлы выдают один и тотже IP с кучей разных портов. Такое может случиться с узлом за NAT который меняет исходящий порт узла. В таком случе если узел с таким IP и ID уже подтвержден (т.е. с ним была связь) новая информация отбрасывается. В другом случае используется последняя или случайная запись для проверки.

Токен



В каждом пакете имеется токен который позволяет определить что наш запрос попал к адресату и он нам ответил исключая тем самым атаки с подменой адреса. Но надо проверять что токен (как и остальные строки) не вылезает за рамки пакета. Это может позволить читать данные из памяти следующей за пакетом.

Таймер



Токен не панацея от входящих запросов с подельным адресом. В таком случае разрешается только 2 подряд запроса в секунду от одного IP. В случае большего количества они просто игнорируются.

Локальные адреса



Некоторые узлы возврашают локальные адреса которые соответственно недоступны из интернета. Этот также может быть внутренний адрес роутера. Эти адреса также должны игнорироваться если конечно они не получены от узла в этой же локальной сети.

Публикуем только проверенные узлы



Когда у нас спрашивают список узлов из базы узлов выбираются только те от которых мы получали корректный отет на наш запрос (активные). Остальные (неопределнные) опрашиваются постепенно и удаются из базы при отсутствии ответа (мертвые).

Сеть G2 последнее время очень страдала от того что в ней курсирует большое количество адресов мертвых узлов. Это замедляет вход в сеть и поск по ней.

Храним базу узлов



После длительного перерыва в работе клиента в базе узлов все записи становятся просроченными. Но клиент должен использовать их для входа в сеть до получения достаточного количества активных узлов. Если все узлы мертвые то клиент обращается к входным узлам. На моем опыте даже очень старая база с достаточно большим количеством узлов позволяет войти в сеть.

Фильтруем биты



Для получения количества пиров и сидов раздачи в сети используется Фильтр Блума. Поддельные узлы могут заполнить его едницами и исказить тем самым цифры. Поэтому сравниваются данные минимум от трех узлов.

Заключение



Надеюсь данная статья поможет писать более эффективные и безопасные клиенты для P2P сетей.

Комментарии (13)


  1. Arahnid
    30.07.2015 12:03
    +8

    Мысли интересные и верные. По некоторым пунктам совпадает с моими мыслями 1:1.

    Но изложение… Скомкано как-то. Как будто автора осенило и он, пока не забыл, быстренько накидал мини-статейку.


    1. ivan386 Автор
      30.07.2015 12:11

      Статья действительно написана быстро.


  1. Arahnid
    30.07.2015 16:04

    Кстати, по пункту «Храним базу узлов».
    Какое количество оптимально? 255, 1024? Сколько лучше. Ведь чем база больше, тем дольше проверка по ней, а чем короче, тем больше шанс, что все узлы в базе будут мертвы.


    1. ivan386 Автор
      30.07.2015 16:25

      На данный момент в базе 6000 узлов. База весит 3МБ. Скорость входа зависит не от количества записей а от того когда найдем в ней активные узлы. Я не ограничиваю размер базы. Перебор пройсходит великим Random.


    1. ivan386 Автор
      30.07.2015 17:20

      База годичной давности позволила войти в сеть за 30 минут. С учетом того что порт не прописан в конфигурации NAT.


  1. Frag
    30.07.2015 16:49

    Мне, как пользователю торрент-клиента, ответа на вопрос в посте не дали, насколько я понимаю?
    Тогда зачем такой жёлтый заголовок: «Как не стать ботом в Bittorrent DHT и других P2P сетях»?


    1. ivan386 Автор
      30.07.2015 16:57

      Статья для программистов. Пользователю только правильный клиент использовать. Для того чтобы понять какой правильный их надо протестировать на эти уязвимости.


      1. evorios
        30.07.2015 19:37

        А есть ли такой софт, который бы эмулировал указанные уязвимости в тестовой p2p-сети?


        1. ivan386 Автор
          30.07.2015 19:49

          Не знаю. Я наверно не правильно понимаю ваш вопрос.


          1. evorios
            30.07.2015 19:51

            Может у вас появится желание сделать такую утилитку?


            1. ivan386 Автор
              30.07.2015 20:03

              Вы хотите чтобы я написал программу которая тестирует эти уязвимости или клиент который им подвержен?


              1. evorios
                30.07.2015 22:27

                Которая тестирует: то есть притворяется обычным пиром и отправляет некорректные пакеты.


    1. 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