Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Неизвестный чат TorChat и его совершенствование

Anna | 16.06.2014 | нет комментариев
TorChat — это неизвестный кроссплатформенный мессенджер, использующий сеть Tor и шифрующий переписку. В данной статье рассмотрен протокол, применяемый TorChat, и совершенствования, внесённые в реализацию TorChat на Python.

Вступление, изложение Tor и hidden service

Система обеспечения анонимности Tor, которая Зачастую всплывает в СМИ, служит для неизвестного посещения и создания сайтов. Всякий желающий может получить «домен» вида test3unszyhvy7um.onion и через несколько секунд данный сайт станет доступен для посещения всеми пользователями сети Tor. Для создания домена создается RSA-ключ, от публичной части которого вычисляется хеш-сумма (в случае данного домена она равна test3unszyhvy7um). Tor запоминает соответствие доменного имена публичному ключу в DHT. Такой сайт именуется hidden service. Tor создает TCP-соединение между заказчиком и hidden service. Через такое соединение дозволено пропускать различные протоколы: HTTP(S), SSH, IRC, Bitcoin и другие. Изложение одного из таких протоколов, TorChat, находится в дальнейшем разделе.

Алгорифм подключения к hidden service не связан напрямую с темой статьи, его рассмотрение заслуживает отдельной статьи. Пока что подмечу значимые моменты. Доменное имя hidden service немыслимо отобрать без доступа к приватной части ключа RSA. Немыслимо прослушивать канал между заказчиком и hidden service либо подменять данные на этом канале. Немыслимо узнать IP-адрес, на котором работает hidden service либо IP-адрес её заказчика.

Протокол TorChat

Данный раздел основывается на файле tc_client.py. В файле довольно комментариев, впрочем протокол в текстовом виде отсутствует.

Заказчики взаимодействуют напрямую через Tor, серверов в системе TorChat нет. Заказчик запускает личный процесс Tor либо использует теснее запущенный Tor, управляя им через Control port.

Всякий пользователь имеет личный hidden service с доменное именем вида abc.onion, на котором он слушает порт 11009. Первая часть имени (abc) имет длину 16 символов, может состоять из символов 234567abcdefghijklmnopqrstuvwxyz (base32) и служит в качестве TorChat ID. Всякий пользователь имеет вероятность подключаться к иным пользователям через их TorChat ID.

Tor гарантирует, что данным доменным именем может руководить только его создатель, держатель соответствующего ключа. Впрочем о том, кто подключается к hidden service, нет никакой информации, следственно аутентификация включает создание обратного соединения. Выходит, возможен, Алиса (alice.onion) подключается к Бобу (bob.onion). Для этого Алиса отправляет Бобу сообщение вида «ping alice <случайная строка от Алисы>». Боб отправляет Алисе «ping bob <случайная строка от Боба>» и «pong <случайная строка от Алисы>». Алиса отвечает «pong <случайная строка от Боба>». Стороны сопоставляют отправленные и полученные случайные строки. Совпадение строк подтверждает, что входящее соединение подлинно от того, кем оно «представляется». Таким образом, оба имеют по паре сокетов (входящий и исходящий) и убежденность, что входящий сокет от того же, кому направлен исходящий. Сообщения по сокетам передаются только в одном направлении (за исключением передач файлов, которые передаются в противоположном направлении, Дабы не соперничать с передачей текста).

Схема протокольного сообщения в TorChat:

<command> <encoded>\n

Команда может содержать только строчные латинские буквы и знаки подчеркивания. Encoded состоит из всяких символов, помимо символа конца строки. Символ конца строки заменяется на «\» и «n». Заранее «\» заменяется на «\» и «\».

