Files
bare/docs/threat-model.md
T
mayatnikovandClaude Fable 5 a898347005 Закрыть открытые вопросы: ADR-015…022, бриф айдентики
Регистрация открытая (015), контакты и приглашения по нику с
закреплением ключа и блокировкой (016), лимиты (017), идентификация
устройства через случайный deviceId в IndexedDB и серверный fan-out
(018), отказ от серверного перца (019), смена пароля не в v1 (020),
интерфейс ru/en (021), айдентика «Скобы» по turn 2 канваса (022).

Архитектура, модель угроз и README обновлены. В открытых вопросах
остались два: моногарнитура с кириллицей (Fragment Mono её не
содержит) и удаление аккаунта.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01R2pCJkWyG2aYu48u1Vp1A1
2026-08-20 22:42:20 +03:00

6.7 KiB
Raw Blame History

Модель угроз

Честная. Здесь написано не только что Bare защищает, но и чего он защитить не может.

Что защищаем

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

От кого защищаем

Пассивный оператор сервера. Админ с полным доступом к базе и диску видит: ники, argon2-хеши, зашифрованные ключевые блобы, метаданные комнат и контактов, транзитную очередь шифротекстов. Плейнтекста у него нет.

Сетевой наблюдатель. HTTPS обязателен. Наблюдатель видит факт и объём трафика к серверу, не содержимое.

Кража базы или бэкапа. В базе нет ничего сверх того, что видит оператор: те же шифротексты и метаданные. Ключевые блобы в дампе — материал для оффлайн-перебора паролей; цена перебора задана ADR-013. Серверного «перца» нет (ADR-019): второй критичный артефакт рядом с базой опаснее для маленькой инсталляции, чем сценарий, который он закрывает.

Спам и незнакомцы. Регистрация открытая. Написать можно только взаимному контакту: запрос надо принять. Отклонение с блокировкой — и сервер больше не доставляет от этого ника ничего. Частота запросов и сообщений ограничена (ADR-017).

Push-инфраструктура. Пуш не несёт содержимого: сервер не знает плейнтекста, поэтому его нет и в пуше.

От кого не защищаем

Активно-злонамеренный оператор. Оператор, способный подменить клиентский код, может украсть ключи и плейнтекст. Это фундаментальный предел web-E2EE: клиент каждый раз загружается с сервера. Смягчение — открытый код и клиент из нескольких читаемых файлов без сборки: подмену можно заметить глазами. Гарантии нет.

Второй путь того же оператора — подмена публичного ключа при добавлении контакта. Первый контакт — доверие на слово (TOFU). Дальше ключ закреплён на устройстве: подмена после первого контакта видна как предупреждение (ADR-016). Отпечаток ключа доступен для сверки вне канала; автоматической защиты первого контакта нет.

Метаданные. Кто, с кем, когда и сообщениями какого размера обменивается — серверу видно. Скрытие метаданных — не задача Bare.

Компрометация устройства. История лежит на устройстве в открытом виде (IndexedDB). Доступ к устройству — доступ к истории. Защита устройства — зона ответственности пользователя и ОС.

Утечка пароля. В v1 пароль сменить нельзя (ADR-020). Узнавший пароль владеет аккаунтом — ключами, контактами, входящими сообщениями — до тех пор, пока владелец не заведёт новый аккаунт.

Слабый пароль. Пароль — материал ключа. Ключевой блоб хранится на сервере, и его стойкость к оффлайн-перебору равна стойкости пароля. Гарантия «оператор не читает сообщения» действует в пределах стойкости пароля пользователя: слабый пароль — слабое E2EE. Это осознанная цена парольного мультидевайса. Контрмеры (ADR-013): PBKDF2-HMAC-SHA256 с не менее чем 600 000 итераций, пароль от 12 символов, рекомендация парольной фразы в UI.

Собеседник. E2EE не защищает от участника чата: получатель может сохранить, переслать, сфотографировать. «Удалить у всех» после доставки не существует.

Сам владелец истории. Привязка экспорта к аккаунту (ADR-014) защищает файл, а не содержимое от владельца. Пользователь, желающий отдать переписку третьему лицу, сделает это скриншотами или модифицированным клиентом — «аналоговая дыра» криптографией не закрывается. К тому же у собеседников есть собственные копии тех же сообщений. Смысл привязки: перемещённый — случайно или злонамеренно — файл .bare бесполезен для посторонних.

Осознанные пределы v1

Forward secrecy отсутствует. Компрометация приватного ключа пользователя раскрывает ранее записанные атакующим шифротексты его чатов 1:1. Осознанный non-goal v1.

Push-транспорт идёт через инфраструктуру вендоров браузеров (FCM, APNs, Mozilla). Это свойство стандарта Web Push, а не наша зависимость. Вендоры видят факт и время доставки пуша.