AutoJack:AutoGen Studioで3層連鎖しホスト上のコード実行に – PyPI stable版は影響なし/pre-release版に注意

この記事は約14分で読めます。

Microsoft Defender Security Research Teamは2026年6月18日、AutoGen StudioのMCP(Model Context Protocol)WebSocketに対する新しいエクスプロイトチェーン「AutoJack」を公開しました。攻撃者が用意した1枚のWebページをAIブラウジングエージェントに開かせるだけで、AutoGen Studioプロセスがホスト上で任意のコマンドを起動できる構造です。本件は研究目的の公開で実環境悪用は報告されていませんが、3つの一見妥当に見える設計判断(localhost信頼、認証スキップ、構造化パラメータの直接実行)がチェーンとして組み合わさることで、loopback(ループバック)を信頼境界とみなす前提が崩れる典型例として、AIエージェントフレームワークを運用する開発者に重要な警告を与える内容です。

AutoJackチェーンの全体像

AutoGen Studioは、Microsoft Researchが公開しているマルチエージェントフレームワーク「AutoGen」上で動作するオープンソースのプロトタイピングUIです。エージェント構築・ツール接続・MCPサーバーの実験を簡単に行える反面、デプロイメント想定ではなく研究用途の前提で設計されており、既定値は「反復しやすさ」を優先しています。AutoJackはこの設計上のショートカット3点を連鎖させることで、localhost上の制御プレーンへ未認証で到達する経路を成立させます。

