Архитектура Безопасности¶
HistorySync обрабатывает чувствительные данные — историю браузера и учётные данные WebDAV. На этой странице подробно объясняется, как эти данные защищаются.
Модель Угроз¶
HistorySync разработан для защиты от:
- Кражи учётных данных — вредоносный процесс, читающий файл конфигурации на диске, не должен иметь возможности восстановить пароли WebDAV в открытом виде.
- Перехвата данных при передаче — резервное копирование и восстановление истории должны использовать зашифрованные соединения.
- Случайной потери данных — повреждённые конфигурации и неудавшиеся загрузки не должны оставлять базу данных в несогласованном состоянии.
HistorySync не защищает от:
- Скомпрометированной ОС или злоумышленника уровня root (который может напрямую получить доступ к хранилищу ключей).
- Атак физического доступа (полное шифрование диска выходит за рамки данного приложения).
- Злоумышленника, способного выполнять код в той же пользовательской сессии.
Архитектура Безопасности V2¶
Хранение Мастер-Ключа¶
Криптографически случайный 256-битный мастер-ключ генерируется при первом запуске и хранится в системном хранилище ключей ОС с использованием библиотеки keyring:
| Платформа | Бэкенд хранилища |
|---|---|
| Windows | Диспетчер учётных данных Windows |
| macOS | Связка ключей macOS |
| Linux | Secret Service API (GNOME Keyring, KWallet и др.) |
Мастер-ключ никогда напрямую не касается диска. Все данные, сохраняемые на диске, используют производные подключи.
Деривация Ключей (HKDF)¶
Из мастер-ключа HistorySync выводит независимые подключи для каждой цели, используя HKDF (Функция Деривации Ключей на основе HMAC):
Мастер-Ключ (256 бит)
│
├── HKDF(info="encryption") → Подключ Шифрования (256 бит)
└── HKDF(info="authentication") → Подключ Аутентификации (256 бит)
Использование независимых подключей означает, что компрометация одного подключа (например, через криптоаналитическую атаку на алгоритм шифрования) не компрометирует другой.
Шифрование Чувствительных Значений¶
Пароли WebDAV и другие чувствительные значения конфигурации шифруются с помощью XOR потоком ключей HKDF-SHA256 с аутентификацией через HMAC-SHA256:
зашифровать(открытый_текст, master_key):
salt ← случайная 16-байтовая соль
prk ← HMAC-SHA256(key=salt, data=master_key) # HKDF-Extract
enc_key ← HKDF-Expand(prk, info="historysync-enc-key")
auth_key ← HKDF-Expand(prk, info="historysync-auth-key")
keystream ← HKDF-Expand(prk, info="historysync-enc-key", length=len(padded_plaintext))
ciphertext ← padded_plaintext XOR keystream
tag ← HMAC-SHA256(key=auth_key, data=salt ‖ ciphertext)
return base64(0x02 ‖ salt ‖ tag ‖ ciphertext)
Результат хранится как строка Base64 в config.json. При загрузке тег HMAC проверяется до попытки расшифровки.
HMAC-SHA256 обеспечивает аутентифицированное шифрование — любое вмешательство в зашифрованный текст приводит к ошибке проверки HMAC DecryptionError, которая перехватывается и журналируется. Приложение продолжает работу с пустым паролем, а не падает или молча принимает повреждённое значение.
Безопасность Файла Конфигурации¶
Файл конфигурации (config.json) записывается с использованием атомарного переименования:
- Данные записываются во временный файл в той же директории.
- Вызывается
fsync()для сброса на диск. - Временный файл переименовывается поверх существующего файла конфигурации.
Это гарантирует, что конфигурация никогда не окажется в частично записанном состоянии. Если процесс будет прерван в середине записи, старая конфигурация сохранится нетронутой.
Если файл конфигурации при загрузке окажется повреждённым, он:
1. Резервируется в config.json.bak.
2. Заменяется свежей конфигурацией по умолчанию.
3. Пользователю показывается диалог предупреждения.
Безопасность Транспорта WebDAV¶
- Все соединения WebDAV по умолчанию используют HTTPS.
- Проверка SSL-сертификата включена по умолчанию (
webdav.verify_ssl = true). - Отключение проверки SSL (
verify_ssl = false) возможно для самоподписанных сертификатов на доверенных внутренних сетях, но не рекомендуется для серверов, доступных из интернета. - Загрузки резервных копий используют атомарную потоковую передачу — удалённый файл заменяется только после успешного завершения загрузки.
Пароль / Мастер-Пароль (Блокировка GUI)¶
HistorySync поддерживает опциональный мастер-пароль, который блокирует GUI. Это отдельно от шифрования учётных данных WebDAV, описанного выше.
- Пароль хранится как bcrypt-хеш в
config.json(полеmaster_password_hash). - bcrypt-хеш односторонний — даже если
config.jsonбудет похищен, открытый пароль не может быть восстановлен. - Мастер-пароль не шифрует саму базу данных истории — он только блокирует GUI.
Функции Конфиденциальности¶
| Функция | Описание |
|---|---|
| Чёрный список доменов | Домены в чёрном списке никогда не импортируются, а существующие записи удаляются навсегда. |
| Фильтры префиксов URL | Внутренние URL браузеров (chrome://, about:, file:// и др.) фильтруются по умолчанию. |
| Мягкое скрытие | Записи можно скрыть из основного вида без удаления. |
| Вид скрытых записей | Отдельный вид с контролем доступа для мягко скрытых записей. |
| Без интерфейса / Fresh режим | Режим --fresh использует временную директорию — чтения или записи в реальную конфигурацию/базу данных не происходит. Полезно для демонстраций, требующих конфиденциальности, или устранения неполадок. |
Сообщение об Уязвимостях¶
Не открывайте публичный GitHub issue для уязвимостей безопасности.
Пожалуйста, отправьте письмо на 0x4fe6@gmail.com с:
- Описанием уязвимости.
- Шагами для воспроизведения.
- Возможным воздействием.
Вы получите ответ в течение 72 часов. Мы скоординируем с вами исправление и сроки ответственного раскрытия информации.