NeyLivo English

Безопасность

Безопасность NeyLivo

Здесь описано, что в NeyLivo действительно защищает ваши данные, а что нет. Если защита необязательна, выключена по умолчанию или не проверена в жизни — это написано, а не опущено.

Обновлено: 12 августа 2026 · NeyLivo 1.563.0

Подход

Три правила, которых проект держится.

Защита сообщений

Личную переписку двух людей можно шифровать от устройства до устройства. Когда шифрование включено, на сервере лежит шифротекст, ключа от которого у сервера нет.

Согласование ключа
ECDH на кривой P-256. X25519 был бы предпочтительнее, но в той реализации WebCrypto, где приложение обязано работать, его нет.
Выведение ключа
HKDF-SHA256, причём в выведение вплетены назначение и пара устройств: ключ, годный в одном месте, бесполезен в другом.
Шифрование
AES-256-GCM. GCM заодно проверяет целостность: изменённый на сервере шифротекст не расшифруется, а не расшифруется «во что-то другое».
Ключи принадлежат устройству
У каждого устройства своя пара. Приватная часть лежит в IndexedDB как объект CryptoKey и никуда не уходит в открытом виде.
Скрытие длины
Текст перед шифрованием укладывается в блок постоянного размера, и по длине шифротекста больше нельзя отличить «да» от страницы текста.
Сверка
У каждого ключа есть отпечаток — пять групп по пять цифр. Двое могут прочитать его друг другу вслух и убедиться, что между ними никого нет.
Несколько получателей
Ключ содержимого запечатывается отдельно для устройств собеседника и отдельно для ваших — иначе вы не прочитали бы собственную переписку со второго устройства.

Это настройка, и по умолчанию она выключена (Настройки → Приватность). Она действует только на личную переписку один на один.

Сквозным шифрованием не защищены: групповые беседы и каналы серверов. Эти сообщения хранятся так, что сервер может их прочитать, и защищены правилами доступа к базе — та же модель, что у большинства групповых мессенджеров. Если нужна переписка, которую сервер прочитать не может, — это личная переписка один на один с включённым шифрованием.

Если у собеседника нет опубликованного ключа — например, он ни разу не заходил с версией, которая умеет шифровать, — сообщение не отправляется, и приложение говорит об этом. Тихо перейти на открытый текст оно не может.

Защита канала связи

Весь обмен приложения с сервером идёт по HTTPS/TLS, включая соединение реального времени (защищённый WebSocket) и загрузку файлов. Плагину доступны только https: и wss:, обычный HTTP отклоняется.

Приложение для Windows скачивается по HTTPS и обновляется по HTTPS, сверяя контрольную сумму SHA-512, опубликованную вместе с выпуском. Эта сумма подтверждает, что файл дошёл целым; подписью кода она не является, и установщик сертификатом не подписан.

Защита учётной записи

Учётными записями занимается Supabase Auth. Сессия — это JWT с токеном обновления, который хранится локально на устройстве (а на Android дополнительно в нативном хранилище, чтобы обновление приложения не выкидывало из аккаунта).

Двухфакторной проверки с приложением-аутентификатором пока нет. Доверенные устройства и код восстановления — частичная замена, а не полная.

Хранение паролей

NeyLivo не хранит пароли. Ими занимается Supabase Auth, который держит их как хеши bcrypt; собственного кода хранения паролей в проекте нет.

Минимальная длина пароля — шесть символов, это значение платформы по умолчанию. Это мало, и поднять порог — в списке того, что надо исправить.

Одно следствие, которое стоит понимать. Ключ шифрования можно положить на сервер резервной копией, запертой паролем от учётной записи (PBKDF2-SHA256, 250 000 повторов, AES-256-GCM). Это сделано, чтобы выход из аккаунта не уничтожал переписку. Цена: тот же пароль вводится в форму входа, и недобросовестный или взломанный сервер аутентификации мог бы перехватить его и открыть эту копию. NeyLivo защищает переписку от постороннего и от утечки базы, но не от того, кто управляет самим сервером.

Вложения

Вложения — самое слабое место NeyLivo сегодня, и оно исправляется. Отправленные файлы загружаются в облачное хранилище, настроенное как публичное: любой, у кого есть ссылка на файл или кто сможет её составить, скачает его без входа. Правила доступа защищают базу данных, но не это хранилище.

Для личной переписки есть переключатель, который это чинит: шифровать вложения. С ним каждый файл шифруется прямо в браузере своим ключом AES-256-GCM ещё до отправки, лежит под нейтральным именем и без типа, а ключ едет внутри зашифрованного сообщения — то есть достать его можно, только расшифровав переписку. Как и остальные переключатели шифрования, по умолчанию он выключен.

Пока хранилище не закрыто, считайте всё отправленное без шифрования вложений технически общедоступным. Это ограничение перечислено ниже и в собственном аудите проекта.

Голос и видео

Звонки идут через LiveKit. Право позвонить решает сервер, а не приложение: блокировка и настройка «кто может мне звонить» проверяются в той службе, которая выдаёт пропуск в звонок, поэтому обойти проверку изменённым клиентом нельзя.

Звонок двух людей можно зашифровать сквозным шифрованием — отдельной настройкой. Ключ вырабатывается в браузере и уезжает собеседнику внутри зашифрованного сообщения, так что сервер звонков его не видит.

Помечено экспериментальным. Этот путь покрыт проверками в коде, но ни разу не проверен настоящим звонком между двумя устройствами. Пока это не сделано, он не выдаётся за доказанный. Если ключ доставить не удалось, звонок идёт незашифрованным и прямо об этом сообщает.

Без шифрования звонка поток расшифровывается на медиасервере — как в любом обычном групповом звонке. Голосовые каналы серверов сквозным шифрованием не защищены.

