Призыв к действию: тестирование и совершенствование asmap

Аннотация. Этот материал написан автором и исследователем Bitcoin Core Глебом Науменко. Глеб получил грант 100x Group для разработчиков биткоина. В этой статье Глеб пишет об особенностях соединения системы Bitcoin Core с другими узлами сети. Вначале Глеб рассказывает о новых правилах подключения, которые по умолчанию используются в Bitcoin Core 0.20.0, и объясняет, почему обновленная система может иметь слабые места, которые делают ее уязвимой для хакерских атак типа Eclipse. Далее Глеб рассказывает о потенциально более надежном экспериментальном методе предотвращения атак, известном как «asmap». В заключение Глеб дает рекомендации по тестированию новой функции. Тестирование помогает сделать эффективные методы обеспечения безопасности более доступными.

Схема нового метода выбора пиров в системе Bitcoin Core

Призыв к действию: тестирование и совершенствование asmap

В Bitcoin Core 0.20 появилась новая функция asmap, предназначенная для улучшения диверсификации пиров в сети. Об asmap даже написали профильные СМИ, но пока эта функция является экспериментальной и предназначена для продвинутых пользователей, так как ее нужно специально активировать (т.е. она не активна по умолчанию).

Это материал призван помочь операторам узлов в использовании/тестировании механизма asmap. Использование операторами узлов (а не только горсткой разработчиков Bitcoin Core) будет чрезвычайно полезным для широкомасштабного тестирования этой функции, благодаря которому она будет использоваться по умолчанию для выбора пиров в будущих версиях Bitcoin Core. Станьте одним из первых пользователей новых функций обеспечения безопасности Bitcoin Core, помогите сделать их надежными и простыми в использовании и внесите свой вклад в развитие связанных утилит для системы биткоина!

Вначале мы рассмотрим предпосылки возникновения и основы asmap. Если вы уже знакомы с протоколом Border Gateway Protocol (BGP) и идеями, лежащими в основе asmap, вы можете сразу перейти к разделу «Призыв к действию».

Предпосылки возникновения: подключение, атаки Еclipse и шпионаж

На сегодняшний день каждый узел Bitcoin Core по умолчанию устанавливает 10 соединений (8 полноценных соединений и 2 соединения только для передачи блоков). Эти соединения используются для отправки и получения данных транзакций, блоков и других, менее важных, сообщений.

Правила подключения по умолчанию в системе Bitcoin Core 0.20.0

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

Изоляция узла от добросовестных узлов известна как «атака Eclipse». Она позволяет злоумышленнику похитить средства [12], шпионить за транзакциями и в целом снижает эффективность майнинга жертвы. Атака Eclipse  —  разновидность атаки Sybil; используя больше вредоносных узлов, злоумышленник повышает успешность атаки.

Даже если только 7 из 10 исходящих соединений жертвы контролируются злоумышленником, это все равно очень опасно, так как значительно упрощает привязку транзакций к IP-адресу жертвы.

Чтобы сделать такие атаки более затратными, Bitcoin Core начала диверсифицировать соединения между пирами с помощью так называемого сетевого группирования (netgroup bucketing). Например, простой IP-адрес вроде «172.16.254.1» Bitcoin Core подключает максимум к одному IP-адресу типа «172.16.ХХХ.Х» (если это возможно).

Таким образом планировалось затруднить злоумышленникам создание вредоносных/фальшивых узлов в различных сетевых группах, т.к. считается, что сетевые группы примерно соответствуют определенным регионам и интернет-провайдерам, поэтому запуск фальшивых узлов потребует договоренностей со многими лицами и сделает массовые атаки менее выгодными.

В данном случае речь идет о злоумышленнике, использующем не менее 1000 фальшивых узлов ради призрачного шанса пошпионить и, возможно, не менее 10 000 фальшивых узлов для осуществления атак Еclipse (в расчете на текущий размер сети доступных узлов). Вот почему диверсификация так важна; в таких масштабах одно дело – арендовать ряд последовательных IP-адресов у одного провайдера, и совсем другое – собрать минимальный набор IP-адресов из разных сетевых групп.

К сожалению, расчет на соответствие сетевых групп определенным регионам и интернет-провайдерам не оправдался. За последние годы IPv4-адреса стали более «мобильными» — организации активно продают и покупают их, в результате чего привязка адреса к определенному региону во многих случаях происходит практически случайно. Например, сегодня многие последовательные ряды IP-адресов контролирует Amazon.

Новое решение: asmap

Для повышения уровня диверсификации пиров необходимо использовать более редкую и менее склонную к изменению характеристику, чем сетевые группы. В недавних исследованиях было предложено выполнять диверсификацию по номеру автономной системы (Autonomous System Number, ASN). Как правило, один ASN объединяет несколько мелких провайдеров и на сегодняшний день является относительно редкой характеристикой интернет-узлов — по крайней мере, не менее редкой, чем в свое время сетевые группы.

К счастью, получить данные ASN не составляет труда. Благодаря текущей функциональности протокола BGP каждый маршрутизатор (в том числе тот, что у вас дома) может проложить путь к определенному IP-адресу, отфильтровав несколько ASN.

Для повышения эффективности фильтра учитывается не только конечный номер ASN, к которому относится определенный IP-адрес, но и все ASN, которые необходимо пройти для попадания в конечную автономную сеть.

