概要

GitHubスターが67,000を超えるオープンソースのAIエージェント統合プラットフォーム「Ruflo」に、CVSSスコア10.0(最高深刻度)の脆弱性「RufRoot」(CVE-2026-59726)が発見された。Noma Security(Noma Labs)の研究チームが発見し、バージョン3.16.3より前のすべてのRufloに影響する。攻撃者は認証を一切必要とせず、単一のHTTPリクエストだけでコンテナ内での任意コード実行、LLM APIキーの窃取、ユーザー会話の盗聴、さらにはAIエージェントの「記憶」への毒性注入までを行うことができた。責任ある開示を受け、保守者のReuven Cohen氏は数時間から24時間以内にパッチをリリースしている。

技術的な詳細

脆弱性の根本原因は、RufloがAIエージェントとエンタープライズシステムを仲介する中枢コンポーネント「Model Context Protocol(MCP)ブリッジ」にある。このExpress.jsサーバーは、シェルコマンド実行・データベース操作・エージェント管理・メモリ保存など233個ものツールをHTTP経由で公開していたが、/mcpエンドポイントへのアクセスに認証を要求していなかった。加えてdocker-compose.yml設定ファイルがデフォルトでポート3001を0.0.0.0にバインドしており、インターネットに露出したインスタンスであれば誰でもアクセス可能な状態になっていた。

Noma Labsが実証した攻撃チェーンは8段階に及ぶ。まずtools/list相当の呼び出しで233ツールを列挙し、ruflo__terminal_executeツールへの認証なしPOSTリクエスト1本でコンテナ内の任意コマンドを実行する。次に環境変数からOpenAIやAnthropicなどのLLM APIキーを窃取し、攻撃者制御下のエージェント群を追加生成する。特に深刻なのが、ruflo__agentdb_pattern-storeツールへ悪意あるパターンを注入する「AIメモリ汚染」で、これによりパッチ適用後もエージェントの将来の応答に攻撃者の影響が残り続ける。さらに認証なしのMongoDBから全会話履歴を抽出し、index.jsにビーコンスクリプトを仕込んで永続的なバックドアを確立、最後にシェル履歴を削除して証跡を消す、という流れだ。

修正内容と対応

Ruflo側はPR #2521を数時間以内にマージし、ADR-166としてまとめられた修正をバージョン3.16.3で公開した。主な変更点は、MCPブリッジをデフォルトでループバックインターフェース(localhost)にバインドするよう変更したこと、Bearer認証ミドルウェアを導入したこと、terminal_executeツールをデフォルトで無効化したこと、MongoDBに認証を必須化したこと、コンテナを読み取り専用化したこと、そしてCORSホワイトリストを導入したことなどが挙げられる。認証なしで公開されている場合はフェイルクローズド(安全側に倒す)設定になる点も強調されている。

影響範囲と推奨される対策

Noma Securityおよび専門家は、露出したインスタンスの運用者に対し、単なるアップデート適用だけでは不十分だと警告している。推奨対策としては、ファイアウォールでポート3001(MCPブリッジ)およびポート27017(MongoDB)への外部アクセスを即座に遮断すること、すべてのLLM APIキーをローテーションすること、AgentDBのパターンストアに悪意あるエントリが注入されていないか監査すること、MongoDBに改ざんの兆候がないか調査すること、そしてコンテナ自体を再構築することが挙げられている。特にAIメモリ汚染についてはパッチの再デプロイだけでは除去されないため、個別の監査が不可欠だ。

Kanerika社のAI開発マネージャーAmit Jena氏は「MCPの普及速度が、オーケストレーションツールに組み込まれたセキュリティ標準の整備を上回ってしまっている」と指摘する。今回の脆弱性はRuflo固有の問題ではなく、AIエージェントが永続的なメモリを保持する他のプラットフォーム全般に共通するリスクを浮き彫りにした。侵害後に攻撃者が挿入した悪意あるメモリは、パッチ適用後もエージェントの挙動に影響を与え続ける可能性があり、MCPサーバーを他の一般的なAPIと同様に扱い、すべてのリクエストに認証を要求することの重要性が改めて示された。