AI エージェントのツール引数に安全設定の切り替えを入れない(Strands environment ツールの例)
AWS の Strands-Agents-Tools の environment ツールは、秘密を伏せる masked 引数が入力スキーマにあったため、プロンプトインジェクションで LLM にマスキングを切らせて環境変数の秘密を平文で読ませられた(CVE-2026-115415、0.8.6 で修正)。マスキングや確認の有無のような安全設定は、LLM が値を決められる引数に置かない。
何が問題だったか
- environment ツールは、名前に
KEY、TOKEN、SECRET、PASSWORDなどを含む変数の値を既定で伏せる。 - しかし
maskedが入力スキーマにあり、LLM がfalseを指定できた。さらに一覧と取得は、設定や削除と違って運用者の確認なしに動いた。 - エージェントが読む Web ページ、ファイル、先に実行したツールの出力に指示を仕込めば、マスキングなしの一覧取得をさせ、読み込み済みの別ツール経由で攻撃者に渡せる。AWS のアクセスキー、モデル提供元の API キー、ソース管理のトークン、DB 接続文字列などが対象になりうる。
- 影響版は 0.1.0 以上 0.8.6 未満。0.8.6 でマスキングの制御は運用者だけに限られ、ツール自体も非推奨になった。
対応
strands-agents-toolsを 0.8.6 以降に更新する。フォークや派生コードにも修正を取り込む。- すぐ更新できない場合は、エージェントから environment ツールを外す。
- このツールを読み込んでいたエージェントの環境にあった認証情報はローテーションする。
- 長期間有効なクラウド認証情報や API キーをプロセスの環境変数に置かない。実行ホストの外向き通信は信頼できる宛先に絞る。
自作ツールを設計するときの原則
- 安全に関わるパラメーター(マスキング、確認の要否、対象範囲の上限、サンドボックスの有無)は、ツールの入力スキーマに出さない。 運用者の設定やコードで固定する。
- 読み取り系だからといって確認なしにしない。秘密を返しうる読み取りは書き込みと同じ扱いで、承認か出力側のマスクを強制する。
- 伏せる処理は LLM に返す直前の出力側で行い、引数で解除できないようにする。
- ツールの組み合わせ(秘密を読むツール+外へ送れるツール)を同じエージェントに持たせない。関連は 単体では安全なスキル同士の「組み合わせ」で情報が漏れる(KnotScryer の調査から)、.env を AI コーディングエージェントに読ませない(hooks・deny ルール)。