Автономная система (Autonomous System, AS) считается сопоставляемой, если это первая AS, выполняющая функцию шлюза для нескольких путей к целевому узлу, — качество, благодаря которому она способна в одиночку контролировать данные, которые получает и отправляет целевой узел (без аутентификации, как Bitcoin Core в настоящее время). В некоторых документах мы называем ее узким местом.

В результате этого процесса мы получаем список сопоставлений IP с ASN — карту автономной системы, то есть autonomous system map или asmap.

На сегодняшний день уже доступно программное обеспечение asmap, необходимое для диверсификации по AS. Оно включает в себя:

  • утилиту bitcoin-asmap: код для сжатия сопоставлений IP<->ASN в гораздо меньший по размеру файл asmap (размер уменьшается с 200 Мб до 1 Мб); это необходимо, чтобы облегчить распространение карты и ее использование на сетевых устройствах;
  • asmap-rs: библиотеку для генерации сопоставлений IP<->ASN на основе использования открытых данных протокола Border Gateway Protocol (BGP), а не локального вычисления пути.

Эти инструменты необходимы, чтобы упростить использование asmap и обеспечить его безопасность. 

Также не лишним будет ознакомиться с процессом интеграции asmap в систему Bitcoin Core, который обсуждался в клубе отзывов.

Призыв к действию

Лучший способ помочь нам — это использовать asmap. Ниже представлено пошаговое руководство, как это сделать.

Шаг

Описание

0

Вы должны понимать риски, связанные с использованием asmap: это пока еще экспериментальная функция, поэтому не исключено, что из-за какой-нибудь ошибки узел, использующий asmap, будет более уязвим для атак (например, атак Eclipse). Используйте ее на свой страх и риск, в идеале – в непроизводственном экземпляре.

1

Чтобы получить базовое представление, просто установите Bitcoin Core 0.20 и скачайте демо-файл asmap здесь. Перейдите к шагу 3.

2

Чтобы получить более полное представление об asmap (что гораздо более полезно в данной ситуации), выполните следующие шаги:

  • Установите Rust.
  • Перейдите в репозиторий asmap-rs и, следуя инструкциям в файле README, загрузите данные BGP с открытым кодом и сгенерируйте файл AS-сопоставлений. Возможно, вам придется установить дополнительные зависимости Rust, смотрите информацию в журналах.
  • Выполните сборку этой ветки Bitcoin Core на основе исходного кода.
  • Выполните сжатие файла сопоставлений (созданного в шаге 2b) с помощью утилиты bitcoin-asmap, как описано здесь (вам нужна функция `encode`).
  • Протестируйте другие функции bitcoin-asmap: `decode` и `lookup`.

3

Запустите тестирование узла Bitcoin Core, указав в опции конфигурации `-asmap=<filepath>` расположение сжатого файла asmap. Чтобы просмотреть справку, можно запустить `./src/bitcoind -help | grep -A4 asmap` из корневого репозитория Bitcoin Core.

4

Откройте журнал отладки узла, чтобы проверить правильность работы asmap (обратите внимание на греп для `asmap`, `mapped`, и сравните его с тем, что вы ожидали увидеть, учитывая логику asmap).

5

Чтобы просмотреть сопоставления пиров с AS, обратите внимание на новое поле `mapped_as` в службе вызова удаленных процедур (RPC) `getpeerinfo` или откройте окно GUI «Peers» (Пиры), нажмите на пира и посмотрите поле «Mapped AS» (Сопоставляемая AS), расположенное в нижней части данных пира справа.

6

(Дополнительно) Продолжайте использовать узел и некоторое время следите за журналом отладки (проверяйте его пару раз в неделю), выполняя греп `mapped`, `asmap` и `bucket` или используя скрипт.

Не бойтесь пробовать различные опции/конфигурации (например, вы можете загрузить данные только с некоторых заданных конечных точек RIPE RIS, как предусмотрено в инструкциях asmap-rs).

После этого зарегистрируйте обнаруженные проблемы на GitHub, поделитесь своими впечатлениями и оставьте комментарий для Bitcoin Core в ветке запроса на включение изменений Bitcoin-asmap! Моя электронная почта: naumenko.gs на gmail.com.

Дополнительные предложения

Инструменты asmap нуждаются в помощи разработчиков, готовых внести свой вклад!

Что вы можете сделать:

  • Найти ошибку во время тестирования (см. предыдущий раздел) и начать ее обсуждение (возможно, с последующим запросом на включение изменений для ее исправления)
  • Попытаться решить одну из проблем из нашего списка
  • Проверить исходный код и ожидающие рассмотрения запросы на внесение изменений
  • Использовать искаженные входные данные, чтобы попытаться что-нибудь сломать
  • Улучшить эффективность, регистрацию событий, взаимодействие с пользователем и т. д.

Сам код короткий и простой, но анализ его реализации потребует некоторого знания:

  • интернет-протоколов, протокола BGP и Rust (asmap-rs);
  • алгоритмов и сжатия (bitcoin-asmap)

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

Наиболее продвинутые пользователи могут попробовать отправить данные asmap со своего маршрутизатора в компрессор bitcoin-asmap. Для этого  может потребоваться предварительное форматирование, так как bitcoin-asmap работает только с входными данными определенного формата. Если вам это удастся, пожалуйста, поделитесь своими впечатлениями (желательно обо всем процессе полностью, а не только о компрессии) в комментариях ветки запроса на внесение изменений или где вам удобно.

Благодарность

Я выражаю благодарность Джону Атаку, Грегу Сандерсу и Майклу Форду (fanquake) за помощь в работе над этим материалом.

Глеб Науменко, разработчик Bitcoin Core