Как не стать ботом в Bittorrent DHT и других P2P сетях

    image

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

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

    Порт номер 1



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

    Зеркала



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

    Флуд портами



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

    Токен



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

    Таймер



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

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



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

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



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

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

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



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

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



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

    Отправляем пинг перед ответом



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

    Заключение



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

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

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

      Но изложение… Скомкано как-то. Как будто автора осенило и он, пока не забыл, быстренько накидал мини-статейку.
        0
        Статья действительно написана быстро.
        0
        Кстати, по пункту «Храним базу узлов».
        Какое количество оптимально? 255, 1024? Сколько лучше. Ведь чем база больше, тем дольше проверка по ней, а чем короче, тем больше шанс, что все узлы в базе будут мертвы.
          0
          На данный момент в базе 6000 узлов. База весит 3МБ. Скорость входа зависит не от количества записей а от того когда найдем в ней активные узлы. Я не ограничиваю размер базы. Перебор пройсходит великим Random.
            0
            База годичной давности позволила войти в сеть за 30 минут. С учетом того что порт не прописан в конфигурации NAT.
            0
            Мне, как пользователю торрент-клиента, ответа на вопрос в посте не дали, насколько я понимаю?
            Тогда зачем такой жёлтый заголовок: «Как не стать ботом в Bittorrent DHT и других P2P сетях»?
              0
              Статья для программистов. Пользователю только правильный клиент использовать. Для того чтобы понять какой правильный их надо протестировать на эти уязвимости.
                0
                А есть ли такой софт, который бы эмулировал указанные уязвимости в тестовой p2p-сети?
                  0
                  Не знаю. Я наверно не правильно понимаю ваш вопрос.
                    0
                    Может у вас появится желание сделать такую утилитку?
                      0
                      Вы хотите чтобы я написал программу которая тестирует эти уязвимости или клиент который им подвержен?
                        0
                        Которая тестирует: то есть притворяется обычным пиром и отправляет некорректные пакеты.
                +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

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое