脅威モデル
このドキュメントでは、secretctl の脅威モデルのビジュアル概要を提供し、軽減される攻撃と明示的に対象外のものを示します。
ビジュアル脅威モデル
┌─────────────────────────────────────────────────────────────────────────────┐
│ secretctl 脅威モデル v1 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 攻撃者 防御 資産 │
│ ═══════ ════ ════ │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ L1: ネット │─────────┐ │ シークレット │ │
│ │ ワーク │ │ │ (API キー, │ │
│ │ 観察者 │ ▼ │ パスワード) │ │
│ │ │ ┌──────────┐ └──────┬──────┘ │
│ │ • パッシブ │ │localhost │ ┌───────────────────┐ │ │
│ │ スニフ │ │ のみ │───▶│ネットワークアクセス│ │ │
│ │ • MITM │ └──────────┘ │ なし │ │ │
│ └─────────────┘ └───────────────────┘ │ │
│ ✓ 保護済み │ │
│ │ │
│ ┌─────────────┐ ▼ │
│ │ L2: ローカル│─────────┐ ┌───────────────────┐ │
│ │ 悪意のある │ │ │ 暗号化された │ │
│ │ アプリ │ ▼ │ VAULT │ │
│ │ │ ┌──────────────┐ │ │ │
│ │ • ファイル │ │ AES-256-GCM │ │ ┌─────────────┐ │ │
│ │ 読み取り │ │ + Argon2id │ │ │ vault.db │ │ │
│ │ • Vault │ │ (64MB/3iter) │ │ │ (0600 権限) │ │ │
│ │ 窃取 │ └──────────────┘ │ └─────────────┘ │ │
│ └─────────────┘ ✓ 保護済み │ │ │ │
│ │ ▼ │ │
│ ┌─────────────┐ │ ┌─────────────┐ │ │
│ │ L3: Root │ │ │ DEK │ │ │
│ │ 攻撃者 │ ✗ 対象外 │ │ (暗号化) │ │ │
│ │ │ │ └─────────────┘ │ │
│ │ • メモリ │ 業界標準の除外事項: │ │ │ │
│ │ ダンプ │ Vault、1Password、 │ ▼ │ │
│ │ • Root │ Infisical と同じ │ ┌─────────────┐ │ │
│ │ アクセス │ │ │ マスターキー │ │ │
│ └─────────────┘ │ │ (メモリ) │ │ │
│ │ └─────────────┘ │ │
│ └───────────────────┘ │
│ │
│ ┌─────────────┐ AI安全設計 │
│ │ AI エージェント│─────────┐ │
│ │ (MCP 経由) │ │ │
│ │ │ ▼ │
│ │ • プロンプト│ ┌──────────────────────────────────────────────┐ │
│ │ インジェ │ │ AI安全設計 │ │
│ │ クション │ │ │ │
│ │ • コンテキ │ │ ┌────────────┐ ┌────────────────────┐ │ │
│ │ スト漏洩 │ │ │ MCP サーバー│───▶│ 平文シークレットを │ │ │
│ │ • 学習デー │ │ │ │ │ 決して返さない │ │ │
│ │ タ漏洩 │ │ └────────────┘ └────────────────────┘ │ │
│ └─────────────┘ │ │ │
│ │ AI で利用可能: 利用不可: │ │
│ ✓ 保護済み │ • secret_list (名前) • secret_get ❌ │ │
│ │ • secret_exists • secret_set ❌ │ │
│ │ • secret_get_masked • secret_delete ❌ │ │
│ │ • secret_run (注入) • export ❌ │ │
│ │ • secret_list_fields │ │
│ │ • secret_get_field (非機密のみ) │ │
│ │ • secret_run_with_bindings │ │
│ └──────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
攻撃レベルサマリー
| レベル | 攻撃者 | 能力 | 保護? | 方法 |
|---|---|---|---|---|
| L1 | ネットワーク観察者 | スニフィング、MITM | はい | localhost のみ、ネットワーク露出なし |
| L2 | 悪意のあるアプリ | ファイル読み取り、Vault 窃取 | はい | AES-256-GCM + Argon2id 暗号化 |
| L3 | Root 攻撃者 | メモリダンプ、フルアクセス | いいえ | 業界標準の除外事項 |
| AI | MCP 経由 AI エージェント | プロンプトインジェクション、漏洩 | はい | AI安全設計(平文なし) |
防御マトリックス
┌────────────────────────┬──────────────────────────────────────────────────┐
│ 脅威 │ 対策 │
├────────────────────────┼──────────────────────────────────────────────────┤
│ ネットワーク傍受 │ ✓ localhost のみの MCP(TCP なし) │
│ │ ✓ AI 通信用 stdio トランスポート │
├────────────────────────┼──────────────────────────────────────────────────┤
│ Vault ファイル窃取 │ ✓ AES-256-GCM 認証付き暗号化 │
│ │ ✓ Argon2id 鍵導出(64MB、3イテレーション) │
│ │ ✓ シークレットごとのランダム nonce │
├────────────────────────┼──────────────────────────────────────────────────┤
│ パスワード総当たり │ ✓ Argon2id メモリハード(試行ごと 64MB) │
│ │ ✓ OWASP 2025 準拠パラメータ │
│ │ ✓ Vault ごとに 128 ビット salt │
├────────────────────────┼──────────────────────────────────────────────────┤
│ AI 平文露出 │ ✓ AI安全設計: secret_get なし │
│ │ ✓ secret_run は AI に見えずに注入 │
│ │ ✓ 漏洩した値の出力サニタイズ │
├────────────────────────┼──────────────────────────────────────────────────┤
│ プロンプトインジェクション│ ✓ AI コンテキストにシークレットなし = 盗むものなし│
│ │ ✓ フィールド感度強制(機密フィールドをブロック) │
│ │ ✓ ブロックされたコマンド(env、printenv など) │
├────────────────────────┼──────────────────────────────────────────────────┤
│ 監査改ざん │ ✓ HMAC チェーン整合性検証 │
│ │ ✓ prev_hash 不一致による改ざん検出 │
│ │ ✓ secretctl audit verify コマンド │
├────────────────────────┼──────────────────────────────────────────────────┤
│ 弱いファイル権限 │ ✓ vault.db、vault.salt に 0600 │
│ │ ✓ vault ディレクトリに 0700 │
│ │ ✓ 起動時の権限チェック │
└────────────────────────┴──────────────────────────────────────────────────┘
AI安全設計フロー
この図は、シークレットが AI コンテキストに到達せずにシステムを流れる方法を示しています:
┌─────────────────────────────────────────────────────────────────────────────┐
│ AI安全設計データフロー │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ │
│ │ AI エージェント│ 「AWS 認証情報で 'aws s3 ls' を実行」 │
│ │ (Claude) │ │
│ └──────┬───────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ MCP サーバー │ 受信: keys=["aws/*"], command="aws s3 ls" │
│ │ (secretctl) │ AI が見るもの: キー名のみ │
│ └──────┬───────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ セキュリティ境界 │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ 1. マスターキーで vault を復号 │ │ │
│ │ │ 2. マッチするシークレットを取得 │ │ │
│ │ │ 3. サブプロセスの環境変数として設定 │ │ │
│ │ │ AWS_ACCESS_KEY=AKIA... (AI に送信されない) │ │ │
│ │ │ AWS_SECRET_KEY=wJal... (AI に送信されない) │ │ │
│ │ │ 4. コマンド実行: aws s3 ls │ │ │
│ │ │ 5. 出力をキャプチャしてサニタイズ │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ MCP サーバー │ 返却: {"stdout": "bucket1\nbucket2", "exit_code": 0} │
│ │ (レスポンス) │ AI が見るもの: サニタイズされたコマンド出力のみ │
│ └──────┬───────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ AI エージェント│ 「S3 バケットは: bucket1, bucket2」 │
│ │ (レスポンス) │ AI はシークレットを見ずに使用した │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
対象外(業界標準)
以下の脅威は secretctl の脅威モデルから明示的に除外されており、HashiCorp Vault、1Password、Infisical などの業界リーダーと一貫しています:
ルートレベルの侵害
- 攻撃者が root アクセスを持っている場合、プロセスメモリを読み取り、キーロガーをインストール、またはバイナリを変更できる
- ユーザースペースアプリケーションは侵害されたカーネルに対して防御できない
- 軽減策: 標準的なプラクティス(更新、アクセス制御、監視)でシステムを保護
メモリダンプ攻撃
- Go のガベージコレクターがメモリを管理するため、確実なシークレットのゼロ化は困難
- シークレットはガベージコレクションまでメモリに残る可能性がある
- 軽減策: secretctl はメモリ内のシークレット存在時間を最小化; 暗号化スワップを使用
弱いマスターパスワード
- 弱いパスワードを選択したユーザーは総当たり攻撃される可能性
- Argon2id は攻撃を遅くするが、弱いパスワードでは決意した攻撃者を防げない
- 軽減策: 強力なマスターパスワードを選択(12文字以上推奨)
物理デバイスアクセス
- 攻撃者がアンロックされたデバイスへの物理アクセスを持っている場合、シークレットにアクセス可能
- 軽減策: デバイス暗号化、自動ロック、物理セキュリティを使用
業界との比較
| 製品 | ネットワーク保護 | 保存時暗号化 | AI 平文保護 | 監査ログ |
|---|---|---|---|---|
| HashiCorp Vault | mTLS | AES-256 | なし(MCP で公開) | あり |
| 1Password | TLS | AES-256-GCM | あり(MCP 拒否) | あり |
| Infisical | TLS | AES-256 | なし(MCP で公開) | あり |
| secretctl | localhost のみ | AES-256-GCM | あり(AI安全設計) | あり |
secretctl はユニークに組み合わせています:
- AI 連携のための MCP サポート
- 平文露出を防ぐ AI安全設計
- クラウド依存のない ローカルファースト アーキテクチャ
セキュリティ報告
セキュリティの問題を見つけましたか?責任を持って報告してください:
- メール: secretctl.oss@gmail.com
- セキュリティ脆弱性については公開の GitHub Issue を開かないでください
- 公開開示の前に修正のための適切な時間を与えてください
完全なポリシーは SECURITY.md を参照してください。
関連ドキュメント
- セキュリティ概要 - コアセキュリティ原則
- 仕組み - 詳細アーキテクチャ
- 暗号化詳細 - 暗号仕様
- MCP ツールリファレンス - AI 連携セキュリティ