HN 日本語サマリー

← 一覧へ戻る
セキュリティ

MCPサーバーにおけるANSIエスケープシーケンスインジェクション:人間には見えず、AIには見える

ANSI escape injection in MCP servers: Hidden from humans, visible to AI (brightsec.com)

39 pointsby xgpyc2qp20 コメント

要約

本記事では、AIエージェントが処理するデータにANSIエスケープシーケンスを注入する脆弱性について解説しています。これらのシーケンスは端末では制御コードとして機能し、人間には表示されませんが、AIは生のテキストとして認識するため、攻撃者は人間には見えない指示をAIに実行させることが可能です。DAST(動的アプリケーションセキュリティテスト)ツールを用いることで、この種の攻撃を自動的に検出する方法についても詳述しています。

全文翻訳

MCPサーバーにおけるANSIエスケープシーケンスインジェクションの検出 ANSIエスケープシーケンスは、言語モデルのためではなく、端末のために設計されました。これらは、端末に色を変更したり、テキストを非表示にしたり、画面をクリアしたり、カーソルを移動させたりするように指示する不可視の制御コードです。レンダリングされた端末を読んでいる人間は、コードそのものを見ることはなく、その効果だけを見ます。同じコンテンツを読んでいる言語モデルは、すべてのバイトを見ます。 そのギャップが攻撃全体です。攻撃者がAIエージェントが消費するテキストにANSIエスケープシーケンスを密かに送り込むことができれば、モデルにとっては完全に読み取り可能でありながら、出力レビュー中の人間から指示を隠すことができます。これは、実際の製品で見られるのと同じクラスの出力中立化の失敗です。Kubernetesの`kubectl`(CVE-2021-25743)は、イベント文字列に端末出力を偽装する可能性のある制御シーケンスを受け入れ、Git(CVE-2024-52005)は端末制御を中立化せずにリモートサイドバンドメッセージを表示しました。モデルコンテキストプロトコル(MCP)では、サーバーがツール、リソース、プロンプトを公開し、テキストをエージェントに直接ストリーミングしますが、モデルが読み取るすべてのフィールドが潜在的なインジェクションサーフェスとなります。 DASTは、このクラスの欠陥を検出する自然な方法です。Brightスキャナーは、実行中のターゲットを外部から実行し、細工された入力を送信し、脆弱性の証拠を実際の応答で検査します。ソースコードへのアクセスは不要です。このブラックボックス、ランタイムの姿勢は、ANSIエスケープシーケンスインジェクション(AESI)が要求するものとまさに一致します。なぜなら、ペイロードが生き残るかどうかは、ライブサーバーがそれをどのように処理し、中継するかに完全に依存するからです。この記事では、攻撃の2つのバリアント、ダイレクトフェッチAESIとストア済みAESI、それらが危険にさらすもの、そして最も重要なこととして、DASTスキャナーがそれらを自動的に検出する方法について説明します。 ANSIエスケープシーケンスとは ANSIエスケープシーケンスは1970年代にさかのぼります。当時、さまざまなベンダーのハードウェア端末はそれぞれ独自の互換性のない制御方言を持っていました。ANSI X3.64標準はそれらを統合しました。プログラムは、カーソルを移動したり、画面をクリアしたり、色を設定したりするために、合意された一連のコードを発行でき、準拠する端末はすべてそれに従います。これらは、テキスト端末をポータブルな方法で制御可能にするために発明されました。そして、その同じ制御機能が、今日攻撃が悪用しているものです。 ANSIエスケープシーケンスは、エスケープバイト(ESC、16進数0x1B)で始まり、端末が印刷可能なテキストではなくコマンドとして扱う制御コードが続きます。ここで重要なのは2つのカテゴリです。テキストを目立たなくする隠蔽コードと、ディスプレイをクリアしたり、カーソルを移動させたり、行を消去して正規に見える出力を消去または上書きしたりする画面およびカーソルコードです。 重要な洞察:レンダリングはこれらのバイトを人間から隠しますが、モデルは生のテキストを処理します。人間にとっては空行や整然としたレポートに見えるものが、エージェントにとっては完全な指示セットを運ぶことができます。 攻撃1:ダイレクトフェッチAESI 多くのMCPサーバーは、URLを取得してそのコンテンツをモデルに返すツール(「このページを要約する」または「このドキュメントを読む」機能)を公開しています。攻撃は次のように機能します。 攻撃者は、ANSIエスケープシーケンスと隠された指示が混在するコンテンツを、自分が制御するURLでホストします。 そのURLが、フェッチスタイルのツールに引数として渡されます。 サーバーはコンテンツを取得し、モデルが消費できるフィールド(エージェントが実際に取り込む応答場所)に中継します。 モデルは隠された指示を読み取り、それに基づいて行動します。 保持すべき概念は、モデルが消費できるフィールドです。MCP応答のすべての部分がモデルに到達するわけではありません。重要なのは、エージェントがコンテンツとして扱う特定のフィールドです。 ツール結果 — result.content[].text内のテキスト リソース読み取り — result.contents[].text内のテキスト プロンプトテンプレート — result.messages[].content.text内のテキスト 他の場所に現れるペイロードは悪用可能ではありません。これは、クロスプロンプトインジェクションの一形態です。悪意のある指示は、ユーザー自身のプロンプトではなく、エージェントが処理するように要求されたデータに乗って現れます。 攻撃2:ストア済みAESI ストア済みAESIは、より危険な配信メカニズムを持つ同じペイロードです。サーバーがライブURLを取得する代わりに、攻撃者は1つのエントリポイント(メモ、コメント、レコード)を通じてストレージにペイロードを書き込み、別のエントリポイントがそのデータをモデルフィールドに読み戻すときに後で爆発します。 ストアバリアントをダイレクトフェッチよりも悪質にする3つの特性があります。 永続性。ペイロードはストレージに残り、将来のセッションで、潜在的には他のユーザーに対しても再度発火します。 分離。書き込みと読み取りは異なるエントリポイントであり、異なるプロトコルを使用することさえあります。通常のHTTPエンドポイントを通じて書き込まれたペイロードは、エージェントがMCPツールまたはリソースを通じて同じレコードを読み戻したときに再び現れる可能性があります。 遅延公開。書き込み時には何も問題がないように見えます。インジェクションは、後で無関係な読み取りがストアされたテキストをモデルのコンテキストに引き込むまでアクティブになりません。 決定的に、これらの書き込み後読み取りパスを、パラメータ名、ツール説明、またはプロトコルタイプから推測することはできません。書き込まれたデータがどこで再び現れるかを知る唯一の信頼できる方法は、経験的にプローブすることです。これは、自動検出がまさに行うことです。 セキュリティへの影響 不正なエージェントアクション。隠された指示は、モデルにツールを呼び出させたり、データを開示させたり、分析を変更させたり、エージェントの既存の権限内で攻撃者が制御した出力を生成させたりする可能性があります。 人間参加型ループのバイパス。ANSIの隠蔽は、エージェントを監督または承認しているユーザーから攻撃者の指示を隠すことができます。表示される応答は無害に見えますが、モデルは生のペイロードを受け取り、それに従う可能性があります。 ログと監査証跡の改ざん。画面クリア、カーソル移動、行消去シーケンスは、端末またはログビューアの出力を偽装し、レビューおよびインシデント対応中のアクティビティを不明瞭にすることができます。 永続的なインジェクションリスク。ストア済みAESIでは、ペイロードはアプリケーションデータに残り、後続のMCPツール、リソース、またはプロンプトを通じて再出現する可能性があります。1回の書き込みが将来のセッション、他のユーザー、およびクロスプロトコル読み取りパスに影響を与える可能性があります。 実際には、共有ナレッジベースの1つの汚染されたレコードが、それを読み取るすべての後続のエージェントワークフローに影響を与える可能性があります。リスクは、誤解を招く要約だけではありません。それは、ツール、認証情報、および下流システムへのアクセス権を持つエージェントに到達する攻撃者が制御したデータです。 DASTによる検出の自動化 この作業の中心は、攻撃を再現可能で自動化されたテストにすることです。検出はいくつかの設計原則に基づいて構築され、その後、ダイレクトフェッチ用とストア済み用の2つのパイプラインに適用されます。 設計原則 生のバイトを検査する。ANSIエスケープバイトは信号であるため、検査前のレンダリング、サニタイズ、または正規化はそれを破壊します。検出は生のHTTP/MCP応答バイトを読み取ります。 モデルが消費できるフィールドのみをカウントする(シンク)。分類子は、モデルが実際に取り込むJSONパス(ツールコンテンツ、リソースコンテンツ、プロンプトメッセージテキスト)をウォークし、それ以外のすべてを無視します。 一意のトリガーマーカー。各ペイロードには独自のありそうもないマーカーが含まれているため、一致は効果を正確に1つのインジェクションに結び付けます。これはブラックボックス確認が依存するメカニズムです。 3つの信号による確認。フィールドは、ANSIエスケープバイト、固定指示フレーズ、およびペイロードのトリガーがすべて同じモデルが消費できるフィールドで一緒に生き残った場合にのみ脆弱です。すべてを要求することが、偽陽性を抑制します。 エンコードされた値に再帰する。分類子は、JSONエンコードされたフィールド内にラップされたペイロードがまだキャッチされるように、文字列化されたJSONを下降します。 したがって、検出はバイナリです。3つの信号ルールが成り立つか、そうでないかのどちらかです。これにより、チェックは自動化するのに十分低ノイズになります。 ペイロードコーパス インジェクションは、ホストされたペイロードファイルの小さなコーパスから駆動され、それぞれが異なるANSIテクニック(隠蔽、背景に合わせた前景、画面クリア、カーソル消去、およびHTMLラップバリアント)を独自のトリガーで実行します。サーバーが1つのテクニックを削除しても、別のテクニックを中継する可能性があるため、多様性が重要です。 ダイレクトフェッチデ