Anoymask

RufRoot (CVE-2026-59726): 認証なしのMCPブリッジによるAIエージェント基盤の完全侵害

1. 基本情報

2. エグゼクティブサマリー

すべてのインターフェースにデフォルトで公開されるRufloのMCP Bridgeに対し、認証なしの単一POSTリクエストでコンテナ内でのコマンド実行が可能になります。これにより攻撃者はLLM APIキー、会話履歴、メモリ、エージェントスウォームを窃取・改ざん・永続化できます。

3. 攻撃フロー

  1. 攻撃者がTCP/3001上のRuflo MCP Bridgeに到達する。
  2. 攻撃者が認証なしでtools/listを使って233のツールを列挙する。
  3. 攻撃者がJSON-RPCのtools/call/mcpへ送信し、ruflo__terminal_executeでコマンドを実行する。
  4. 攻撃者がprintenvなどのコマンドでLLMプロバイダーAPIキーを窃取する。
  5. 攻撃者が被害者のキーおよびコンピュートリソースを使って攻撃者制御のスウォームとエージェントを作成する。
  6. 攻撃者がAgentDBに悪意あるパターンを保存し、今後の出力メモリを汚染する。
  7. 攻撃者が認証なしのMongoDBから会話履歴とメタデータをダンプし外部へ送信する。
  8. 攻撃者が/app/beacon.jsを作成しindex.jsにロードを注入、PID 1終了後のDocker再起動で永続化を実現する。
  9. 攻撃者がシェル履歴をクリアする。

4. 攻撃者の位置と実行場所

攻撃者は任意のネットワーク到達可能な場所からHTTP POSTリクエストを送信します。コマンドはDockerコンテナ内のnodeユーザー(UID 1000)として実行され、内部Dockerネットワーク、MongoDB、環境変数、エージェントAPIに到達します。

5. 被害者および管理者からの可視性

  • ユーザーアクションやプロンプトは不要。
  • 活動は通常のMCPツールコールと同様のHTTPリクエストに見える。
  • 新しいスウォーム、エージェント、メモリパターン、会話アクセスが管理ダッシュボードに表示される可能性がある。
  • ホストレベルのEDRだけではnodeユーザーの活動、一時的なMongoDBクライアント利用、コンテナ内のファイル変更を見逃す可能性がある。

6. 成功・失敗の条件

成功条件

  • 脆弱なバージョンのRufloを使用し、攻撃者がTCP/3001に到達可能。
  • /mcpに認証、IP制限、リバースプロキシ保護が欠如している。
  • デフォルトの共有環境変数、認証なしMongoDB、再起動ポリシーが残っている。

失敗条件

  • パッチ適用版へ更新する。
  • Bridgeをlocalhostまたは管理ネットワークに制限し、認証とネットワークポリシーを追加する。
  • コンテナを機密環境変数、内部データベース、アウトバウンド通信から分離する。

7. 攻撃成功時の影響

攻撃によりLLM予算およびAPI権限の不正利用、会話履歴と機密データの窃取、AIメモリの長期汚染、攻撃者制御エージェントの作成、コンテナ永続化が発生します。エージェントが内部データベース、ソースコード、クラウド権限にアクセスできる場合、影響はRufloを超えて拡大します。

8. 観測可能なログ

  • メール: 通常なし。
  • Proxy/SWG/DNS: Rufloからの不明OAST/外部宛先、LLM APIトラフィックの急増、パッケージダウンロード。
  • Endpoint/EDR: node子プロセス、printenv、MongoDBクライアント、/tmp/app/beacon.jsindex.jsの変更、PID 1終了。
  • Identity/IdP: LLM APIキーの異常利用。人間IDログではこの活動が表示されない可能性がある。
  • SaaS/Cloud: 新規スウォーム/エージェント、異常ツールコール、AgentDB書き込み、EC2/コンテナ監査。
  • Network: TCP/3001への外部リクエスト、/mcptools/listterminal_execute、コンテナからのOASTおよびデータ漏洩。

9. 攻撃成功判定

  • 接触のみ: ポート3001スキャン、tools/list
  • ユーザーアクション: 不要。
  • 初期実行: terminal_execute応答、OASTコールバック。
  • マルウェアまたは認証成功: APIキー取得と不正利用、攻撃者エージェント作成。
  • データ窃取 / セッション侵害: MongoDB会話ダンプと外部送信。
  • 後続侵害確認: メモリ汚染、ビーコン永続化、Ruflo外のクラウドまたは内部リソースへのアクセス。

