深いネイビーの背景に生成された抽象イラスト。幅広のスレート色の橋構造がフレーム全体に広がり、その左面にある一つの長方形のポートが開いて琥珀色に光っている。その開口部を通って、小さく同一のブロックの流れが外へと注ぎ出し、かすかな設計図グリッドを横切り、前景に描かれた細い点線のシアンの境界線を止められることなく越えていく。右下では、ブロックが接続されたノードの低く半透明な格子に入り込み、それはメモリストアを思わせる。テキスト、文字、数字、人物、ブランドマーク、組織のロゴは一切表示されない。OrcaRouterのロゴは、アートワーク下の白い帯の右下隅に合成されている。
AI Safety Incidents

RufRoot:RufloのMCPブリッジへの認証なしのリクエスト1件で、コマンドが実行され、鍵が窃取され、AIメモリが汚染された

著者

Rowan Sterling

公開日

最新モデル · 20すべてのモデルを見る →
ベンチマーク:Artificial Analysis · 毎日更新
すべての記事に戻る

2026年6月30日、Noma LabsはRufloのメンテナーに、プロジェクト自体に対する実際に動作するエクスプロイトを渡した。Noma Securityの研究部門は、Ruflo — かつてClaude Flowとしてリリースされたオープンソースのエージェント・オーケストレーション・プラットフォーム — が、デフォルトのDocker ComposeデプロイでModel Context Protocolブリッジを3001番ポートにすべてのネットワークインターフェース上でバインドし、認証を一切要求していなかったことを発見していた。/mcpエンドポイントへの1回のHTTPリクエストだけで、コンテナ内でnodeユーザーとしてシェルコマンドを実行でき、そのシェルから攻撃者は、環境内のすべてのLLMプロバイダーAPIキーを読み取り、保存されているすべての会話をダンプし、被害者のキーに課金されるエージェント群を起動し、そしてAgentDB学習ストアに、そのインスタンスのすべてのユーザーに対してAIの回答を操り続ける命令を書き込むことができた。この欠陥はCVE-2026-59726で、RufRootと名付けられ、CVSS 10.0と評価され、3.16.3で24時間以内に修正された。我々が読んだどの情報源も、それが実際に悪用されたとは報告していない。この欠陥に関するアーカイブ自体の記録は、その情報源リストと信頼度評価とともに、AIインシデントアーカイブにあり、その周辺に記録された他のMCPおよびインフラストラクチャの項目の隣に位置している。

扉を開いたデフォルト

Noma Labsがエージェント・メタハーネスと呼ぶRufloは、最大100エージェントのスウォーム向けのセルフホスト型レイヤーで、Claude CodeとOpenAI Codex向けに構築され、長期メモリとツール呼び出し用の組み込みMCPサーバーを備えています。通常のセットアップはNomaが説明するもので、リポジトリをクローンし、LLM APIキーを追加し、docker compose up -dを実行するというものです。プロジェクトのデフォルトcomposeファイルは、ブリッジを0.0.0.0のポート3001にバインドし、同梱のMongoDBを27017のすべてのインターフェースにバインドし、Mongo認証は無効でした。その影響範囲は、展開環境周辺のファイアウォール、セキュリティグループ、ネットワークセグメンテーションに依存します。Noma自身の表現では、ネットワークから到達可能なインスタンスは認証なしで完全に悪用可能でした。

MCPブリッジは、HTTP経由で到着するJSON-RPCリクエストをRufloの内部ツールライブラリに対する呼び出しに変換するExpress.jsサーバーです。脆弱な行では、そのライブラリには233個のツールが含まれ、シェルアクセス、データベース操作、エージェント管理、メモリ保存をカバーしていました。Nomaの記事は、それが何を意味するかについて率直に述べています。「MCPブリッジは無作為な補助的デバッグインターフェースではありません。むしろ、Rufloの中枢神経系です。すべてのツール呼び出し、すべてのエージェントアクション、すべてのメモリ操作はMCPブリッジを通ります。」

認証レイヤーは単に弱いのではなく、存在していなかった。POST /mcp と POST /mcp/:group は MCP JSON-RPC プロトコルを実装し、受信した tools/call リクエストを内部の executeTool() 関数へ直接渡す。Ruflo はコマンドブロックリスト AUTOPILOT_BLOCKED_PATTERNS を確かに維持していた。これは危険なシェル操作を止めるためのものだったが、GitHub のアドバイザリは「autopilot フローでのみ有効化されていた。POST /mcp と POST /mcp/:group はそれをバイパスした」と明言している。したがって、ruflo__terminal_execute を名指しした認証なしの 1 回の呼び出しによって、トークン、セッション、事前のやり取りを必要とせず、コンテナの node ユーザー(アドバイザリでは uid 1000 と記載)として任意のコマンドが実行された。次に起きたことには権限昇格は不要だった。認証情報、エージェント API、メモリ ストア、データベースはいずれもそのシェルから到達可能だった。