Изоляция плагинов

Код плагина работает не в приложении. Он работает в Web Worker, которому браузер не даёт ни DOM, ни куки, ни доступа к странице, — поэтому плагин не может прочитать вашу сессию, не может нарисовать поддельное окно входа и не может влезть в интерфейс.

Плагинам, которым нужна целая страница (игры, визуализаторы, 3D-сцены), достаётся <iframe sandbox="allow-scripts"> без allow-same-origin. Это даёт странице уникальное чужое происхождение: у неё есть свой DOM, работают WebGL, WebAssembly и звук, но она — другое происхождение, и ни документа NeyLivo, ни его хранилища ей не достаётся.

Это границы браузера, а не наши проверки, которые хитрый плагин уговорит. Всё, что плагину доступно, проходит через один диспетчер, и каждый вызов сверяется с объявленными разрешениями. На попытки обхода есть отдельный набор проверок, который нарочно штурмует эти границы.

Разрешения плагинов

Перед установкой видно имя плагина, автора, версию и точный список того, что он просит, человеческими словами — например «Отправлять сообщения от твоего имени» или «Обращаться в интернет (только к указанным сайтам)». Всего таких разрешений 23.

Две вещи, которые надо знать. Плагин, объявивший * — или не объявивший ничего, — просит все разрешения сразу, и на экране установки это показано красным. И количественных пределов нет: установленный плагин может отправлять сообщения, ходить в сеть и работать в фоне сколько угодно. Приложение говорит об этом до установки, потому что настоящая защита здесь — ваше решение, а не квота.

Плагин можно в любой момент выключить или удалить.

Доступ плагинов в сеть

В интернет плагин выходит, только если у него есть разрешение на сеть, и только на домены, объявленные им в шапке. Правила проверяются в одном месте для всех способов выйти — обычный запрос, поток и постоянное соединение, — чтобы второй путь не разошёлся с первым:

Метаданные

Шифрование скрывает, что вы написали. Оно не скрывает, что вы писали. Даже со всеми включёнными настройками серверу известно:

Длина сообщения скрыта дополнением, а у зашифрованного вложения нет ни имени файла, ни типа. Остальное из списка выше — метаданные, которые NeyLivo сейчас не сокращает.

Инфраструктура

NeyLivo не держит собственную инфраструктуру. Он работает на:

На странице приватности перечислены все сторонние службы, с которыми разговаривает приложение, включая те, что видят только IP-адрес.

Модель угроз

От чего NeyLivo защищает

  • От чтения вашей переписки один на один посторонним — при включённом шифровании, включая того, кто держит базу данных
  • От чтения чужих данных другим пользователем: правила доступа работают в базе, а не в приложении
  • От плагина, который захотел бы украсть сессию, подделать интерфейс или отчитаться на необъявленный сервер
  • От пассивного сбора: нет ни аналитики, ни сбора падений, ни рекламного кода, которым что-то утекало бы
  • От чтения кода восстановления по дампу базы и от вскрытия резервной копии ключа без пароля

От чего NeyLivo не защищает

  • От недобросовестного владельца сервера аутентификации: он мог бы перехватить пароль при входе и открыть резервную копию ключа
  • От чтения групповых бесед и каналов серверов в базе — они не защищены сквозным шифрованием
  • От скачивания незашифрованных вложений: сегодня они лежат в публичном хранилище
  • От взломанного устройства: вредоносная программа или человек за вашим разблокированным компьютером видит то же, что и вы
  • От анализа связей: кто с кем и когда общается, серверу видно
  • От снимка вашего экрана другой камерой — что бы ни было включено в защите от съёмки

Известные слабые места

Список слабых мест, который проект ведёт сам, в том порядке, в каком собирается их закрывать:

  1. Вложения в публичном хранилище. Файлы, отправленные без шифрования вложений, скачает любой, у кого есть ссылка. Исправление — закрыть хранилище и перейти на подписанные ссылки, не сломав те ссылки, что уже лежат внутри старых сообщений, — запланировано и делается по шагам.
  2. Шифрование выключено по умолчанию. Приватность, которая работает только у того, кто нашёл её в настройках, — это приватность, которой большинство не получает.
  3. Групповые беседы и каналы не защищены сквозным шифрованием. Групповое сквозное шифрование — отдельная и большая задача, и придумывать её на ходу никто не будет.
  4. Шифрование звонков не проверено в жизни. В проверках оно работает; настоящим звонком не подтверждено.
  5. Нет Content-Security-Policy. Известного пути для внедрения кода сегодня нет — сообщения рисуются узлами React, и вставки сырого HTML в приложении нет нигде, — но CSP это второй рубеж, который ловит завтрашнюю ошибку.
  6. Картинки эмодзи грузятся с чужого CDN. Значит, посторонний видит ваш IP просто потому, что в интерфейсе есть эмодзи. Положить их в сборку несложно, и это запланировано.
  7. Минимальная длина пароля — шесть символов. Мало.
  8. Внешнего аудита не было. Никто со стороны всё это не проверял.

Полный технический разбор тех же находок, со ссылками на файлы, опубликован в репозитории как SECURITY_ARCHITECTURE_AUDIT.md. Открыть аудит →

Как сообщить об уязвимости

Если вы нашли уязвимость, сообщите о ней сначала лично и дайте шанс её починить до того, как о ней узнают все. Это защищает людей, которые пользуются NeyLivo, а не репутацию проекта.

Вознаграждения за уязвимости нет. Платить проекту нечем, а пообещать то, чего он не выполнит, было бы хуже, чем сказать это прямо.

Правила сообщения об уязвимостях в репозитории →  ·  Страница приватности →