Модель угроз SafePass
Область применения
Модель охватывает клиентское шифрование, локальный кэш, аутентификацию и восстановление аккаунта, API синхронизации, расширение браузера, необязательный Native Messaging и развёртывание. Предполагается, что злоумышленник может контролировать сеть или получить копию серверного хранилища. Защита разблокированного скомпрометированного устройства находится за пределами модели.
Защищаемые данные
- Мастер-пароль и состояние клиента OPAQUE.
- Ключ сейфа, открытые данные записей, заметки и сгенерированные пароли.
- Фраза и ключ подписи восстановления, а также зашифрованный для восстановления ключ сейфа.
- Токены обновления, сессии доступа и состояние сессий устройств.
- Конверты ревизий, связи веток и очередь локальных операций.
- Ключи настройки сервера OPAQUE, подписи и развёртывания.
- Зашифрованные копии PostgreSQL и отдельный закрытый ключ age для восстановления.
Границы доверия
- Процессы Flutter и браузера доверенные. При разблокировке они обрабатывают чувствительные данные.
crypto_coreопределяет форматы шифротекста и вывод ключей. C ABI и платформенные привязки входят в доверенную вычислительную базу.- API и PostgreSQL не доверяются с открытыми данными или ключами сейфа. API проверяет OPAQUE, подписанные доказательства восстановления и авторизацию JWT. PostgreSQL хранит хеши токенов обновления. Клиенты сохраняют токены в зашифрованном локальном хранилище.
- Контент-скрипты расширения выполняются рядом со страницей и считаются недоверенными. Они получают только поля, необходимые для явно одобренного заполнения.
- Native Messaging — необязательная локальная граница. Требуются разрешённый источник, ограниченный размер сообщений, список допустимых команд и одноразовое рукопожатие.
- 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.