8つのステップで見る連鎖

Noma Labsは8段階の概念実証を公開し、AWS EC2上のデフォルトのRufloデプロイメントに対して各段階をライブで確認した。実行と外部送信を検証するために、Burp Collaboratorへの帯域外コールバックを使用した。これらの段階は、理論上の脆弱性に積み重ねられた推測的な結果ではなく、実証された一連の手順であり、アドバイザリの修復セクションは、すでにその中にいる可能性のある運用担当者向けに書かれている。

A hand-built HTML card headed 'The RufRoot chain, step by step', kicker 'RufRoot - CVE-2026-59726', subtitle 'Eight steps Noma Labs confirmed live against a default Ruflo deployment on AWS EC2'. Eight rows, each with a circled step number, the action, and what it yielded. 1, call tools/list: enumerate the 233 exposed tools. 2, call ruflo__terminal_execute over POST /mcp: shell inside the bridge container as node, uid 1000, verified by an out-of-band callback. 3, run printenv: every LLM provider API key in the container environment. 4, call ruflo__swarm_init and ruflo__agent_spawn: attacker-controlled agent swarms running on the victim's keys and compute. 5, call ruflo__agentdb_pattern-store: a fabricated SOC2 policy in the learning store, steering future output for all users. 6, query MongoDB on port 27017: every stored conversation, title and metadata. 7, write /app/beacon.js and inject it into index.js, then kill PID 1: a backdoor that survives the container restart policy. 8, clear shell history: no forensic trace. A footer cites Noma Labs and CVE-2026-59726, and marks step 5 as the step a patched redeploy does not undo.

偵察が最初に来るのは、ツール一覧がどの呼び出し元にも公開されているためです:tools/listは資格情報なしで233件のエントリすべてを返します。コマンド実行も同じエンドポイントから続き、Nomaの概念実証はレスポンスボディからの推測ではなく、帯域外コールバックでそれを確認しました。環境のステップこそが、ホストの侵害を請求とデータ損失の問題に変えるものです。composeファイルはプロバイダーのキーをコンテナに渡し、バックエンドプロセスは完全な環境を次のものを介して継承しました:{ ...process.env }、したがって1回のprintenvでそれらがダンプされました。その後、これらのキーによりruflo__swarm_initとruflo__agent_spawnが攻撃者制御のスワームを起動できるようになり、被害者のクォータとコンピュートを消費しました。

ステップ5は、侵入後も存続するものです。ruflo__agentdb_pattern-storeを使用して、Nomaは、その後に生成するすべてのデプロイスクリプトに攻撃者が制御するURLを埋め込むようAIに指示する、捏造されたSOC2コンプライアンスポリシーを仕込みました。AgentDBは、まさにこの種のパターンを永続化して、セッションをまたいでエージェントの動作が改善されるようにするために存在するため、注入されたエントリは、システムが設計どおりに動作するのと同じように振る舞いました。「将来の会話では攻撃者の影響を受けた出力が生成され、ユーザーにはそれを見抜く方法がありません」とNomaの報告書は述べています。この脆弱性を7月29日に報じたDark Readingは、この違いについて外部の専門家に意見を求めました。Viakooの副社長John Gallagherは、これを別種の問題だと呼びました。「これはソフトウェアの欠陥を悪用するものではなく、メモリポイズニングです」と。

残りの手順は典型的なポストエクスプロイテーションで、異例なほど容易に実行された。内部Dockerネットワーク上のMongoDBには認証がなかったため、攻撃者はクライアントを/tmpにインストールし、会話をダンプして外部へ送った。永続化は/app/beacon.jsを書き込み、require('./beacon.js')の行をindex.jsに追加し、PID 1を終了させることによって実現した。その後、Dockerの再起動ポリシーによってコンテナがビーコンを有効にした状態で復帰した。最後の手順はシェル履歴の消去だった。これらはすべて単一の未認証リクエストから続いたもので、デフォルトのデプロイメントではどの時点でもこの連鎖を止められなかった。

修正と、パッチが届かない領域

メンテナーはRuflo 3.16.3を6月30日の開示から24時間以内にリリースし、GitHubはGHSA-c4hm-4h84-2cf3のアドバイザリを2026年7月1日に公開しました。リポジトリでADR-166として追跡され、プルリクエスト2521でマージされたこの修正は、単にチェックを追加するのではなくデフォルトを変更します:

• MCPブリッジは127.0.0.1にバインドします。公開バインドにはMCP_AUTH_TOKENが必要で、トークンが存在しない場合、プロセスは起動時に致命的なメッセージを出力して終了します。

定時間比較を備えたBearerトークンミドルウェアが、ブリッジの手前に配置されています。

• terminal_executeはサーバー側でMCP_ENABLE_TERMINAL=trueの背後で制限されており、デフォルトでは無効で、その制限は/mcp、/mcp/:groupおよびオートパイロットフローでも同一に適用される — 開示されたチェーンがシェルに到達できるようにしていた、欠けていた環である。

• MongoDB では認証が必要で、コンテナを起動するには root パスワードが必要です。

• ブリッジコンテナは、tmpfs を併用した読み取り専用のルートファイルシステムで動作し、CORS 許可リストがワイルドカードに取って代わり、CI 回帰ロックが静的構成と実行時動作をカバーします。

そうした措置のいずれも、すでにAgentDBに書き込まれたエントリを削除しない。この勧告は、露出しているあらゆるインスタンスの運用者に対し、ポート3001と27017を直ちにファイアウォールで遮断し、プロバイダーキーをローテーションし、パターンストアを監査して、注入されたagentdb_pattern-storeエントリがないか確認して削除し、MongoDBの改ざんを監査し、クリーンなイメージからコンテナを再構築するよう指示している。その警告は異例なほど直接的なものだ。「パッチを適用した再デプロイだけでは、ポイズニングを元に戻すことは決してない」。Nomaの記事も同じ結論を導いている——パターンストアの監査は修復措置の一部であり、パッチはそうではない。

理由は不注意ではなく構造的なものだ。将来のモデル出力を形作るパターンストアには、正当に学習された指示と攻撃者が仕込んだ指示を区別する方法がない。どちらもパターンとして届き、システムはそれらを信頼するよう構築されている。このことは、ネットワーク上の脆弱性を、未知のバックログを抱えたデータ整合性の問題へと変える。そして運用者にとっての問題は、ポートに到達可能だったかどうかだけでなく、メモリが今何を保持しているかでもある。

A hand-built HTML timeline card headed 'From disclosure to coverage', kicker 'RufRoot - disclosure timeline', subtitle 'Five dates, from the private report to the day the record was filed'. Six dated rows. 30 June 2026: Noma Labs discloses the flaw to Ruflo's maintainer with a working proof of concept. 1 July 2026: Ruflo 3.16.3 ships and GHSA-c4hm-4h84-2cf3 is published with CVSS 10.0. 9 July 2026: the CVE record for CVE-2026-59726 is published in the National Vulnerability Database, later marked Deferred. 29 July 2026: The Hacker News and Dark Reading report the flaw; Noma Labs publishes its research. 30 July 2026: SecurityWeek reports it, and the record is dated to this day. A separate amber note reads: no source we read reports exploitation in the wild at any point on this timeline. A footer cites The Hacker News, the GitHub advisory API, the NVD record and SecurityWeek.

何が確立されており、何が確立されていないのか

ここでの技術的記録は一次情報であり、一貫している。アドバイザリには、影響を受けるパッケージ(npm ruflo3.16.3未満)、修正版、正確なエンドポイント、コンテナユーザー、および2つのポートが示されている。メンテナーのリリースノートは同じ連鎖を説明しており、Nomaの解説記事は実証コード(PoC)の詳細を提供している。また、独立系メディア—The Hacker NewsとDark Readingは2026年7月29日、SecurityWeekは7月30日—は、矛盾する具体的事項を追加することなく同じメカニズムを報じている。Cloud Security Allianceの2026年8月5日付の調査ノートは一連の経緯を再記述し、同組織が以前に追跡していた未認証のMCPおよびエージェント・オーケストレーションの脆弱性と並べて位置づけている。アーカイブはこの記録を信頼度A、異論なしと評価し、画期的な記録としてマークしている。記録に対する重大度評価は高く、CVSSスコア自体とは区別される。

採点に関する詳細のうち一点は、正確に述べておく価値がある。二つの一次資料の記述が食い違っているためだ。GHSA-c4hm-4h84-2cf3 はCVSS 10.0を、ベクトルAV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H上で示している。最大値まで押し上げているのは、このスコープ変更である。同じ勧告の 3.16.3 リリースページ上のコピーは、このスコアを「CVSS 9.8 critical」と表現している。2026年10月30日に確認した National Vulnerability Database のレコードは、2026年7月9日に公開され、Deferredと記されているが、GitHub の 10.0 を二次的指標として掲載しており、NVD 自身が作成したスコアは持っていない。9.8 という記述についての説明は見つからず、本記事でもそれを解明してはいない。