Список команд:

  • ping, pong — см. выше.
  • not_implemented — отсылается отправителю, если получатель не понимает команды.
  • client — передаёт наименование заказчика, скажем TorChat.
  • version — передаёт версию заказчика, скажем 0.9.9.553.
  • status — передаёт ранг.  Доступен (available),  отошёл (away),  занят (xa). Есть и другие ранги, которые не передаются:  нет в сети (offline),  ожидание ответного соединения (handshake). Handshake продолжается с того момента, как установлено исходящее соединение и отправлен пинг, но не получен понг. Заказчик уведомляет свой ранг позже понга, позже метаморфозы ранга либо правда бы раз в 120 секунд.
  • profile_name — передаёт ник пользователя. Ник необязателен к заполнению. Помимо ника, тот, что пользователь сам о себе информирует, есть локальный ник, тот, что присвоил локальный пользователь. Локальный ник имеет больший приоритет при отображении.
  • profile_text — необязательное подробное изложение, которое может заполнить о себе пользователь.
  • profile_avatar_alpha — альфа-канал аватара (64*64*8 бит). Отправляется до данных самого аватара. Если аватара нет, то это сообщение пропускается либо отправляется пуская строка.
  • profile_avatar — аватар (64*64*24 бит). Необязательное. Если отправляется, то отправляется позже profile_avatar_alpha.
  • add_me — запрос о добавлении в список контактов. Заказчик версии 0.9.9.553 соглашается добавлять в список контактов всех желающих.
  • remove_me — запрос об исключении из списка контактов. Заказчик не должен механически добавляться обратно в список контактов позже приобретения такого сообщения.
  • message — обыкновенное текстовое сообщение. Заказчик версии 0.9.9.553 отвергает сообщения, если отправителя нет в списке контактов.
  • filename — запрос на передачу файла. Включает идентификатор передачи, размер в байтах, размер блока в байтах (в версии 0.9.9.553 игнорируется получателем) и имя передаваемого файла. Поля поделены пробелом. Эту и остальные команды передачи файлов отправляют через входящие соединение, а не через исходящее, Дабы передача файла не мешала текстовой переписке. Для начала передачи не требуется подтверждения принимающей стороны, обе стороны могут отменить энергичную передачу. Заказчик версии 0.9.9.553 записывает передачу во непостоянный файл, позже окончания передачи данные переносятся в файл, указанный пользователем.
  • filedata — передаёт фрагмент файла. Включает идентификатор передачи, смещение в байтах, md5 фрагмента и сам фрагмент. Отправляются по порядку.
  • filedata_ok — доказательство приобретения фрагмента файла. Включает идентификатор передачи и смещение в байтах. Отправляются по порядку. Отправитель перестает отправлять фрагменты, если не получает подтверждения их приобретения. В заказчике версии 0.9.9.553 передача приостанавливается позже 16 неподтвержденных фрагментов.
  • filedata_error — отправляется взамен filedata_ok в случае ошибки приобретения (пропуск фрагмента, несовпадение md5). Включает идентификатор передачи и смещение в байтах. Отправитель должен возобновить передачу с указанного места.
  • file_stop_sending — отправитель передаёт эту команду, если решает прекрастить передачу. Включает идентификатор передачи.
  • file_stop_receiving — получатель передаёт эту команду, если решает прекратить передачу. Включает идентификатор передачи.

Реализации

Мне удалось обнаружить 4 реализации заказчика TorChat.

torchat_py на Python от Prof7bit (Bernd Kreuss, Hannover, Germany), 2007 год. Первая реализация. Теперь находится в ветке torchat_py репозитория на github.
torchat2 на Lazarus Free Pascal от Prof7bit. Новая реализация, 2012 год. Упрощён запуск нескольких экземпляров на одной машине. Ядро всецело отделено от GUI, что разрешает запускать в том числе без GUI. Реализован плагин для библиотеки Purple, которую применяют IM-заказчики Pidgin и Finch. Использует каждого один поток исполнения на программу. Питоновская создает несколько потоков на всякий контакт.
TorChat для Max OS X от Julien-Pierre Avе заметки о собеседнике либо блокировать собеседника. Есть многопользовательский чат.
jTorchat на Java от daux2a. Написан в 2012 году. Не реализована передача файлов. Добавлен широковещательный режим, дозволяющий передавать сообщения каждому пользователям сети TorChat, даже тем, которых нет в списке контактов. Реализован запрос случайного собеседника из сети.