10. 調査プレイブック

  • トリガー: ポート3001への外部アクセス、認証なし/mcpterminal_execute、不明エージェント作成。
  • 初期確認: バージョン、露出範囲、アクセスログ、コンテナID、キー位置を確認。
  • エンドポイント: コンテナファイルシステム差分、プロセス、/appおよび/tmp、再起動履歴、Dockerイベントを保存。
  • 認証 / クラウド: 全LLM/APIキーの利用履歴、クラウド監査ログ、シークレット管理システムを確認。
  • 後続活動: AgentDB、MongoDB、会話履歴、生成エージェント、外部通信、アクセス可能な内部リソースを調査。
  • 封じ込め: ポート3001をブロック、コンテナを分離・再構築、全キーを無効化、データベース認証情報を追加、メモリとコードを既知の正常状態に復元。
  • 状態分類: 露出 / 列挙済み / RCE / シークレット窃取 / エージェントまたはメモリ侵害 / データ漏洩 / 下流侵害。

11. 防御・検知アイデア

  • 単一イベント: 外部からのPOST /mcpterminal_executeprintenvagentdb_pattern-store、新規ビーコン。
  • タイムライン相関: tools/list → シェル実行 → 環境変数列挙 → エージェント作成 → データベースダンプ → ファイル変更 → 再起動。
  • ハンティング: ポート3001が公開または内部公開されているRufloインスタンス、シャドーAI資産、異常なLLMキー利用を検索。
  • ログギャップ: MCPツール監査、コンテナプロセスログ、AgentDB変更履歴がない場合、改ざん範囲を特定できない。
  • 優先アクション: ソフトウェア更新、公開アクセスの制限、認証の実装、シークレットの分離、出力トラフィック制御、コンテナ最小権限の適用、AI運用ログのSIEM統合。

12. 事実 / 推論 / 仮説

事実

  • Noma LabsはデフォルトAWS EC2構成で8段階PoCを検証。
  • /mcpは認証なしで233ツールを公開し、ブロックリスト回避でシェル実行を許可。
  • UID 1000であってもAPIキー、会話、データベース、メモリ、永続化メカニズムに到達可能。

推論

  • これはAIコントロールプレーンにおける認証なしRCEであり、LLMプロンプトインジェクションではない。
  • エージェント基盤の権限が広いほど、下流への影響は大きい。

仮説

  • 全MCPコールにプリンシパル認証とポリシー決定ログを必須とすることで、同様の脆弱性の影響を大幅に低減可能。

13. MITRE ATT&CKマッピング

  • 高確度: T1190 公開アプリケーションの悪用、T1059 コマンドおよびスクリプトインタープリター、T1552.001 ファイル/環境からの認証情報、T1005 ローカルシステムからのデータ、T1505 サーバーソフトウェアコンポーネント、T1070 インジケーター削除。
  • 中確度: T1098 アカウント操作(エージェント作成をID操作とみなす場合)、T1556 認証プロセス改ざん、T1041 C2経由の漏洩。

14. 不明点と追加調査

  • パッチ適用版および現在のデプロイ数。
  • Bridgeアクセスログのデフォルト保持期間。
  • 野外での既知のアクティブ悪用状況。
  • コンテナエスケープの可能性。
  • 窃取キーに関連する組織固有権限。

15. SOCおよび一般組織への影響

開発者が独立して展開するシャドーAIは資産インベントリを回避し、APIキーや内部ネットワークにアクセスできることが多い。SOCはAI製品名だけでなく、MCP Bridgeリスニングポート、ツール監査、エージェントID、メモリ変更を新たな監視対象として扱う必要がある。

16. 役割別サマリー

  • SOCチーム向け: ポート3001露出、MCPツール列挙、シェル実行、キー利用、エージェント/メモリ改ざんの連鎖を検知。
  • 管理者向け: Rufloを更新・非公開化、全APIキーをローテーション、コンテナを再構築。
  • ユーザー向け: AIエージェント基盤を適切な認可なしに内部・外部ネットワークに公開しない。