導入実績を示す数字はさらに乏しい。Noma Labsは当時、このプロジェクトについて、GitHubのスター数が67,000超、ダウンロード数が約1,000万、アクティブユーザーが約100万人だと説明していた。Cloud Security Allianceが要約したところによると、The Hacker Newsは66,500超のスター数を挙げた。ダウンロード数とユーザー数はNoma自身によるもので、独立した検証は受けていない。2026年10月30日時点のリポジトリのスター数は80,198だった。これはプロジェクトの到達範囲を確認するものであり、露出の指標ではない。また、実際にネットワークから到達可能だったデプロイが何件あったかを公表した情報源はない。

A hand-built HTML card headed 'Established, and not', kicker 'RufRoot - evidence', subtitle 'What the advisory, the release notes and the research support, against what nobody has shown'. Two columns. The left column, headed 'Established', lists: CVE-2026-59726 affects npm ruflo below 3.16.3 and is patched in 3.16.3; the default compose file bound the MCP bridge to 0.0.0.0 on port 3001 and MongoDB to 27017 without authentication; POST /mcp and POST /mcp/:group reached 233 tools and terminal_execute with no credential, running as node, uid 1000; Noma Labs confirmed an eight-step chain live on AWS EC2 with out-of-band callbacks, including an AgentDB pattern injection; the advisory was published 1 July 2026 with CVSS 10.0 and the fix shipped within 24 hours of the 30 June disclosure; the archive record is confidence A, undisputed, no real harm recorded, GLOBAL, MCP and INFRA. The right column, headed 'Not established', lists: that anyone exploited the flaw in the wild; how many Ruflo deployments were actually network-reachable; that any instance's AgentDB was poisoned, since no audit results are published; whether 9.8 in the release notes or 10.0 in the advisory is the intended score; Noma's counts of 10M downloads and 1M active users, which no independent source confirms; that any operator received notice beyond the public advisory. A footer cites GHSA-c4hm-4h84-2cf3, the Ruflo 3.16.3 release notes, Noma Labs and SecurityWeek.

確立されていない部分こそ、最も誇張されやすい部分だ。Nomaも、メンテナーも、私たちが読んだどの媒体も、この脆弱性が現実環境で悪用されたとは主張しておらず、アーカイブにはこの項目について実際の被害は記録されていない。NomaのPoCは、研究者がEC2上で管理していたデプロイに対して実行されたもので、デフォルトのインストールが何を許容するかを示すが、特定の本番インスタンスが何を被ったかを示すものではない。インターネットに公開されたRufloデプロイの数は公表されておらず、AgentDB監査の結果を公表した運用者もいない。したがって、影響を受ける母集団と、存在する汚染されたメモリの量はどちらも不明である。Cloud Security Allianceによる、露出したデプロイを完全侵害として扱うべきだという助言は、操作不要の悪用によって正当化されるリスク姿勢であり、侵害が発生した証拠ではない。

なぜアーカイブがそれを画期的なものと位置づけるのか

アーカイブの特筆すべきフラグは、単なる最大スコアより具体的な根拠に基づいている。人気のセルフホスト型サービスにおけるCVSS 10.0のリモートコード実行バグはよくある類型であり、ここでの修正は24時間以内に提供された。RufRootを際立たせるのは、そのエクスプロイトがAI自身の学習パイプラインで終結したことだ。そこでは、アップグレード、再デプロイ、ポート閉鎖という従来の対策を講じても、注入された命令がそのまま残り、依然として回答を形成している。Cloud Security Allianceの注記は、これを、LangGraphのチェックポイントチェーンや未認証のAutoGen Studioサーフェスを含むエージェントツーリング全体ですでに文書化していたパターンの事例研究として読み取っており、エージェントの行動を形成するために使われる永続メモリは、キャッシュではなく、完全性監視の下で機微なデータストアとして扱うべきだと主張している。

その捉え直しこそが実務的な要点です。この事案の目に見える痕跡は、パッチを適用した依存関係と公開された勧告です。目に見えない痕跡は、運用者のAgentDBに依然として含まれている可能性のあるパターンであり、正規に学習されたポリシーと植え込まれたポリシーを見分ける公開ツールやシグネチャは存在しません。到達可能なネットワークの背後でデフォルトのcomposeファイルを実行した組織にとって有用な対応は、Nomaと勧告の両方が示すとおりです。すなわち、鍵が読まれたと想定し、鍵をローテーションし、生成される回答を信頼する前にメモリを検査することです。