Архитектурные уязвимости DHT
Ранее я писал про слив IP через UDP holepunching в Tox (https://forum.LIMB.cc/threads/6952/)
Проблема коснулась многих, почти никто не был в курсе того, как устроен Tox. Проблема решалась компиляцией ядра с отключением P2P функций TOX.
Это была не проблема Tox, а скорее пользователей, которые не до конца понимали, как Tox устроен.
В этой статье я расскажу про проблемы архитектуры сети Tox.
Обычно в статьях я публикую PoC, однако в связи с тем, что язвой болеют все пользователи Tox, а эта вдобавок ZeroClick и исправить её нельзя - сплоит будет опубликован через месяц. Надеюсь к этому моменту, все смогут найти альтернативы.
Для доказательства всех этих проблем на практике - я тебя взломаю:) Просто напиши свой TOXID на мой публичный ключ PGP.
Что позволяют эти уязвимости:
- Слив IP (Даже при использовании TCP relay).
- Слив TOX ID (за исключением NoSpam) и IP контактов, с которыми говорит пользователь в реальном времени, длина сообщений пользователя, время звонков или передачи файлов с их размером.
- Отключение пользователя от возможности общения с конкретными контктами, или вовсе со всеми.
Как это устроено:
У каждого пользователя в сети есть свой DHT ID, который сформирован из TOX ID.
TOX ID — [32 байта публичного ключа][4 байта NoSpam][2 байта Checksum].
DHT ID — это просто публичный ключ из TOX ID.
В моём случае это
3C9E7149AF91441534CB2DD0F72EE26BA0A113944D8A1116AF74993E4888AE4D
Этот ID в DHT воспринимается как число, которое использует собеседник для поиска контакта.
Также пользователи выступают как DHT-ноды для поиска контактов.
Что происходит, если собеседник хочет найти меня?
Допустим, в списке его сохранённых нод есть 5 человек:
9B103BE19D8F80CD63CF604F9C3C572DB2A05931F5EF85A458B9436E5387D56D
B29349D85C4BC8D7B1569EF93859C85E481A92256D13D8AD6A729CDE1A6991AF
5528A7BCF061B3F2A80674247EA4FE04C1032BBD493538EBD9A09483D70FDA1D
DCE6951EF5DC21ED708977DC3E0CE92841F344BF69E0E426D1487AB573DB0379
3B67F01BD563E6ACA9C5B82A65882E06DAD9F5B231DEF24F8D8BE2C3BB1BBBF4
Он проверяет XOR дистанцию ID каждой ноды по отношению к моему ID и выбирает ближайшую
В данном списке ближайшая:
3B67F01BD563E6ACA9C5B82A65882E06DAD9F5B231DEF24F8D8BE2C3BB1BBBF4
Этой ноде человек передаёт искомый TOXID и получает от неё её ближайшую DHT ноду к указанному адресу.
Под дистанцией подразумевается лишь логическая XOR дистанция, а не физическая или сетевая.
После получения новой ноды (её ID, IP, порта и протокола TCP/UDP) пользователь продолжает поиски таким же образом, пока в конечном счёте одна из нод по такой цепи не выдаст ID, IP, порт, протокол TCP/UDP пользователя, чьи сетевые контактные данные хотел получить пользователь.
(В нормальном сценарии будет использован UDP, про который я говорил в предидущей статье, однако если UDP отключён, будет использован TCP релей, про что скажу ниже в статье.)
В реальности запрос идёт сразу к нескольким нодам, а в этом списке приблизительно от 20 до 50 нод.
1. Фейк DHT нода (Обращение К ПОЛЬЗОВАТЕЛЮ)
Основная проблема состоит в том, что DHT ID, которые используются для маршрутизации этих данных, хоть и нельзя создать произвольно, однако можно сгенерировать большое количество таких ID и выбрать из них те, которые гораздо ближе к конкретному человеку, чем это технически возможно при обычных условиях. Эти ноды, даже при небольшом их количестве, будут использоваться для маршрутизации по отношению к конкретному человеку в связи со своей близкой XOR дистанцией.
Например, при генерации 1.700.000 адресов у меня получился такой ID
3c9e74968a7b8b86307209844671906fb1744bc6b8545ef87315bfb0f0434081
Bucket index: 21
Его XOR дистанция по отношению к моему адресу в десятиричной системе по сравнению со случайными адресами.
100723917681807602704368452940352576123037377753433545265888869035357468558363
43031670378353934529081025907356450668766808230877070555438974806224874528448
36279535870573277580374339531548263060552898104778368012815564143793027492362
110436929507253851350410508022199895464143634904104694550351965032428246991635
40524792991094776447345926343755666425520585992869261999603603162787532 <-- generated
Как видите, дистанция на порядки меньше по сравнению с обычными адресами.
Проще говоря - можно заставить собеседников человека обращаться к своей ноде. Нода сможет видеть TOXID, IP тех кто к ней обратился, и те же данные того, с кем обратившийся хочет поговорить.
2. Форсирование использования (Обращение ПОЛЬЗОВАТЕЛЯ)
Kademlia DHT устроен таким образом, чтобы хранить информацию лишь о ближайших нодах. Их число строго огранично.
Это позволяет сети перестраивать себя таким образом, чтобы по схеме которую я описал выше, было проще найти пользователя.
Всего может быть сохранено по 8 нод в 128 бакетах = 1024 ноды.
Бакет считать можно так: берём XOR из двух ID, смотрим где находится самый старший бит, который отличается.
В сгенереной ранее ноде, бакет был 21. Чем значение выше, тем приоритетнее.
На практике же, я бился в разные ноды очень долго, просто как активный пользователь... Самый высокий бакет у меня - 6, а нод собралось всего 40...
Если бакеты пользователя забить нодами на разных значениях - он будет взаимодействовать с сетью лишь через подконтрольные ноды, как и другие люди с ним
3. Onion routing? Адекватного Routing вообще не существует...
Вы возможно слышали о Onion в Tox. На самом деле он использован не для передачи ваших сообщений, а лишь для DHT, чтобы в обратной последовательности по нодам вернуть сетевые данные контакта. Это не имеет связи с Tor.
Учитывая проблемы выше, никакой нормальной маршрутизации не будет, пользователь вообще больше не увидит реальную tox сеть.
Пользователь обращается к ноде хакера c запросом о поиске контакта, нода находит у себя другие ноды, которые ближе по ID, как и в реальном сценарии.
Далее, в зависимости от мощностей и желаний атакующего:
1. Фейковая нода находит ближайшую ноду, генерирует НОВУЮ ноду, которая близка по ID, передаёт её пользователю.
На протяжении всей цепи, фейковые ноды будут сопровождать пользователя, пока в сети не будет найден собеседник.
2. DHT нода сама находит человека и сообщает пользователю данные, без лишних посредников.
4. TCP relays и P2P
Некоторые пользователи это DHT релеи, а некоторые DHT релеи ещё и TCP релеи...
В нормальном сценарии, если NAT позволяет - пользователи будут соединены через UDP holepunching.
P2P
Однако, пользователь не может самостоятельно проверить свой IP. DHT релей может заменить его на другой, который будет служить как реле.
Это позволит поставить между пользователями "прокси", который ретранслирует им сообщения друг друга, хотя они считают, что у них P2P.
TCP
Если же NAT блокирует UDP - будет форсирован TCP.
Между пользователями будет лишь один tcp релей в одну строну. Всего их два для одного чата.
TCP релеями служат DHT, в настройках которых это выставлено. Фейковый DHT релей выставляет самого себя в качестве TCP relay.
Нельзя читать сообщения пользователей ведь они зашифрованы, однако благодаря этому можно узнать TOXID собеседников (за исключением NoSpam), IP пользователей, размер сообщений, осуществление передачи файлов или видеозвонков в реальном времени.
IP целевых контактов или пользователя может быть изменён, поэтому клиент может быть отключен от взаимодействия с некоторыми или вовсе со всеми контактами.
Напоследок... Не используйте session, jabber через omemo гораздо лучше.
По секрету всему свету - скоро свой мессенджер выпущу
Специально для forum.LIMB.cc
LIMB