Представленность в официальных дистрибутивах

Были изучены дистрибутивы Gentoo, Debian, OpenSuse, Fedora и Windows.
На данных момент TorChat включён только в дистрибутив Debian.
Страница пакета: packages.debian.org/wheezy/torchat

Реализация на Python

Разглядим реализацию TorChat на Python версии 0.9.9.553.

При отправке сообщений получателю, которого нет в сети, эти сообщения сохраняются локально и отправляются с префиксом [delayed], когда получатель возникает в сети единовременно с отправителем. Отправитель получает уведомление [delayed messages have been sent].

Если оставить TorChat включённым на неделю и не пользоваться им, то получится приблизительно 50 мегабайт исходящего и 100 входящего трафика. Создание нового аккаунта происходит мигом (время генерации ключа RSA), первая активизация занимает полминуты. Дальнейшие активизации происходят за пару секунд. Видимо, при первой активизации время расходуется на «первое знакомство» программы Tor с сетью Tor.

Когда создают новейший аккаунт TorChat, он механически добавляется в контакты к себе под ником self. Это благотворно по многим причинам. Во-первых, ранг этого контакта показывает, в сети ли наш аккаунт. Во-вторых, дозволено стремительно скопировать свой TorChat ID (правая кнопка мыши — Copy ID to clipboard). В-третьих, «переписываясь» с собой, дозволено оценить задержку сети. Традиционно пинг порядка 1 секунды. В-четвёртых, данный контакт комфортно применять в плагинах, скажем в конференции (см. ниже).

В папке с программой лежит файл portable.txt. Если он есть, папка программы применяется для хранения конфигов. Напротив применяется папка ~/.torchat либо ~/.torchat_<наименование аккаунта>. Наименование аккаунта подается доводом командной строки. Конфиг включает файлы buddy-list.txt и torchat.ini и папку Tor с RSA-ключом.

Интерес представляют модули tc_client.py (ядро), tc_gui.py (GUI), dlg_settings.py (окно настроек), config.py(хранилище настроек).

В файле tc_client.py есть классы:

  • BuddyList — список контактов. Один экземпляр класса на программу. Имеет способы для добавления иудаления контактов.
  • Buddy — контакт. Может быть либо не быть в списке контактов. Способ для отправки сообщения и чуть выше способ, срабатывающий при приобретении сообщений.
  • Классы «ProtocolMsg_<команда>», преемники ProtocolMsg — администраторы протокольных сообщений. Способ execute(self) отвечает за действие, исполняемое при приобретении соответствующей команды. Эти классы дюже комфортны для разработки плагинов.

В файле tc_gui.py находится код на wxPython. Из увлекательных классов: ChatWindow (окно чата), MainWindow(основное окно, содержит ссылку на BuddyList).

В файле dlg_settings.py каждого один класс, Dialog, отвечающий за окно настроек. Добавление своих пунктов в окно настроек из плагина происходит путём подмены способа addPluginSettings (способ добавлен в моём форке).

Файл config.py содержит функции-обёртки set и get для ConfigParser из стандартной библиотеки Python. В этом же файле находятся значения настроек по умолчанию (config_defaults). Настройки хранятся в файле torchat.ini.

Список контактов хранится в файле buddy-list.txt в табличном виде (torchat_id [локальный ник]).

Переводы реализованы как файлы lang_xx.py, где xx — код языка. Файлы лежат в папке translations. Всякий текст для перевода хранится в переменной, на которую ссылаются из остальных частей программы. Нестандартный вариант, но комфортен при написании плагинов: необходимо легко сделать нужные переменные в соответствующих модулях. TorChat переведён на много языков, в том числе на русский (2011 год, переводчик: SB14.org, RusInfo.cc).

