Это пока черновик, я запутался в математике

Когда впервые запускаешь Yggdrasil, в конфиге появляется случайно сгенерированный ключ и соответствующий ему IPv6-адрес вида 200:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx и почти такой же адрес выделяемой подсети 300:xxxx:xxxx:xxxx:xxxx::/64. Многие считают, что сменить его стоит лишь ради “красивого” адреса с :cafe: или :babe:. Это опасное заблуждение. Выбор адреса — вопрос криптографической стойкости вашей ноды. Объясню почему.

Как формируется адрес и где кроется уязвимость#

В Yggdrasil адрес генерируется из публичного ключа ed25519:

  1. Берётся хеш SHA512 от публичного ключа
  2. Количество лидирующих единиц (подряд идущих битов 0 с начала хеша) определяет “ранг” адреса
  3. Оставшиеся байты хеша формируют остальную часть адреса

Примеры:

  • 200:: / 300:: — 0 дополнительных лидирующих единиц после первых 7 фиксированных битов
  • 220:: / 320:: — 32 лидирующих единиц
  • 230:: / 330:: — 48 лидирующих единиц

Казалось бы, 2^112 вариантов ключей делают подбор полного адреса невозможным. И это верно для полного 128-битного адреса. Проблема возникает с подсетями. Инцидент 27 января 2026 года подтвердил реальность уязвимости.

О взломе#

26 января группа хакеров Boykisser Group провела демонстрационную атаку на публичные подсети, начинающиеся с 300::, 301::, 302::. При обращении к сервисам в этих подсетях пользователи видели заглушку с сообщением о компрометации. К счастью, группа действовала в белых целях: основное их требование к владельцам ресурсов — повысить криптографическую стойкость адресов.

Уязвимость подсетей: почему 64 бита — это мало#

Каждый адрес Yggdrasil автоматически предоставляет подсеть /64 — теоретически вы можете хостить до 2^64 сервисов на одном ключе, используя разные адреса вида ваш_адрес::1, ваш_адрес::2 и т.д.

Но здесь кроется фатальный недостаток архитектуры:

Маршрутизация в Yggdrasil учитывает только первые 64 бита адреса. Младшие 64 бита (суффикс подсети) влияют лишь на локальную доставку пакетов.

Это означает, что злоумышленник может:

  1. Найти ключ, у которого первые 64 бита совпадают с вашим адресом
  2. Подключиться к сети и принимать/перехватывать трафик, предназначенный вашим сервисам

Для низких адресов (300:XXXX:XXXX:XXXX::, 301:XXXX:XXXX:XXXX::) сложность подбора коллизии подсети составляет всего 2^48-49 операций, что достижимо подобрать за пару суток на видеокарте среднего класса. Сам я на RTX 2050 за сутки сгенерировал адрес со сложностью 2^40. Для адреса 331:: (49 нулей) сложность уже 2^97, что уже почти невозможно.

Математика риска#

Адрес Лидирующие единицы Сложность подбора коллизии RTX 2050 RX 9070 XT RTX 5090 Ферма (4×RTX 5090) Крупная ферма (16×RTX 5090)
200:: 0 ~2^112 1.2×10¹⁶ лет 3.6×10¹⁵ лет 2.4×10¹⁵ лет 6.0×10¹⁴ лет 1.5×10¹⁴ лет
220:: 32 ~2^144 5.1×10²⁸ лет 1.5×10²⁸ лет 1.0×10²⁸ лет 2.6×10²⁷ лет 6.4×10²⁶ лет
230:: 48 ~2^160 3.3×10³³ лет 1.0×10³³ лет 6.7×10³² лет 1.7×10³² лет 4.2×10³¹ лет
300:: 0 ~2^48 8 мес. 2 мес. 2 мес. 2 нед. 3 дня
301:: 1 ~2^49 1.3 года 5 мес. 3 мес. 3 нед. 6 дней
320:: 32 ~2^80 2.7 млрд лет 833 млн лет 556 млн лет 139 млн лет 35 млн лет
330:: 48 ~2^96 1.8×10¹⁴ лет 5.5×10¹³ лет 3.6×10¹³ лет 9.1×10¹² лет 2.3×10¹² лет

Примечание:

  • Хешрейты: RTX 2050 ≈ 7 MH/s, RX 9070 XT ≈ 23 MH/s, RTX 5090 ≈ 34.5 MH/s (+50% к RX 9070 XT) для конкретного майнера yggdrasil-vanity. Были сообщения, что некоторым удалось добиться в скорости 1 миллиард адресов секунду.
  • Для адресов 200::/220::/230:: атака нереалистична даже на крупных фермах.
  • А вот 300:: и 301:: — уязвимы: их можно подобрать за дни–месяцы даже на одной видеокарте.
  • Уже начиная с 320:: (32 лидирующих единицы) сложность превышает практические возможности современных систем.

Таким образом, адреса вида 3xx:: с малым числом лидирующих единиц — критически небезопасны, если вы используете подсети. Рекомендуется минимум 310::, а лучше — 320:: или выше.

Практические рекомендации#

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

Намайните высокий адрес

Инструменты:

  • yggdrasil-vanity — майнер на OpenCL/CUDA

  • Пример запуска:

    ./yggdrasil-vanity -f results.csv
    

    После получения ключа замените поле PrivateKey в /etc/yggdrasil.conf и перезапустите сервис.

    Также, если хотите найти какую-то комбинацию, то у данной утилиты есть ключ -r, в который можно передать regex правила для поиска. По-умолчанию майнер ищет адреса с большим и большим количеством лидирующих единиц. Нашёл с 10, допусимм, значит дальше ищет >10.

    тут примеры надо сделать. Адреса выводятся в формате 200:324d:0:93:21dc:0:2:caaa. Надо для такого сделать regex.

Адрес (пример) Лидирующие единицы Сложность подбора (2ⁿ) RTX 2050 (7 MH/s) RX 9070 XT (23 MH/s) RTX 5090 (~34.5 MH/s)
200:xxxx:... 0 2⁰ = 1 < 0.1 мс < 0.1 мс < 0.1 мс
20a:xxxx:... 10 2¹⁰ ≈ 1K < 0.1 мс < 0.1 мс < 0.1 мс
214:xxxx:... 20 2²⁰ ≈ 1M ~0.1 с ~0.03 с ~0.02 с
21e:xxxx:... 30 2³⁰ ≈ 1B ~2.5 мин ~45 сек ~30 сек
220:xxxx:... 32 2³² ~10 мин ~3 мин ~2 мин
228:xxxx:... 40 2⁴⁰ ~70 часов ~22 часа ~15 часов

🔍 Как вычисляется префикс адреса:
Первый байт IPv6-адреса в Yggdrasil равен 0x20 + n, где n — количество лидирующих единиц, выраженных в шестнадцатеричном виде и уложенных в один байт.
Например:

  • 10₁₀ = 0x0a → 200 + 0x0a = 0x20a20a::
  • 20₁₀ = 0x14 → 214::
  • 32₁₀ = 0x20 → 220::
  • 40₁₀ = 0x28 → 228::
  • 48₁₀ = 0x30 → 230::

Таким образом, чем больше лидирующих единиц — тем «выше» первый сегмент адреса, и тем безопаснее ваша нода при использовании подсети.

Заключение#

Выбор адреса в Yggdrasil — не про «красивые цифры», а про криптографическую стойкость. Низкий адрес с подсетью — это как использовать пароль 123456 для админки: технически работает, но приглашает к атаке.

Помните: в децентрализованной сети вы — сами себе администратор безопасности. И первый шаг к защите начинается с генерации ключа.