在深藏青色背景上生成的抽象插圖。一個寬闊的石板色橋狀結構橫跨畫面,其左側面上的一個矩形開口敞開並發出琥珀色光芒。穿過那個開口,一連串一模一樣的小方塊向外湧出,越過隱約的藍圖網格,穿過前景中繪製的細虛線青色邊界而不受阻擋。在右下方,這些方塊匯入一個由相連節點構成的低矮半透明晶格,宛如一座記憶儲存庫。畫面中沒有出現任何文字、字母、數字、人物、品牌標記或組織標誌。OrcaRouter 標誌合成於作品下方白色條帶的右下角。
AI Safety Incidents

RufRoot:一次未經身分驗證的請求,就能透過 Ruflo 的 MCP 橋接器執行命令、竊取金鑰並污染 AI 記憶。

作者

Rowan Sterling

發佈日期

最新模型 · 20查看全部模型 →
基準測試:Artificial Analysis · 每日更新
返回全部文章

於 2026年6月30日,Noma Labs將一個針對該專案本身的可用漏洞利用交給了 Ruflo 的維護者。Noma Security 的研究部門發現,Ruflo——一個先前以 Claude Flow 名稱發布的開源代理編排平台——隨附的預設 Docker Compose 部署,會將其 模型上下文協定橋接器綁定到 3001 埠(所有網路介面),且完全不要求任何身分驗證。只要向 /mcp 端點發出單一 HTTP 請求,就足以在容器內以 node 使用者的身分執行 shell 命令;從該 shell,攻擊者可以讀取環境中的每個 LLM 供應商 API 金鑰、傾印每個已儲存的對話、啟動以受害者金鑰計費的代理群,並將指令寫入 AgentDB 的學習儲存庫,這些指令會持續左右該執行個體中每位使用者所獲得的 AI 回答。此漏洞為 CVE-2026-59726,別名 RufRoot,評分為 CVSS 10.0,並在 24 小時內於 3.16.3 中修復。我們所閱讀的來源均未報導其在野外遭到利用。此漏洞在檔案庫中的紀錄,連同其來源清單與信心等級,收錄於 AI 事件檔案庫,與其他在其前後歸檔的 MCP 與基礎設施條目並列。

開啟了那扇門的預設

Ruflo 是 Noma Labs 所稱的代理中繼框架(agent meta-harness):這是一個可自架的層,供最多 100 個代理組成的代理群使用,專為 Claude Code 與 OpenAI Codex 打造,具備長期記憶,以及內建用於工具呼叫的 MCP 伺服器。常見的安裝方式是 Noma 所描述的那一套——複製儲存庫、加入 LLM API 金鑰、執行 docker compose up -d。該專案的預設 compose 檔將橋接器綁定到 0.0.0.0 的 3001 埠,並將其搭配的 MongoDB 綁定到所有介面上的 27017,且關閉 Mongo 驗證。其影響範圍取決於部署周遭的防火牆、安全性群組與網路分段;Noma 自己的說法是,任何可從網路觸及的執行個體都能在未經驗證的情況下遭到完全利用。

MCP Bridge 是一個 Express.js 伺服器,會將透過 HTTP 送達的 JSON-RPC 請求轉換為對 Ruflo 內部工具庫的呼叫。在有漏洞的那一行,該工具庫包含 233 個工具,涵蓋 shell 存取、資料庫操作、代理管理與記憶儲存。Noma 的文章直言不諱地指出這代表什麼:「MCP Bridge 不是隨機的輔助除錯介面;相反地,它是 Ruflo 的中樞神經系統。每一次工具呼叫、每一個代理動作、每一次記憶操作,都會經過 MCP Bridge。」

身分驗證層是缺失的,而不只是薄弱。POST /mcp與POST /mcp/:group實作了 MCP JSON-RPC 協定,並將傳入的tools/call請求直接交給內部的executeTool()函式。Ruflo 確實維護了一份指令封鎖清單 AUTOPILOT_BLOCKED_PATTERNS,旨在阻止危險的 shell 操作,但 GitHub 安全公告明確指出它「僅在 autopilot 流程中強制執行。POST /mcp 與 POST /mcp/:group 繞過了它」。因此,一個未經認證、指名 ruflo__terminal_execute 的呼叫,便以容器之 node 使用者的身分執行任意命令,公告中記錄為 uid 1000,且不需要任何 token、工作階段或事先互動。接下來的事不需要權限提升:憑證、代理程式 API、記憶體存放區與資料庫全都能從那個 shell 觸及。

這條鏈,分八個步驟

Noma Labs 發布了一套八步驟的概念驗證,並在 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 } 繼承了完整環境變數,因此單一 printenv 就把它們全部傾印出來。這些金鑰接著讓 ruflo__swarm_init 與 ruflo__agent_spawn 啟動受攻擊者控制的 swarm,消耗受害者的配額與運算資源。