Совершенствования реализации на Python

Люди жалились, что в TorChat не хватает кое-каких функций. Некоторые из них, скажем вероятность запуска нескольких экземпляров, дюже примитивны в реализации. Необычно, что автор их сразу не сделал. Другие (скажем многопользовательские чаты) теснее не так примитивны, впрочем их дозволено реализовать без метаморфозы протокола (метод описывался на прогре). Наконец, есть вещи, требующие изменений протокола, скажем голосовая связь. Я вообще не уверен, что её реализация допустима, с учётом задержек сети Tor. Наконец, есть вещи, которые наверно сделать не получится. К таким вещам относится видеосвязь.

Когда накопилась скептическая масса запросов к TorChat, я начал думать, как получить эти функции. К сожалению, стержневой разработчик в данный момент неактивен, его нет в TorChat и по почте с ним не удаётся связаться. Писать на Pascal, Java, Objective-C либо Max OS X мне не хотелось, следственно сделал ставку на ветхую Python-реализацию, против предпочтениям автора. Python и реализация TorChat на Python оказались дюже комфортными для написания плагинов и внесения совершенствований. Дополнительным доводом стало то, что именно Python-реализацию включили правда бы в один дистрибутив, Debian.

Когда я стал постигать исходники, мне вначале показалось, что не напрасно говорили, что код низкого качества. Видимо, этому поспособствовало изложение протокола экстраординарно в исходниках. Впрочем потом я вгляделся и увидел, что протокол и реализация исполнены на совесть. Осмелюсь предположить, что автор, когда писал данный код несколько лет назад, не имел специального навыка с Python. Кое-где дозволено встретить <>, которое говорит о «бейсиковском» либо «паскалевском» прошлом. Тем не менее, код написан на славу.

