該当箇所
src/utils.js:14-16 — writeFile function
export async function writeFile(filepath, content) {
await fs.writeFile(filepath, content, utf8);
}
src/index.js:35-36 — init() creates .env.key
const key = generateKey();
await writeFile(keyPath, key);
問題
.env.key (暗号化キー) が fs.writeFile() でデフォルトパーミッション (umask依存、通常 0o644) で作成される。これは グループ/その他ユーザーにも読み取り可能 になることを意味する。
シークレット管理ツールとして、キーファイルが他ユーザーから読み取れるのは致命的な脆弱性。
攻撃シナリオ
- 共有サーバーまたは CI 環境で
vault init を実行
.env.key が 0o644 で作成される
- 同じマシンの他ユーザーがキーを読み取り、
.env.enc を復号
- 全ての環境変数(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環境での利用時に影響が最大化
該当箇所
src/utils.js:14-16 —
writeFilefunctionsrc/index.js:35-36 —
init()creates.env.key問題
.env.key(暗号化キー) がfs.writeFile()でデフォルトパーミッション (umask依存、通常 0o644) で作成される。これは グループ/その他ユーザーにも読み取り可能 になることを意味する。シークレット管理ツールとして、キーファイルが他ユーザーから読み取れるのは致命的な脆弱性。
攻撃シナリオ
vault initを実行.env.keyが 0o644 で作成される.env.encを復号修正案
簡易修正
writeFileに mode オプションを追加:本格修正
init()でキーファイル作成時にmode: 0o600を明示的に指定encrypt()/decrypt()でキーファイル読み取り時にパーミッションを検証fs.writeFileの mode オプションが機能しない可能性があるため、書き込み後にfs.chmod(filepath, 0o600)を追加することを推奨影響範囲
vault initで生成される全てのキーファイル