Модель безопасности
На этой странице прямо сказано, что протокол версии 3 (rChat 2.0.0) защищает и чего не защищает. Это краткое изложение модели угроз rChat; полная модель угроз и подробности — в whitepaper.
Что защищено
Заголовок раздела «Что защищено»- Содержимое сообщений. Сообщения шифруются на телефоне ключами, согласованными гибридным рукопожатием (X25519 вместе с постквантовым ML-KEM-768) и обновляемыми Double Ratchet, с шифром XChaCha20-Poly1305. Ретранслятор передаёт шифротекст, который не может расшифровать.
- Записанный трафик и будущий квантовый компьютер. Каждая беседа и каждый запрос на переписку сквозным образом смешивают секрет ML-KEM-768 с X25519, поэтому тому, кто записывает трафик сегодня и позже получит квантовый компьютер, всё равно придётся взломать оба. Подключение к ретранслятору тоже использует гибридный постквантовый обмен ключами (X25519MLKEM768), который так же защищает передаваемые по нему метаданные; содержимое сообщений от него не зависит. Постквантовым является только обмен ключами: подписи, подтверждающие личность (Ed25519 и P-256 ключа устройства), сертификат и идентичность ретранслятора и доказательства подключения остаются классическими, поэтому их нельзя подделать сегодня, но они не защищают от того, у кого квантовый компьютер уже есть в момент подключения.
- Прямая секретность сообщений. Каждое сообщение использует новый ключ, поэтому ключ, скомпрометированный позже, не раскрывает более ранние сообщения. Постквантовая часть каждого рукопожатия использует новые ключи, которые стираются после использования. Это не распространяется на запросы и их первые сообщения (см. ниже).
- Целостность и привязка. Каждое сообщение аутентифицирует свой заголовок и ключи идентичности обоих собеседников, поэтому расшифровывается только для той пары, для которой было написано.
- Транспорт. Подключения используют только TLS 1.3, без TLS 1.2 и без отката к открытому тексту (см. TLS и сертификаты).
- Журналы. На уровне по умолчанию ретранслятор не записывает идентификаторы, IP-адреса и содержимое (см. Что ретранслятор записывает и хранит).
Аутентификация ключей
Заголовок раздела «Аутентификация ключей»- Подписанные ключи. Ключи каждой учётной записи (идентичности, согласования и ML-KEM) подписаны её ключом идентичности. rChat отказывается начинать разговор с неподписанными ключами, поэтому ретранслятор не может подменить ключи своими. Каждый запрос на открытие беседы также подписывает свои одноразовые ключи, поэтому ретранслятор не может подсунуть постквантовый ключ, который сумел бы расшифровать.
- Доказательство, привязанное к сеансу TLS. Публикуя свои ключи, приложение подписывает свежий вызов ретранслятора вместе со значением, взятым из сеанса TLS (TLS exporter). Ретранслятор маршрутизирует и доставляет сообщения из очереди только подключению, которое доказало идентичность. Доказательство, скопированное в другое подключение, не проходит, а возобновлённое подключение TLS доказывает идентичность заново. Поэтому же TLS должен завершаться на ретрансляторе (см. За TCP-фронтендом).
- Закрепление — это принятие. Когда вы добавляете человека, сканируя его код, rChat запоминает его ключи и не будет общаться с ним под другими ключами. Несовпадение показывается как «Keys don’t match» и остаётся, пока вы снова не отсканируете его код. Коды контактов тоже несут постквантовый ключ, поэтому их размер около 1,7 КБ, а коды старых версий отклоняются.
- Первое использование. Если человек впервые связался с вами через запрос, rChat не может определить, кто стоит за его ключом. Contact Info показывает «Keys from their first message». Узнать наверняка можно, отсканировав его код лично или сравнив коды безопасности.
- Коды безопасности. Вы можете сравнить с собеседником 60-значный код безопасности, лично или по телефону, чтобы убедиться, что у каждого из вас настоящие ключи другого. Один телефон может показать его как QR-код, чтобы другой его отсканировал. Если ключи собеседника позже изменятся, отметка «сравнено» снимается. С протоколом версии 3 коды безопасности не изменились.
- Смена ключей. Если вы меняете ключи, ваши контакты следуют за вами автоматически, только когда уведомление подписано вашими прежними ключами, поэтому любой, кто украл ваши прежние ключи, может сделать то же самое. Смена ключей не возвращает украденную учётную запись: используйте Reset Identity.
Доставка и восстановление
Заголовок раздела «Доставка и восстановление»- Сохранённые сеансы. Каждый телефон сохраняет состояние шифрования своих бесед, запечатанное ключом, которым может пользоваться только он, и исключённое из резервных копий. Перезапуск приложения не теряет ни одного сообщения, принятого ретранслятором (кроме передаваемых в этот момент), а повторно воспроизведённое сообщение никогда не расшифровывается дважды. Перезапуск ретранслятора теряет сообщения, которые он хранил в памяти, если оператор не включил зашифрованное сохранение.
- Честный статус. Sent означает, что ретранслятор принял сообщение. Delivered означает, что телефон собеседника сохранил его; об этом сообщает зашифрованное сквозным шифрованием уведомление, которое ретранслятор не может подделать. См. Доставка и восстановление.
- О потере состояния сообщается внутри беседы. Когда телефон теряет свои сеансы (переустановка, новый телефон), он сообщает каждому контакту, какие сообщения не смог прочитать, внутри нового сеанса, созданного с закреплёнными ключами. Ретранслятор не может подделать это уведомление; он может только отбросить его, и тогда отправитель продолжает видеть Sent.
- Автоматическая повторная отправка требует телефона собеседника. Сообщение отправляется повторно автоматически, только когда уведомление подписано ключом устройства собеседника: ключом в защищённом оборудовании его телефона (или программным ключом там, где его нет; см. Известные ограничения), закреплённым, только когда вы лично сканируете его код (или вставляете его, добавляя совершенно нового контакта). Ещё нужно, чтобы с момента отправки ключи не менялись, сообщению было меньше 72 часов и оно не было доставлено, и не больше 50 автоматических повторов на контакт в день. Иначе сообщение показывает Not delivered, и вы нажимаете Resend. Тот, у кого есть украденная копия ключей учётной записи собеседника, но нет его телефона, не может заставить ваш телефон что-либо отправить повторно автоматически.
Идентичность ретранслятора и приглашения
Заголовок раздела «Идентичность ретранслятора и приглашения»Обычный способ подключиться к ретранслятору — его приглашение: ссылка или QR-код от оператора ретранслятора с адресом и идентичностью ретранслятора. rChat сразу закрепляет эту идентичность, поэтому проверяется даже первое подключение. Приглашение содержит секретный адрес ретранслятора, поэтому его владелец может подключиться к ретранслятору, но никогда не может читать сообщения.
Без приглашения rChat запоминает идентичность ретранслятора после первого подключения и перестаёт подключаться, если она меняется без передачи, подписанной прежней идентичностью. Первому подключению приходится доверять, если только вы сами не введёте идентичность ретранслятора и не включите Require a saved server identity. См. Идентичность ретранслятора.
Запросы на переписку
Заголовок раздела «Запросы на переписку»Беседа открывается, только когда об этом попросили оба. Тот, у кого есть ваш код, но кого вы не приняли, не видит, в сети ли вы, и ничего от вас не получает, пока вы не примете запрос. Его запрос может содержать одно короткое первое сообщение.
Запросы запечатываются ML-KEM-768 и X25519 вместе, поэтому одна лишь запись, даже с будущим квантовым компьютером, его не откроет. Запросы и их первые сообщения по-прежнему не обладают прямой секретностью. Они шифруются ключами, выведенными из долговременных ключей получателя, поэтому тот, кто записал запрос и позже получит эти ключи, сможет прочитать его первое сообщение.
Слепое сопряжение
Заголовок раздела «Слепое сопряжение»После вашей первой беседы с кем-то ваши телефоны переподключаются по коду, который можете вычислить только вы двое. Он меняется каждые 10 минут и каждый раз, когда вы снова выходите в сеть, а ретранслятор хранит только его зашифрованную форму, поэтому ретранслятор, записывающий запросы, не может по этому коду связать два ваших запроса, сделанных с разницей больше примерно 20 минут. Беседа никогда не возобновляется по старой цепи. Пока беседа открыта, память ретранслятора по-прежнему связывает двух её участников (как и раньше). Когда оба отсутствуют около 10 минут, ничто из хранимого им не называет их по имени; ожидающие слепые запросы никого не называют; и никакой токен или идентификатор цепи не связывает один период подключения со следующим.
- Когда ваш телефон всё же называет, с кем хочет связаться: при первом контакте, после того как один из вас переустановил приложение или сменил телефон, после смены ключей и в качестве запасного варианта после целого дня без слепого переподключения. Ретранслятор может вынудить не больше одного такого именного запроса на пару людей в день.
- Ограничения. Тот, кто наблюдает за работающим ретранслятором, всё ещё может увидеть, как две учётные записи соединяются друг с другом в один и тот же момент. Пока беседа открыта, ретранслятор передаёт её между двумя известными подключениями, и его память связывает вас двоих. Контакт может понять, что вы переподключились. Телефон, часы которого расходятся с часами ретранслятора больше чем на 5 минут, вообще не может подключиться (телефоны обычно синхронизируют время по сети), поэтому любые два подключённых телефона достаточно близки по времени, чтобы переподключаться, не называя друг друга.
Анализ трафика
Заголовок раздела «Анализ трафика»- Дополнение обязательно. Каждое сообщение и уведомление дополняется до размерной ступени (256 Б, 1 КиБ, 4 КиБ, 16 КиБ, затем шагами по 64 КиБ), а каждый запрос имеет размер ровно 5120 байт. Именные и слепые запросы на открытие беседы одного размера. Ретранслятор всё равно видит размерную ступень.
- Уведомления о доставке передаются зашифрованными сквозным шифрованием, как сообщения, и отправляются с короткой случайной задержкой небольшими пачками. Ретранслятор всё равно может догадаться по времени, что уведомление было отправлено.
- Равномерный трафик — необязательная настройка, по умолчанию выключена. Пока приложение открыто, оно отправляет пакеты одного размера в постоянном ритме в случайно выбранную открытую беседу, поэтому время ваших сообщений выдаёт меньше. Она работает полностью, только когда её использует и собеседник, а фото, файлы и голосовые сообщения идут вне неё.
- Extra traffic protection — более лёгкая необязательная настройка, по умолчанию выключена. Она отправляет дополнительный фиктивный трафик, пока приложение открыто, из-за чего ретранслятору немного труднее понять, когда вы переписываетесь. Она не скрывает время отправки и позволяет людям, с которыми у вас открыты беседы, видеть, когда rChat открыт. Пока включён равномерный трафик, он её заменяет.
- Переподключения возобновляют свой сеанс TLS, поэтому выглядят как у любого вернувшегося клиента. Сетевой наблюдатель может связать два подключения, сделанных с промежутком до 12 часов, если второе предъявляет билет возобновления от первого (билеты используются один раз и хранятся только в памяти).
- Сайт-приманка ретранслятора не даёт поверхностному сканированию увидеть, что работает на порту, а начиная с 2.0.0 приманка у каждого ретранслятора своя (см. Руководство по настройке). Настойчивый активный исследователь может отличить его от настоящего веб-сервера. Трафик rChat не маскируется под трафик веб-браузера.
Что узнаёт ретранслятор
Заголовок раздела «Что узнаёт ретранслятор»Во время работы ретранслятор видит, какие учётные записи подключены, когда и с каких IP-адресов, и между какими двумя из них открыта беседа. Когда два человека подключаются впервые или после того, как один из них сменил телефон или ключи, он также может до десяти минут видеть, какая учётная запись пытается связаться с какой. Он не записывает это в журналы.
- Он видит размерную ступень, время и направление каждого пакета в открытой беседе, включая момент принятия запроса.
- Запрос, ожидающий того, кто не в сети, хранится в памяти до доставки, не больше 72 часов.
- Сообщения для тех, кто не в сети, хранятся в памяти не больше 72 часов и удаляются после доставки. Они учитываются по получателю; идентичность отправителя находится внутри зашифрованного сообщения.
- Фоновая проверка выглядит как короткое подключение без бесед.
- Ретранслятор не получает никаких данных о смене ключей, но обычно может связать новую идентичность со старой, потому что новая сразу связывается с теми же людьми.
Любой, кто управляет работающим ретранслятором, изымает его или получает на нём root, может прочитать из его памяти подключённые учётные записи и то, какие из них делят открытые беседы. Это сокращение, а не защита.
Отказ в обслуживании
Заголовок раздела «Отказ в обслуживании»Ретранслятор всегда может отказать, отбросить, задержать или переупорядочить трафик. Его собственная защита описана на странице ограничений ресурсов. Эти пробелы касаются нарушения доставки; ни один не помогает опознать пользователя или прочитать сообщение:
- Поток запросов. Продолжительный поток запросов из многих источников может вытеснить старые запросы из заполненного хранилища запросов. Доказательство работы — дело будущего.
- Общие адреса. Справедливые доли считаются на IPv4-адрес или IPv6 /48, поэтому многие пользователи за одним адресом NAT оператора делят одну долю, и именно этот адрес могут урезать.
- Изматывание медленного получателя. Принятый контакт может отправлять с максимальной разрешённой скоростью. Получатель, который не успевает, отключается, а его сообщения хранятся офлайн.
- Заполнение офлайн-очереди. Принятый контакт может заполнить офлайн-очередь получателя, пока того нет, и тогда другим отправителям отказывают, пока получатель не переподключится или сообщения не истекут. Пакеты равномерного трафика могут занять не больше её половины.
Известные ограничения
Заголовок раздела «Известные ограничения»- Изъятие устройства. Тот, кто изымет ваш разблокированный телефон или скопирует файлы приложения вместе с их ключом, сможет прочитать сообщения, ещё ожидающие на ретрансляторе под текущими ключами, и будущие сообщения, пока оба телефона не завершат новый шаг обмена ключами.
- Телефоны без защищённого оборудования. Там, где нет Secure Enclave (старые симуляторы iOS), ключ устройства — программный ключ в Keychain. Извлечение и ключей учётной записи, и этого ключа с такого устройства позволило бы пройти проверку автоматической повторной отправки. Для такого контакта Contact Info показывает «Their device key isn’t stored in secure hardware.»
- Новый телефон, старый ключ устройства. Когда контакт переходит на новый телефон, у вас остаётся его старый ключ устройства, пока вы не отсканируете его новый код, поэтому восстановление сводится к нажатию Resend. Это безопасный отказ.
- Передача очереди. Телефон, принудительно закрытый, пока ретранслятор передаёт ему ожидающие сообщения, теряет эти сообщения. Телефон не подтверждает получение ретранслятору; отправитель продолжает видеть Sent, и это правда.
- Откат. Тот, у кого есть доступ на запись к файлам приложения, может откатить сохранённое состояние к более старой копии. Это компрометация устройства, и она не защищена сверх защиты данных iOS.
- Завышенные счётчики. Поддельные пакеты могут завысить на принимающем телефоне счётчик сообщений, которые «не удалось расшифровать». Это только отказ в обслуживании, и он ограничен.
- Первый контакт. Контакту, который впервые связался с вами через запрос, доверяют при первом использовании, пока вы не отсканируете его код или не сравните коды безопасности.
- Конверт отправителя сообщения. Внешний конверт обычного сообщения скрывает отправителя от ретранслятора только с помощью X25519; постквантовая защита — в самой беседе и в запросах.
- Исчезающие сообщения и уведомления. Чего они не покрывают, см. в разделах Медиа и исчезающие сообщения и Уведомления.
Не реализовано
Заголовок раздела «Не реализовано»Прозрачность ключей, постквантовые подписи, доказательство работы для запросов и воспроизводимые сборки.