マスキング
exec_with_secrets がモデルに返すもの、つまり stdout と stderr は、すべて事前にマスキングされます。注入されたシークレットが出現するたびに、そのシークレットの名前と、検出されたエンコーディングを示すプレースホルダーに置き換えられます。
Authorization: Bearer [STRIPE_KEY:REDACTED]
QXV0aG9yaXphdGlvbjogQmVhcmVyIH[STRIPE_KEY:base64:REDACTED]Ao=
パターンではなく値で照合する
keygrant は、自分が注入したすべてのシークレットの実際の値を知っています。そのため、「キーらしく見えるもの」を推測するのではなく、その値そのものを照合します。プレフィックス(sk-、ghp_、AKIA…)のブロックリストは存在しないので、プロバイダーが新しい形式を導入しても対応が後れを取ることはありません。
照合される形式は次のとおりです。
- 平文
- base64(URL セーフな base64 を含む)。すべてのバイトアラインメントで照合します。同じキーでも、直前に何があるかによってエンコード結果が変わるため、3 通りのアラインメントをすべて検査します。
- 16 進数(大文字・小文字の両方)
- URL エンコード
CLI の場合
keygrant exec は、--redact を指定した場合にのみマスキングを行います。
keygrant exec --redact STRIPE_KEY -- sh -c 'echo "$STRIPE_KEY"' # [STRIPE_KEY:REDACTED] と表示されます
keygrant exec STRIPE_KEY -- ./deploy.sh # 出力はそのままターミナルに表示されます
このフラグを指定しない場合、出力はそのままターミナルに流れます。自分で何かを実行するときは、これが望ましい動作です。エージェントが CLI を呼び出す場合は、必ず --redact を指定しなければなりません。MCP ツールは常にマスキングを行います。
限界
マスキングはあくまで補助的な安全策であり、防御の境界ではありません。境界となるのは、そもそも値がモデルのコンテキストに一切入らないという点です。
- keygrant が知らないエンコーディングは、マスキングをすり抜ける可能性があります。圧縮、暗号化、複数行に分割された値などです。
- ファイルは対象外です。 コマンドがシークレットをファイルに書き込み、エージェントが後から別のツールでそのファイルを読んだ場合、keygrant がそれを目にすることはありません。
- 派生した値は対象外です。 キーから発行されたトークンは、別の文字列です。