Skip to content

[security] Key file created with default permissions (no restrictive mode) #2

@ouchanip

Description

@ouchanip

該当箇所

src/utils.js:14-16writeFile function

export async function writeFile(filepath, content) {
  await fs.writeFile(filepath, content, utf8);
}

src/index.js:35-36init() creates .env.key

const key = generateKey();
await writeFile(keyPath, key);

問題

.env.key (暗号化キー) が fs.writeFile() でデフォルトパーミッション (umask依存、通常 0o644) で作成される。これは グループ/その他ユーザーにも読み取り可能 になることを意味する。

シークレット管理ツールとして、キーファイルが他ユーザーから読み取れるのは致命的な脆弱性。

攻撃シナリオ

  1. 共有サーバーまたは CI 環境で vault init を実行
  2. .env.key が 0o644 で作成される
  3. 同じマシンの他ユーザーがキーを読み取り、.env.enc を復号
  4. 全ての環境変数(DB認証情報、APIキー等)が漏洩

修正案

簡易修正

writeFile に mode オプションを追加:

export async function writeFile(filepath, content, mode = 0o600) {
  await fs.writeFile(filepath, content, { encoding: utf8, mode });
}

本格修正

  • init() でキーファイル作成時に mode: 0o600 を明示的に指定
  • 既存キーファイルのパーミッションもチェックし、0o600 以外なら警告
  • encrypt() / decrypt() でキーファイル読み取り時にパーミッションを検証
  • macOS では fs.writeFile の mode オプションが機能しない可能性があるため、書き込み後に fs.chmod(filepath, 0o600) を追加することを推奨

影響範囲

  • vault init で生成される全てのキーファイル
  • 共有環境・CI環境での利用時に影響が最大化

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions