💾 Archived View for betahowto.duckdns.org › yggdrasil:spoofing_theory captured on 2024-03-21 at 15:45:06. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2024-02-05)
-=-=-=-=-=-=-
В контексте сетевой безопасности spoofing attack (англ. spoofing — подмена) — ситуация, в которой один человек или программа успешно маскируется под другую путём фальсификации данных и позволяет получить незаконные преимущества. По большей части спуфингом называется подмена IP, к которому обращается пользователь, чтобы в итоге он попал на ресурс злоумышленника вместо целевого. Такая атака является вариацией man-it-the-middle атаки (атака типа "человек по середине"), но с оговоркой: злоумышленник оказывается не по середине, а на месте второго собеседника и под его адресом. В некоторых случаях (например, спуфинг DNS) выявить подобную атаку сразу не представляется возможным.
В отношении Yggdrasil, где адрес выводится математически, а топология не является ответственностью уполномоченных лиц, единственный сценарий спуфинга -- подбор злоумышленником пары ключей, которые образуют нужный адрес. За IPv6 Yggdrasil отвечает публичный ключ Curve25519 (x25519) (параметр EncryptionPublicKey в конфиге), а вернее хеш SHA512 от него. Учитывая факт свободного обмена открытыми ключами в сети, некоторый человек решит, что наилучшая атака -- магическим образом восстановить секретный ключ из открытого. Именно секретный ключ (EncryptionPrivateKey в конфиге) отвечает за расшифровку трафика, направляемого в адрес, вычисленного по открытому ключу. Но такое мнение является ошибочным: восстановить секретный ключ из публичного математически невозможно. Реальная модель атаки банальна: перебор ключей в поисках нужного адреса. В теории эта атака вполне возможна, но на практике в настоящее время неосуществима: закрытый ключ, из которого затем извлекается и используется публичный, составляет 32 байта (32 байта = 256 бит = 2256 = 3 115 792 089 237 316 195 423 570 985 008 687 907 853 269 984 665 640 564 039 457 584 007 913 129 639 936 вариаций).
/yggdrasil:yggdrasil-address-algorithm.png?600
Сделав вывод, что мечты о словаре со всеми возможными ключами пока что являются влажными мечтами, пойдем дальше -- к SHA512. Шестнадцатиричный адрес IPv6 в Yggdrasil, который кажется привычным, как раз образуется из этого хеша. Это наглядно иллюстрирует рисунок справа. Хеш SHA512 имеет фиксированную длину в 64 байта, что вызывает вопросы, т.к. длина IPv6 всего (!) 16 байт. Первый байт "0x02" является константой, поэтому фактически адрес Yggdrasil не 128 бит, а 120. Оставшиеся байты хеша отбрасываются. Итого IPv6 адрес Yggdrasil имеет 2120 = 1 329 227 995 784 915 872 903 807 060 280 344 576 вариаций. Подбирать подобное значение "в лоб" все равно не вызывает энтузиазма. Более того, из рассчета, что 15 байт берутся из 64 байт хеша, в теории появляется весьма реальная вероятность коллизий: нахождения одинаковых IPv6 с разными публичными ключами, т.к. Yggdrasil использует лишь ~1/4 часть уникального хеша SHA512. С учетом коллизий, есть возможность найти (в абстрактной теории) нужный адрес, но с другим ключом. Был проведен тест, в рамках которого в сети находилось два узла с одинаковыми ключами. Ничего страшного с сетью не случилось: пакеты просто периодически шли то на один, то на другой узел, т.е. по факту терялись. Предсказать поведение в случае одинаковых адресов, но разных ключей -- нетривиальная задача. Можно сказать точно, что это нарушит обращение к обоим узлам.
Разработчики Yggdrasil постарались усложнить подбор адресов. Как видно на иллюстрации, второй байт адреса -- это количество лидирующих единиц в хешэ. Затем лидирующие единицы и первый ноль срезаются, оставшиеся байты составляют тело адреса. Получается, первые непрерывно идущие единичные биты создают дополнительный фактор уникальности адреса. __Отсюда выходит понятие "высокого адреса" -- адреса с наибольшим значением во втором байте__. Вероятность подобрать нужную последовательность 14 байт IPv6 сильно падает, т.к. напрямую зависит от количества лидирующих единиц в хеше -- 15-го байта. Исходя из этого имеет смысл майнить "высокие адреса" для своих проектов. Это займет относительно немного времени, но обеспечит дополнительную уверенность в доступности веб-ресурса. Особенно это актуально при использовании адреса из подсети 0300::/64 ( gemini://betahowto.duckdns.org/yggdrasil:subnet_setting ), где для спуфинга требуется подобрать не 120 бит, а всего лишь первые 56 бит адреса IPv6. Чем выше адрес IPv6, тем большее количество байт хеша нужно подобрать. В этом и заключается польза адресов высокого порядка.
gemini://betahowto.duckdns.org/yggdrasil:subnet_setting