Я форкнул репозиторий на github и достаточно стремительно сделал всё, что хотелось. Что было сделано:

  • Система плагинов. При запуске программа ищет плагины в подпапке plugins, расположенной в одной папке с файлом программы (torchat.py) и в подпапке plugins, расположенной в одной папке с файлом конфигурации torchat.ini. Плагины представляют собой модули Python, то есть файлы *.py. В плагине должно быть определено его наименование в переменных NAME_xx, где xx — код языка (en, ru, etc). В плагине должна быть функция load(torchat), исполняющая загрузку плагина. В неё подается довод torchat, содержащий ссылку на модуль torchat, через тот, что дозволено добраться до остальных модулей (config, tc_client, tc_gui, dlg_settings). Плагин может подменять классы либо функции в этих модулях так, Дабы не крушить программу и не мешать иным плагинам. По умолчанию все плагины отключены, пользователь включает надобные во вкладке «Плагины» в настройках и перезапускает программу.
  • Несколько аккаунтов. В начальную программу был «зашит» порт SOCKS5-прокси, запускаемого Tor, и порт, на котором TorChat принимает от Tor входящие соединения. Для их метаморфозы необходимо былоне только залезать в настройки, но и править вручную конфиг torrc. Дабы избежать этих трудностей, порты по умолчанию были изменены на значение 0, которое интерпретируется как всякий вольный порт. Порт, выставленный в настройках, сейчас понимается как желаемый, а не непременный — если он занят, программа объединяет всякий доступный порт. Конфиг для Tor с надобными изменениями генерируется механически.
  • Метаморфоза отображаемого наименования и версии заказчика в виде плагина. Чем огромнее версий TorChat, тем шире вероятности по применению этой информации для деанонимизации либо сравнения. Традиционно программы противятся таким функциям, но это же всё-таки неизвестный чат, а не браузер, следственно анонимность на первом месте. Тем больше, это сделано в виде плагина, тот, что по умолчанию отключён.
  • Пинг собеседника в виде плагина. Отсылает пинг и замеряет задержку перед приобретением понга. Задержка возникает в окне чата. Для измерения пинга сделан пункт в контекстном меню чата. Ради этого плагина пришлось изменить tc_client.py, позволить отсылку понга больше одного раза на соединение. Метаморфоза не нарушает безопасность и совместимо с предыдущими версиями.
  • Игра камень-ножницы-бумага в виде плагина. Добавляет пункты для выбора в контекстном меню чата. Протокол игры таков: всякий конкурент выбирает камень «r», ножницы «s» либо бумагу «p» и случайную соль не короче 10 символов. Итог сложения строк: соль, “-” и выбор (1 буква) — является открытым текстом. От него вычисляется sha1 и отправляется конкуренту. После этого отправляется открытый текст. Я обнаружил bash-скрипт для игры на одном из каналов IRC-сети OnionNet. Мне понравилась идея и я написал программу на Qt для игры. В TorChat эта игра тоже не помешает.
  • Пароль на добавление в список контактов в виде плагина. В настройках вводится пароль и подсказка к нему (необязательная). При добавлении аккаунта в контакты присылается механическое сообщение с просьбой ввести пароль и подсказкой. Если пароль введён правильно, то аккаунт добавляется в список контактов. До этого не отображается никаких проявлений попытки добавиться в контакты. Данный плагин может быть пригоден для охраны от случайных лентяев либо от спама. Если появятся боты для рассылки спама через TorChat, то от них спасёт пароль «4» с подсказкой «двукратно два».
  • Конференции реализованы в виде плагина. Аккаунт, на котором загружен данный плагин, превращается в сервер конференции, а люди из его списка контактов становятся членами конференции. Когда кто-то из списка контактов пишет что-то конференции, она пересылает его сообщение каждому своим контактам, находящимся в сети, с пометкой, от кого это сообщение. Конференция присваивает роль всякому пользователю. Система ролей достаточно примитивна, схожа на систему ролей в скайп. Роль сохраняется за пользователем, когда он выходит из сети либо покидает конференцию. Помимо стержневой роли (user), есть гости, которые могут читать, что пишут другие, но не могут сами писать в конференцию. Есть роль «Никто», которая может только получать поддержка командой !help. И есть роль «Забаненный», которая ничего не может. Забаненные пользователи механически отключаются от конференции. Двинемся «вверх» по системе ролей: модератор, менеджер, обладатель. Обладатель у конференции каждого один, это сама конференция, от него исходит власть для менеджеров, которых он может назначать и снимать. Менеджеры могут менять различные настройки конференции, включая аватар, тему (ник конференции) и изложение. Менеджеры могут назначать модераторов, которые могут кикать, банить, вставлять и вынимать кляп изо рта примитивных пользователей и приглашать пользователей в конференцию. Менеджеры могут выставлять роль по умолчанию. Дабы сделать закрытую конференцию, необходимо очевидно закрепить за всеми их роль, позже чего изменить роль по умолчанию на «Забаненный». Дозволено защитить конференцию паролем, посредством соответствующего плагина. По умолчанию включена настройка «prefer_nicks», которая делает torchat ID членов конференции заметным для членов конференции с ролью младше модератора. Это разрешает избавить членов конференции от спама на их torchat ID и усложняет деанонимизацию. (Необходимо вначале обнаружить конференцию, после этого «вытрясти» из её админа torchat ID пользователя, потом его обнаружить…) Члены конференции могут слать друг другу собственные сообщения через конференцию, их содержимое не предохраняется от конференции. Через «личку» конференции дозволено обменяться torchat ID и позже этого вести диалог напрямую через TorChat. Дозволено игнорировать пользователей с ролью младше модератора, тогда их сообщения, включая личку, не доставляются до игнорирующего. Для данной статьи сделана конференция pegi5xdl3m4re3c3.
  • Плагин, отключающий отображение сообщений, направленных самому себе. Пригоден в сочетании с плагином конференции, Дабы обладатель конференции, пишущий в конференцию с аккаунта конференции, не видел дубликатов своих сообщений.
  • Список контактов сейчас хранится в формате JSON как часть INI-файла с конфигурацией. Для контактов хранится не только локальный алис, но и ник, выбранный пользователем.
  • Багфиксы.

    Список багфиксов

    Поправлена оплошность при выставлении checked для чекбокса
    Если пользователь удаляет аватар, то у его контактов висел ветхий аватар до рестарта программы
    Применяемый тип прокси-сервера изменен с SOCKS4 на SOCKS5
    Починено в некоторых случаях отражение метаморфозы пользователем своего ника у других пользователей
    Позабытые () позже вызова функции. В Python, в различие от Pascal, при вызове функции без доводов невозможно пропускать ().
    Дезинфекция имени пользователя, полученного от него. Имя, включающее слишком длинные слова, вызывало сбой программы при попытке отобразить всплывающую подсказку для этого пользователя.

    Хотелось бы включить их в Debian отдельно от нововведений.