連鎖位置 CWE分類 欠陥の本質
第1層 CWE-1385(Missing Origin Validation in WebSockets) MCP WebSocketがOrigin allowlist(許可リスト)としてhttp://127.0.0.1http://localhostのみを許可するが、ローカルで動作するAIブラウジングエージェント自身がlocalhostとして扱われ、エージェントが開いたページのJavaScriptはチェックを通過する
第2層 CWE-306(Missing Authentication for Critical Function) 認証ミドルウェアが/api/mcp/*パスを早期returnでスキップする実装になっており、WebSocketハンドラ側が認証を引き継ぐ前提だったが、その引き継ぎが実装されていなかった
第3層 CWE-78(Improper Neutralization of Special Elements used in an OS Command) server_paramsクエリパラメータをBase64デコード後、JSON経由でStdioServerParamsに展開し、commandargsを許可リストなしでそのままstdio_client()に渡してプロセスを起動する

3層が連鎖した結果、攻撃者が用意したWebページのJavaScriptがlocalhostのWebSocketを叩き、calc.exepowershell.exe -enc ...bash -c '...'など任意のコマンドをAutoGen Studioを実行しているOSアカウント権限で起動できる構造になります。Microsoftはこの連鎖を「carjacking the browsing agent into becoming a confused deputy」と表現しています。

第1層:Origin allowlistをエージェント自身が無効化する

MCP WebSocketは、典型的なCSWSH(Cross-Site WebSocket Hijacking)対策としてOrigin allowlistを実装していました。

allowed_origins = ["http://127.0.0.1", "http://localhost"]

この対策は、人間がevil.comのタブを開いた場合に有効です。ブラウザはOrigin: https://evil.comヘッダーを付与するため、allowlistと不一致となり接続は拒否されます。しかしAIブラウジングエージェント(MultimodalWebSurfer、fetch_webpage_tool、Playwrightベースのsurfer、requests/websockets相当のコード実行ツールなど)は、ワークステーション上のプロセスとしてヘッドレスブラウザーを抱えており、そのエージェントがロードしたあらゆるコンテンツはlocalhostとして扱われる前提を満たしてしまいます。エージェントがどのURLをナビゲートしようと、ヘッドレスブラウザーから飛ぶWebSocketのOriginヘッダはallowlistを満たしてしまうわけです。

第2層:MCPパスを認証スキップする中間ミドルウェア

AutoGen Studioは認証モードとしてnonegithubmsalfirebaseの4種類をサポートしており、すべて単一のAuthMiddlewareがFastAPIのルーティング前に動作します。ところが、影響を受けた開発版の実装では、WebSocket系パスの早期returnが含まれていました。

# auth excluded for these paths; they were intended to do their own checks
if request.url.path.startswith("/api/ws") or request.url.path.startswith("/api/mcp"):
    return await call_next(request)

「ASGIミドルウェアはWebSocketハンドシェイクを意味あるレベルでゲートできない」というのは技術的に正しい設計判断で、WebSocketハンドラ側がacceptタイミングで認証を実施する分担を意図していました。問題は、MCPルートでその引き継ぎが実装されなかった点です。Microsoft公式ブログでは、認証設定ごとの影響が次のように整理されています。

認証構成 REST APIの保護 /api/mcp/ws/*の保護
type: none なし なし
type: github あり なし
type: msal あり なし
type: firebase あり なし

config.yamlで認証を有効化しても、この穴は塞がれません。

第3層:URLパラメータがそのままコマンドラインになる

開発ブランチのMCP WebSocketルートは、server_paramsクエリパラメータをBase64デコードし、JSONとしてStdioServerParamsに展開し、stdio_client()に渡す実装でした。

@router.websocket("/ws/{session_id}")
async def mcp_websocket(websocket: WebSocket, session_id: str):
    encoded = websocket.query_params.get("server_params")
    decoded = base64.b64decode(encoded)
    params = StdioServerParams(**json.loads(decoded))
    await create_mcp_session(bridge, params, session_id)

StdioServerParams.commandStdioServerParams.argsstdio_clientに渡されてMCPサーバープロセスとして起動されますが、実行ファイルが本当にMCPプロトコルを話すバイナリかを検証する許可リストはありません。calc.exepowershell.exe -enc ...bash -c '...'のいずれも「MCPサーバー」として受理されます。最小ペイロードの例は次の通りです。

{
  "type": "StdioServerParams",
  "command": "calc.exe",
  "args": [],
  "env": { "pwned": "true" }
}

このJSONをBase64エンコードしてクエリ文字列に乗せると、攻撃URLは次の形になります。

ws://localhost:8081/api/mcp/ws/<session_id>?server_params=<base64>

PoCシナリオ:Web Content Summarizerが攻撃ベクトルになる

Microsoftが公開したエンドツーエンドのPoCは、典型的な開発者ワークフローを再現するものでした。Flask UIに包んだ「Web Content Summarizer」AutoGenエージェントを用意し、ユーザーが入力したURLをMultimodalWebSurferに「このURLを開いて内容を要約してください」とプロンプト経由で渡します。攻撃者は次のいずれかでURLを注入できます。

  • 正規のニュースサイトへの悪意あるコメント投稿
  • ユーザーが攻撃者制御URLを要約対象として提供(直接プロンプト経由、過去コンテンツへのプロンプトインジェクション経由、URL入力フィールド経由)

MultimodalWebSurferがそのURLにナビゲートすると、ページ内のJavaScriptがws://localhost:8081/api/mcp/ws/<session_id>?server_params=<base64>を開きます。第1層によりOriginチェックを通過し、第2層により認証トークンを要求されず、第3層によりペイロードがそのまま実行され、AutoGen Studioプロセスのコンテキストでcalc.exeがデスクトップに起動します。エージェントのヘッドレスChromiumから直接起動されたものではなく、AutoGen Studio本体が起動した点が重要です。

影響範囲:Microsoft公式説明とThe Hacker News追加検証の整理

影響範囲については、情報源ごとに検証対象と表現が異なるため、主体を明示して整理する必要があります。

Microsoft公式ブログの説明:影響を受けるMCP WebSocket surfaceは「PyPI release」には含まれず、PyPI経由でAutoGen Studioをインストールしたユーザーはこの特定のチェーンにさらされないと述べています。同社が実際に検証したのは現行stable版であるautogenstudio 0.4.2.2で、autogenstudio/web/routes/mcp.pyが含まれていないこと、FastAPI application側のapp.py/api/mcpルーターをマウントしていないこと、55個のPythonファイル全件を再帰検索してもStdioServerParams/api/mcpへのマッチがゼロであったことを、それぞれ確認したと公表しています。

The Hacker Newsの追加検証:同メディアはMicrosoft公式声明を引用しつつ、PyPI上には0.4.2.2のstable版とは別に、プレリリース版として0.4.3.dev10.4.3.dev2が公開されていることを取り上げました。同社は両プレリリース版を独自にダウンロードして検査した結果、MCP WebSocketルートが含まれており、ハンドラがリクエストから直接コマンドを取得し、呼び出し元を認証していないことを確認したと述べています。さらに、両プレリリース版がPyPI上から撤回(yank)されないまま公開されていることも指摘しています。

実務上の整理は次のようになります。pip install autogenstudioを実行した一般的なユーザーはstable版(0.4.2.2)を取得するため、本チェーンの影響を受けません。pipは既定でプレリリース版を取得しないため、明示的に--preオプションを指定したか、autogenstudio==0.4.3.dev1などのバージョンpinを行ったユーザーに限り、PyPI経由でも脆弱な実装を取得する可能性があります。Microsoft公式ブログは「PyPI release」に該当MCPルートがないことを示しており、The Hacker Newsはこれに対してプレリリース版を明示的に指定した場合の取得可能性を補足したという関係です。

修正:commit b047730で施された2点の強化策

Microsoftの指摘を受けて、メンテナーはMicrosoft Security Response Center(MSRC)経由でmainブランチに修正を取り込みました。最終的なコミットはb047730(PR #7362)で、mainブランチのpyproject.tomlのバージョンは0.7.2です。Microsoft公式ブログが「Fixes and hardening measures applied」セクションで明示している修正点は次の2つです。

  1. サーバーサイドのパラメータバインディング:mainブランチでは、WebSocketハンドラはserver_paramsをURLから読み取らなくなりました。別途用意されたPOST /api/mcp/ws/connectルートがパラメータをサーバーサイドでpending_session_paramsに保存し、UUIDをキーとして管理します。WebSocketハンドラはセッションIDでエントリをpopし、未知のIDはクローズコード4004で拒否します。コードコメントには「This prevents attackers from injecting arbitrary server_params via the WebSocket query string.」と明示されています。
  2. 認証スキップリストの厳格化:ミドルウェアのスキップリストから/api/mcpが除外され、/api/ws/api/makerのみが残されました。MCPルートは通常の認証パスを通過するようになります。

なお、Microsoft公式ブログは別セクションの推奨策として「MCPサーバーとして起動できる実行ファイルを許可リスト化すべき」とも述べていますが、これはb047730で実装されたものではなく、AutoGen Studio利用者および類似フレームワーク開発者向けの一般的なガイダンスとして提示されたものです。

緩和策と推奨対応

AutoGen Studioを運用している場合の推奨対応は、PyPI経由のインストールかソースビルドかで分かれます。

  • stable版のPyPIインストール(pip install autogenstudio、現行0.4.2.2):本チェーンの影響を受けません。ただし以下の「汎用ガイダンス」は引き続き適用してください
  • プレリリース版のPyPIインストール(pip install --pre autogenstudioまたはautogenstudio==0.4.3.dev1/dev2:The Hacker Newsの追加検証では脆弱な実装を取得することが確認されています。stable版に戻すか、mainブランチのb047730以降からビルドしてください
  • mainブランチからのソースビルドb047730以降のコミットを使用してください
  • 汎用ガイダンス:AutoGen Studioを、信頼できないコンテンツに触れるブラウジングエージェントまたはコード実行エージェントと同じマシンで実行しないでください。同居が必要な場合は、別コンテナまたはVMに分離し、低権限OSアカウントでAutoGen Studioを実行してください。loopbackのみにバインドし、ホストファイアウォールでポート8081のnon-loopbackトラフィックを遮断してください。可能であれば認証付きリバースプロキシの背後に配置してください。MCPサーバーとして起動できる実行ファイルの許可リスト化も、フレームワーク利用者側で検討する価値のある防御策です

AIエージェントフレームワーク全般への教訓

Microsoftはこのレポートで、AutoJackの個別バグそのものよりも「同じ形状のチェーン」がAIエージェントエコシステム全般に潜在することを強調しています。共通する3要素は次の通りです。

  1. 開発ツールが強力なローカル制御プレーンを公開している
  2. その制御プレーンがOriginまたはlocalhost-onlyの仮定で保護されている
  3. ユーザーが同じマシン上で日常的にエージェントを動かしており、そのエージェントは任意のWebコンテンツを描画できる

この三角形が成立した時点で、loopbackを安全な境界とみなす設計は通用しなくなります。同じパターンの先行事例として、Microsoft自身が5月に公開したSemantic Kernel RCE(CVE-2026-26030、CVE-2026-25592)があり、また同じくMCPベースの類似事例として5月のChatGPhish(ChatGPTのページ要約機能がフィッシングベクトルとして悪用された事例)も該当します。AutoJackは、AIエージェントフレームワークにおけるローカル制御プレーンの扱いを見直すべき事例の一つといえます。

耐久的な対応は、フレームワークの種類にかかわらず一貫しています。出力経由でモデルが触れられるツールパラメータはすべて攻撃者制御とみなす。機密性の高い制御プレーン(デバッグエンドポイント、MCP制御ソケット、コード実行エンジン、開発DBなど)はlocalhostに認証なしでバインドしない。MCPサーバーとして起動できる実行ファイルを許可リスト化する。エージェントのブラウジングアイデンティティと開発者アイデンティティを分離する(別OSユーザー、コンテナ、VM)。これらは個別フレームワークの修正とは独立して有効です。

まとめ

AutoJackは個々の欠陥が研究グレードプロトタイプの妥当なショートカットでありながら、3層が連鎖することでlocalhost信頼境界そのものを崩壊させる構造を持ちます。Microsoft公式ブログはPyPI releaseの安全性を確認していますが、The Hacker Newsはプレリリース版を明示的に指定した場合の影響を追加検証しており、実務者は自身のインストール方法を確認する必要があります。実環境悪用は本稿確認時点で公表されていませんが、AIエージェントフレームワーク全般に共通する設計上の落とし穴として、開発者は同じ形状を持つ自身の構成を点検する必要があります。一貫した対応は、制御プレーン認証、危険プリミティブの許可リスト化、エージェントと開発者のアイデンティティ分離の3点です。


参考リンク

slug: autojack-attack-autogen-studio-mcp-rce

コメント

タイトルとURLをコピーしました