Перейти к содержимому
SafePass

Модель угроз SafePass

Область применения

Модель охватывает клиентское шифрование, локальный кэш, аутентификацию и восстановление аккаунта, API синхронизации, расширение браузера, необязательный Native Messaging и развёртывание. Предполагается, что злоумышленник может контролировать сеть или получить копию серверного хранилища. Защита разблокированного скомпрометированного устройства находится за пределами модели.

Защищаемые данные

  • Мастер-пароль и состояние клиента OPAQUE.
  • Ключ сейфа, открытые данные записей, заметки и сгенерированные пароли.
  • Фраза и ключ подписи восстановления, а также зашифрованный для восстановления ключ сейфа.
  • Токены обновления, сессии доступа и состояние сессий устройств.
  • Конверты ревизий, связи веток и очередь локальных операций.
  • Ключи настройки сервера OPAQUE, подписи и развёртывания.
  • Зашифрованные копии PostgreSQL и отдельный закрытый ключ age для восстановления.

Границы доверия

  1. Процессы Flutter и браузера доверенные. При разблокировке они обрабатывают чувствительные данные.
  2. crypto_core определяет форматы шифротекста и вывод ключей. C ABI и платформенные привязки входят в доверенную вычислительную базу.
  3. API и PostgreSQL не доверяются с открытыми данными или ключами сейфа. API проверяет OPAQUE, подписанные доказательства восстановления и авторизацию JWT. PostgreSQL хранит хеши токенов обновления. Клиенты сохраняют токены в зашифрованном локальном хранилище.
  4. Контент-скрипты расширения выполняются рядом со страницей и считаются недоверенными. Они получают только поля, необходимые для явно одобренного заполнения.
  5. Native Messaging — необязательная локальная граница. Требуются разрешённый источник, ограниченный размер сообщений, список допустимых команд и одноразовое рукопожатие.
  6. TLS, системное защищённое хранилище и подпись кода платформы — требования к развёртыванию.

Угрозы и меры защиты

Угроза Мера защиты Остаточный риск
Перехват или изменение сетевого трафика TLS, клиентское AEAD и аутентифицированный обмен OPAQUE Видны время трафика, идентификатор аккаунта и размеры шифротекста
Утечка сервера или базы Ревизии шифрует клиент, для восстановления используется отдельный конверт, ключа сейфа у сервера нет Могут раскрыться метаданные аккаунта, связи ревизий и данные для офлайн-подбора пароля
Утечка носителя с копиями Дампы шифруются age для офлайн-получателя, доступ к каталогам ограничен Закрытый ключ age и секреты развёртывания нужно отдельно защищать и сохранять для восстановления
Офлайн-подбор мастер-пароля Файл пароля OPAQUE и конверт ключа сейфа с Argon2id и версионированными параметрами Слабый пароль можно подобрать по конверту, Argon2id повышает стоимость перебора
Подмена шифротекста, ID записи или ревизии Тег AES-GCM и AAD привязывают ID, ревизии неизменяемы Вредоносный сервер может скрыть ревизию или повторить старую действительную ревизию
Кража фразы восстановления Фраза показывается с подтверждением, конверт шифрует клиент, API получает открытый ключ и шифротекст Фраза позволяет сбросить пароль аккаунта, а вместе с конвертом — раскрыть ключ сейфа
Замена конверта восстановления При регистрации подтверждается владение новым ключом, последующая замена требует подписи прежним ключом и привязки к хешу конверта Вредоносный API может удалить или откатить шифротекст, внешний свидетель отката отсутствует
Украденный JWT при смене ключа восстановления После регистрации для замены нужен прежний ключ подписи, выведенный из фразы Первая регистрация использует аутентифицированную сессию, поэтому короткоживущий токен нужно защищать
Кража или повтор токена обновления Случайные 256 бит, хранение хеша, одноразовое обновление, отзыв семейства при повторе, зашифрованное хранилище клиента, проверка sid Текущий украденный токен действует до обновления, отзыва или истечения срока, старые JWT без sid действуют до 15 минут
Украденный токен используется для удаления аккаунта или выхода других устройств Для удаления нужен свежий одноразовый билет OPAQUE, отзыв ограничен сессиями собственного аккаунта До отзыва или истечения токен может раскрыть время сессий аккаунта и отозвать другие сессии
Запросы с вредоносного сайта CORS выключен по умолчанию, SAFEPASS_WEB_ORIGINS допускает точные HTTPS-источники без credentials, токены не идут в cookies Код разрешённого источника обрабатывает пароль аккаунта и токены. Веб-кабинет не закрепляет ключ сервера и не получает ключ сейфа
Вредоносная страница или компрометация расширения Явное заполнение, точное совпадение источника, запрет доступа контент-скрипта ко всему сейфу и строгий CSP Компрометация браузера, ОС или обновления расширения может раскрыть открытые записи
Кража заблокированного устройства Кэш SQLCipher, ключ в защищённом хранилище ОС, блокировка при простое, отсутствие открытых столбцов Дампы памяти, кейлоггеры, злоупотребление доступностью и компрометация ОС вне модели
Подмена Native Host или злоупотребление локальным портом Только Native Messaging, список источников и команд, ограниченные кадры JSON Локальный пользователь может заменить двоичные файлы или манифесты
Утечка через журналы, дампы или телеметрию Структурное скрытие данных, исключение тел и паролей из логов и секретов из исключений Системные отчёты о сбоях и сторонние средства диагностики требуют аудита перед выпуском

Обязательные свойства реализации

  • Открытое содержимое записи и мастер-пароль не отправляются API.
  • API не получает ключ сейфа и фразу восстановления.
  • PostgreSQL хранит хеши токенов обновления. Клиенты сохраняют токены только в зашифрованном хранилище.
  • Для каждой ревизии создаются новые соль и nonce. Ревизия шифруется один раз выведенным ключом.
  • При конфликте обе неизменяемые ветки сохраняются до решения пользователя.
  • Локальное восстановление заменяет конверты пароля и восстановления без изменения шифротекста записей.
  • Серверное восстановление заменяет учётные данные OPAQUE, погашает вызовы и отзывает сессии обновления в одной транзакции PostgreSQL. JWT с sid перестают работать сразу, старые JWT без sid — по истечении срока.
  • Расширение должно открывать собственный зашифрованный кэш и вызывать API без запущенного настольного приложения.
  • Для локальной базы приложения обязателен SQLCipher. Без провайдера шифрования или ключа запуск завершается отказом.
  • Секреты API монтируются файлами. Рабочая роль API не использует учётные данные администратора базы.
  • Копии PostgreSQL шифруются перед сохранением. Проверка восстановления использует отдельную временную базу.

Ограничения и условия выпуска

Модель не обещает защиту от компрометации разблокированного устройства, принуждения, подсматривания, перехвата буфера обмена, вредоносных системных средств доступности и атак на доступность. Перед эксплуатацией нужны замеры параметров OPAQUE и KSF на устройствах, межплатформенное ревью нативных привязок, независимая проверка восстановления и распределённых одноразовых вызовов, внешний аудит продукта и проверка зависимостей и SBOM.

Документация