第五步是能比入侵存續得更久的一步。ruflo__agentdb_pattern-store,Noma 植入了一項虛構的 SOC2 合規政策,指示 AI 在其後續生成的每個部署腳本中嵌入由攻擊者控制的 URL。由於 AgentDB 的存在正是為了持久保存這類模式,好讓代理行為能跨工作階段改善,這筆被注入的條目表現得正如系統設計所預期。「未來的對話會產生受攻擊者影響的輸出,而使用者無從分辨,」Noma 的報告寫道。於 7 月 29 日報導該漏洞的 Dark Reading 就這項區別請教了一位外部專家:Viakoo 副總裁 John Gallagher 稱這是另一類問題:「這不是在利用軟體漏洞,而是在毒化記憶。」

其餘步驟是常規的後滲透作業,執行起來卻異常便利。內部 Docker 網路上的 MongoDB 沒有啟用身分驗證,因此攻擊者將用戶端安裝在 /tmp,傾印對話資料並將其外傳。持續潛伏來自寫入 /app/beacon.js,以及新增一行 require('./beacon.js') 到 index.js,並終止 PID 1;之後 Docker 的重啟策略讓容器重新啟動,且 beacon 仍在運作。最後一步是清除 shell 歷史紀錄。這一切都源自單一未經身分驗證的請求;預設部署中沒有任何環節能阻斷這條攻擊鏈。

修復,以及補丁無法觸及的部分

維護者發布了Ruflo 3.16.3,而 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 與 autopilot 流程上以相同方式強制執行——這正是先前讓已揭露的鏈得以觸及 shell 的缺失環節。

• {{1}}MongoDB{{/1}} 需要驗證,且容器啟動時必須提供 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 ruflo 3.16.3 以下)、修補後的版本、確切端點、容器使用者及兩個連接埠;維護者的發行說明描述同一條鏈;Noma 的撰文提供概念驗證細節;獨立媒體——2026 年 7 月 29 日的 The Hacker News 與 Dark Reading、7 月 30 日的 SecurityWeek——報導相同機制,且未加入相互矛盾的具體細節。一份日期為 2026 年 8 月 5 日的雲端安全聯盟(Cloud Security Alliance)研究筆記重述該序列,並將其與其先前追蹤的較早期未經身分驗證的 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——正是範圍變更(scope change)把它推到了最高分。同一份公告在 3.16.3 發布頁面上的版本,則將該分數描述為「CVSS 9.8 重大」。美國國家漏洞資料庫(NVD)的紀錄於 2026 年 10 月 30 日查核、2026 年 7 月 9 日發布,並標記為已延後,其將 GitHub 的 10.0 列為次要指標,本身並無 NVD 自行評定的分數。我們並未找到 9.8 那一行的解釋,本文也未對此作出定論。

採用數據較為單薄。Noma Labs 當時將該專案描述為擁有超過 67,000 個 GitHub 星標、約 1,000 萬次下載,以及約 100 萬名活躍使用者;《The Hacker News》如 Cloud Security Alliance 所概述,引用超過 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 的概念驗證是針對研究人員在 EC2 上控管的部署環境執行,這只顯示預設安裝容許什麼,而非任何特定正式環境執行個體實際遭受了什麼。目前尚未公布對網際網路開放的 Ruflo 部署數量,也沒有任何營運者公布 AgentDB 稽核結果,因此受影響的部署群體與現存遭汙染記憶的數量都仍未知。雲端安全聯盟建議將暴露的部署視為已完全淪陷,這是因為零互動即可利用而合理採取的風險態勢;但這並非已發生入侵的證據。

為何檔案館將其標為里程碑

該檔案庫的里程碑旗標所依據的,是比最高分數更為具體的事物。熱門自架服務中出現 CVSS 10.0 的遠端程式碼執行漏洞,是常見類型,而此處的修復在 24 小時內就到來。RufRoot 的特別之處在於,該漏洞利用終止於 AI 自身的學習管線;在該處,常規補救措施——升級、重新部署、關閉連接埠——會讓注入的指令留在原處,並繼續塑造回答。Cloud Security Alliance 的說明將其視為一種模式的案例研究,而該模式已在代理工具中記錄過,包括 LangGraph 檢查點鏈與未經身分驗證的 AutoGen Studio 介面;並主張,用於塑造代理行為的持久記憶應被視為受完整性監控的敏感資料存放區,而非快取。

這樣的重新框定才是實務上的重點。這起事件看得見的產物,是一個已修補的相依套件與一份已發布的公告;看不見的,則是營運者的 AgentDB 仍可能存有的某種模式,而且目前沒有任何已發布的工具或特徵碼,能分辨正當學習而來的策略與被植入的策略。對於在可達網路上執行預設 compose 檔案的組織而言,有用的因應方式正是 Noma 與該公告都提出的建議:假定金鑰已被讀取、予以輪替,並在信任其產生的答案之前先檢查記憶內容。