Что дальше?

  • На всякий контакт создается 4 потока исполнения: для входящего соединения, для исходящего соединения, и 2 для передачи файлов (прием, выдача). Это достаточно небережливо. Дозволено было бы не создавать потоки исполнения для передачи файлов, пока не происходит этой передачи. А ещё отменнее применять asyncore и вообще свести всё к одному потоку на всю программу. Задача состоит в том, что asyncore не включает вероятности подключаться через прокси. Готового решения для этого я не обнаружил. Дозволено выделить эту работу в обособленный план asyncore socks. Кстати, паскалевская реализация тратит каждого 1 поток на процесс.
  • Динамически загружаемые и выгружаемые плагины. При этом без необходимости писать unload() для всякого плагина.
  • Эластичная настройка соответствия аккаунтов и процессов Tor. Вероятность подключения к теснее запущенному тору. Вероятность применять различные процессы Tor для входящих и исходящих соединений. Вероятность применения «двойного Tor» (Tor, подключающийся к сети через иной Tor). Применение в дистрибутиве tails (там запуск отдельного процесса Tor не пройдёт, так как выхода в сеть у такого процесса не будет по умочанию). Вероятность прямой передачи сообщений (не через Tor), если отправитель и получатель находятся на одной машине (скажем конференция и её менеджер). При изменении конфигурации не перезапускать процесс Tor, а обновлять конфигурацию в запущенном процессе через Control port либо сигнал SIGHUP (Linux).
  • Освобождение от зависимости от GUI, вероятность запуска в консольном режиме либо через веб-интерфейс.
  • Плагин, создающий «сайт» на порту 80 hidden service, Дабы писать сообщения пользователю дозволено было без установки TorChat, а непринужденно черезTor Browser. В сочетании с плагином конференции должен получиться веб-чат.
  • Плагин «файлообменник», дозволяющий загружать и скачивать файлы. Пригоден в сочетании с конференцией.
  • Цифровая подпись, выдаваемая пользователю при добавлении его в контакты. Если потерялся список контактов, но сохранился ключ, то при новом запуске контакты добавят данного пользователя. Дабы отличать их от спам-ботов, благотворно предварительно выдавать им цифровую подпись, подтверждающую, что они находятся в контактах. Пригодно также зашифровать подпись своим же ключом, Дабы ни для кого, помимо нас, она ничего не доказывала.
  • Генерация ключа(ей) из random seed. В резервную копию направится только данный random seed. Список контактов копировать необязательно (см. предшествующий пункт).
  • Плагин для проброса портов от пользователю к пользователю. Желанна помощь не только TCP, но и UDP. Через проброшенный порт дозволено будет пропускать произвольные протоколы, в том числе аудио. Говорить через Tor теснее дозволено: torfone.org
  • Внести метаморфозы в апстрим. Открыт пулл-реквест. Бекпортить фиксы в Debian wheezy и отправить новую версию в Debian sid.
 Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB