コンテンツにスキップ

セキュリティアーキテクチャ

HistorySync は機密データ — ブラウジング履歴と WebDAV 認証情報 — を扱います。このページでは、そのデータがどのように保護されているかを詳しく説明します。


脅威モデル

HistorySync は以下の脅威からの保護を目的として設計されています:

  • 認証情報の盗難 — ディスク上の設定ファイルを読み取る悪意のあるプロセスが、平文の WebDAV パスワードを復元できないようにする。
  • 通信中のデータ漏洩 — 履歴のバックアップと復元は暗号化された接続を使用しなければならない。
  • 偶発的なデータ損失 — 破損した設定や失敗したアップロードによって、データベースが不整合な状態に陥らないようにする。

HistorySync は以下の脅威から保護しません

  • OS が侵害された場合や root レベルの攻撃者(キーチェーンに直接アクセスできる)。
  • 物理アクセス攻撃(フルディスク暗号化はこのアプリケーションの範囲外)。
  • 同じユーザーセッションでコードを実行できる攻撃者。

セキュリティアーキテクチャ V2

マスターキーの保存

初回実行時に暗号学的にランダムな 256 ビットのマスターキー が生成され、keyring ライブラリを使用して OS キーチェーン に保存されます:

プラットフォーム キーチェーンバックエンド
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 パスワードやその他の機密設定値は HKDF-SHA256 キーストリーム XOR で暗号化され、HMAC-SHA256 で認証されます:

encrypt(plaintext, 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)

結果は config.json に Base64 文字列として保存されます。読み込み時は、復号の前に HMAC タグが検証されます。

HMAC-SHA256 は認証付き暗号化を提供します — 暗号文への改ざんは HMAC 検証の失敗を引き起こし DecryptionError がスローされます。これはキャッチされてログに記録され、アプリはクラッシュしたり破損した値をサイレントに受け入れたりするのではなく、空のパスワードで動作し続けます。


設定ファイルの安全性

設定ファイル(config.json)はアトミックなリネームを使用して書き込まれます:

  1. 同じディレクトリ内の一時ファイルにデータが書き込まれます。
  2. ディスクへのフラッシュのために fsync() が呼ばれます。
  3. 一時ファイルが既存の設定ファイルの上にリネームされます。

これにより、設定が部分的に書き込まれた状態になることはありません。書き込み中にプロセスが終了した場合、古い設定がそのまま保持されます。

読み込み時に設定ファイルが破損していると判明した場合: 1. config.json.bak にバックアップされます。 2. デフォルト設定に置き換えられます。 3. ユーザーに警告ダイアログが表示されます。


WebDAV トランスポートセキュリティ

  • すべての WebDAV 接続はデフォルトで HTTPS を使用します。
  • SSL 証明書の検証はデフォルトで有効webdav.verify_ssl = true)です。
  • 信頼できる内部ネットワーク上の自己署名証明書のために SSL 検証を無効化(verify_ssl = false)することは可能ですが、インターネットに公開されているサーバーには推奨しません
  • バックアップアップロードはアトミックストリーミングを使用します — アップロードが正常に完了した後にのみリモートファイルが置き換えられます。

パスワード / マスターパスワード(GUI ロック)

HistorySync は GUI をロックするオプションのマスターパスワードをサポートしています。これは上記の WebDAV 認証情報暗号化とは別のものです。

  • パスワードは config.jsonmaster_password_hash フィールドに bcrypt ハッシュ として保存されます。
  • bcrypt ハッシュは一方向です — config.json が盗まれても、平文のパスワードは復元できません。
  • マスターパスワードは履歴データベース自体を暗号化しません — GUI をロックするだけです。

プライバシー機能

機能 説明
ドメインブラックリスト ブラックリスト上のドメインはインポートされず、既存のレコードは完全に削除されます。
URL プレフィックスフィルター ブラウザの内部 URL(chrome://about:file:// など)はデフォルトでフィルタリングされます。
ソフト非表示 レコードを削除せずにメインビューから非表示にできます。
非表示レコードビュー ソフト非表示にされたレコードのための、アクセス制御された専用ビュー。
ヘッドレス / フレッシュモード --fresh モードは一時ディレクトリを使用します — 実際の設定・データベースへの読み書きはありません。プライバシーに配慮したデモやトラブルシューティングに便利です。

脆弱性の報告

セキュリティの脆弱性には公開の GitHub Issue を開かないでください。

以下の内容を記載した上で 0x4fe6@gmail.com にメールをお送りください:

  • 脆弱性の説明。
  • 再現手順。
  • 潜在的な影響。

72 時間以内に返信します。修正と責任ある開示のタイムラインをご一緒に調整します。