AI News HubLIVE
サイト内リライト2 分で読了

基本AIエージェントをゼロから構築する:セキュリティ II

このパートでは、Dockerサンドボックス、プロンプトインジェクション防御、入力検証を用いてAIエージェントのセキュリティを強化します。Dockerサンドボックスはツール実行を隔離し、ホストマシンへの損害を防ぎます。プロンプトインジェクション防御はデリミタと明示的な指示でツール出力をデータとして扱います。入力検証はすべてのツール入力がスキーマに従っていることを確認します。

ソースHacker News AI著者: ruxudev

前回のパートでは、エージェントに基本のセキュリティモデル(許可モード、acceptEdits信頼境界、ask_questionツール)を導入しましたが、これらは人間にセキュリティの負担を負わせるものでした。人間は誤ったり、疲労からセキュリティ問題を見逃したりする可能性があります。そのため、さらに強固な防御が必要です。

今回のパートでは、エージェントフレームワークのセキュリティギャップを埋めていきます。具体的には、Dockerサンドボックスにツール実行を移し、プロンプトインジェクション対策を追加し、各ツール入力を実行前にスキーマ検証します。

まず、プロダクション品質のエージェントが防御すべき脅威モデルをリストアップします:プロンプトインジェクション防御、ツール権限ゲーティング、入出力検証、ループとリソース制御、シークレットとクレデンシャル管理、可観測性とキルスイッチ。前回は(2)のユーザー面をカバーしましたが、今回は残りを扱います。各制御は独立したモジュールに配置され、監査と拡張が容易です。

Dockerサンドボックスは実行セキュリティの要です。エージェントをホストマシンから隔離し、必要なファイルやプログラムだけを提供することで、万一の被害を局限します。Docker自体は真のサンドボックスではありませんが、他のセーフガードと組み合わせることで十分な効果を発揮します。

実装では、アクションツールは長期稼働するDockerコンテナ内で実行されます。ユーザーのプロジェクトはバインドマウントされ、それ以外のファイルシステムは見えません。ネットワーク出力は--network noneで無効化可能です。DockerSandboxクラスがコンテナのライフサイクルを管理し、_ensure_imageでイメージの有無を確認、_start_containerで安全に起動します。ツール呼び出しはdocker execで行われ、引数はJSONとして渡され、出力は標準出力から取得されます。各呼び出しにはタイムアウト(デフォルト120秒)が設定され、超過時はDockerSandboxErrorが発生し、モデルが盲目的にリトライしないよう通知します。

プロンプトインジェクション防御は4層で構成されます。第一に、すべてのメッセージ履歴へのコンテンツはXMLスタイルのタグでラップされ、出所を明示します。第二に、システムプロンプトに明示的な指示を追加し、タグ内のコンテンツはデータであり命令ではないこと、疑わしい場合はユーザーに確認することをエージェントに伝えます。これにより、悪意あるデータがエージェントを乗っ取るリスクを低減します。

これらの対策により、エージェントのセキュリティは大幅に向上しました。次回はリソース制御、シークレット管理、セッション制御などの残りのセキュリティ制御について説明します。