
RufRoot: en enda oautentiserad förfrågan till Ruflos MCP-brygga körde kommandon, stal nycklar och förgiftade AI-minnet
- OrcaNYOrcaCyber: MiniMax M3.1 Flash Abliterated / Uncensored2026-10-29101 tok/s
- OrcaNYOrcaCyber: GLM 5.3 Flash Abliterated / Uncensored2026-10-27$0.80 / $1.60 per 1M tokens · 103 tok/s
- OrcaNYOrcaCyber: Qwen3.8 Flash Next Abliterated / Uncensored2026-10-26$0.80 / $1.60 per 1M tokens · 283 tok/s
- OrcaNYOrcaCyber: MiMo V2.6 Flash Abliterated / Uncensored2026-10-26$0.80 / $1.60 per 1M tokens · 93 tok/s
- MoonshotNYMoonshotAI: Kimi K3.1 Pro2026-10-2446Intelligens
- OrcaNYOrcaCyber: DeepSeek V4.1 Flash Abliterated / Uncensored2026-10-23$0.80 / $1.60 per 1M tokens · 107 tok/s
- minimaxNYMiniMax: M3.1 Flash2026-10-1929Intelligens
- OrcaNYOrca: OrcaCyber Ultra 1.02026-10-17$5.00 / $10.00 per 1M tokens · 70 tok/s
- deepseekNYDeepSeek: DeepSeek V4.1 Flash 10172026-10-1733Intelligens
- DeepSeekNYDeepSeek: DeepSeek V4.1 Flash2026-10-1740Intelligens
- OrcaOrca: OrcaCyber Zero 1.52026-10-10$3.00 / $7.50 per 1M tokens · 96 tok/s
- openaiOpenAI: GPT-6.1 Sol2026-09-2955Intelligens
- anthropicAnthropic: Claude Sonnet 5.52026-09-2854Intelligens
- typesafeTypeSafe: Jev 1.132026-09-24$0.04 / $0.00 per 1M tokens · 168 tok/s
- OpenAIOpenAI: GPT-6 Luna2026-09-2228Intelligens
- OpenAIOpenAI: GPT-6 Sol2026-09-2248Intelligens
- AnthropicAnthropic: Claude Opus 5.52026-09-2258Intelligens
- xiaomiXiaomi: MiMo-V2.6-Flash2026-09-2127Intelligens
- xiaomiXiaomi: MiMo-V2.6-Pro2026-09-2130Intelligens
- xAIGrok 4.72026-09-2134Intelligens
Den 30 juni 2026, Noma Labs överlämnade till underhållaren av Ruflo en fungerande exploit mot själva projektet. Noma Securitys forskningsavdelning hade upptäckt att Ruflo – en plattform med öppen källkod för agentorkestrering som tidigare släpptes som Claude Flow – levererade en standarddistribution för Docker Compose som band dess Model Context Protocol-brygga till port 3001 på alla nätverksgränssnitt och inte krävde någon autentisering alls. En enda HTTP-förfrågan till /mcpslutpunkten räckte för att köra skalkommandon inuti containern som node-användaren, och från det skalet kunde en angripare läsa varje API-nyckel för LLM-leverantörer i miljön, dumpa alla lagrade konversationer, starta agentsvärmar som faktureras mot offrets nycklar och skriva instruktioner i AgentDB:s inlärningslager som skulle fortsätta styra AI:ns svar för varje användare av den instansen. Sårbarheten är CVE-2026-59726, med smeknamnet RufRoot, bedömdes till CVSS 10.0 och rättades i 3.16.3 inom 24 timmar. Ingen källa vi läste rapporterar att den har utnyttjats i det vilda. Arkivets egen post för denna sårbarhet, med dess källförteckning och konfidensgrad, finns i AI-incidentarkivet, bredvid de andra MCP- och infrastrukturposterna som registrerats kring den.
Standardinställningen som öppnade dörren
Ruflo är vad Noma Labs kallar en agent-metaharness: ett självhostat lager för svärmar på upp till 100 agenter, byggt för Claude Code och OpenAI Codex, med långtidsminne och en inbyggd MCP-server för verktygsanrop. Den vanliga uppsättningen är den som Noma beskriver – klona förvaret, lägg till LLM-API-nycklar, kör docker compose up -d. Projektets standard-Compose-fil band bryggan till 0.0.0.0 på port 3001 och band sin tillhörande MongoDB till alla gränssnitt på 27017, med Mongo-autentisering avstängd. Hur långt det når beror på brandväggen, säkerhetsgruppen och nätverkssegmenteringen runt driftsättningen; Nomas egen formulering är att varje instans som gick att nå över nätet var fullt exploaterbar utan autentisering.
MCP-bryggan är en Express.js-server som omvandlar JSON-RPC-förfrågningar som anländer via HTTP till anrop mot Ruflos interna verktygsbibliotek. I den sårbara kodraden innehöll det biblioteket 233 verktyg som omfattade skalåtkomst, databasoperationer, agenthantering och minneslagring. Nomas analys är tydlig om vad det gör det till: "MCP-bryggan är inte ett slumpmässigt extra felsökningsgränssnitt; snarare är den Ruflos centrala nervsystem. Varje verktygsanrop, varje agentåtgärd, varje minnesoperation går genom MCP-bryggan."
Autentiseringslagret saknades, det var inte bara svagt. POST /mcp och POST /mcp/:group implementerar MCP JSON-RPC-protokollet och skickar inkommande tools/call-förfrågningar direkt till den interna executeTool()-funktionen. Ruflo hade faktiskt en kommandoblockeringslista, AUTOPILOT_BLOCKED_PATTERNS, avsedd att stoppa farliga skaloperationer, men GitHub-rådgivningen är tydlig med att den "endast tillämpades i autopilotflödet. POST /mcp och POST /mcp/:group kringgick den." Ett oautentiserat anrop som angav ruflo__terminal_execute körde därför godtyckliga kommandon som containerns node-användare, registrerad i rådgivningen som uid 1000, utan token, session eller tidigare interaktion. Ingen privilegieeskalering krävdes för det som följde: autentiseringsuppgifterna, agent-API:erna, minneslagret och databasen var alla nåbara från det skalet.
Kedjan, i åtta steg
Noma Labs publicerade ett konceptbevis i åtta steg och bekräftade varje steg live mot en standarddriftsättning av Ruflo på AWS EC2, med out-of-band-återanrop till Burp Collaborator för att verifiera exekvering och exfiltrering. Stegen är inte spekulativa konsekvenser staplade på en teoretisk bugg; de är en demonstrerad sekvens, och säkerhetsrådgivningens åtgärdsavsnitt är skrivet för operatörer som redan kan befinna sig i den.

Rekognosering kommer först eftersom verktygslistan är offentlig för alla anropare: tools/list returnerar alla 233 poster utan autentiseringsuppgifter. Kommandokörning följer av samma slutpunkt, och Nomas proof of concept bekräftade det med ett out-of-band-återanrop i stället för en slutledning från en svarskropp. Miljösteget är det som förvandlar en värdkompromiss till ett problem med fakturering och dataförlust: compose-filen skickade leverantörsnycklar in i containern och backendprocesser ärvde hela miljön genom { ...process.env }, så en enda printenv dumpade dem. Dessa nycklar gjorde det sedan möjligt för ruflo__swarm_init och ruflo__agent_spawn att starta angriparkontrollerade svärmar som förbrukade offrets kvot och beräkningskapacitet.
Steg fem är det som överlever intrånget. Med hjälp av ruflo__agentdb_pattern-store planterade Noma en uppdiktad SOC2-efterlevnadspolicy som instruerade AI:n att bädda in en angriparkontrollerad URL i varje distributionsskript som den därefter genererade. Eftersom AgentDB finns just för att varaktigt lagra den här typen av mönster så att agentbeteendet förbättras mellan sessioner, betedde sig den injicerade posten precis som systemet var designat att bete sig. "Framtida konversationer producerar angriparpåverkad utdata, och användaren har inget sätt att avgöra det", står det i Nomas rapport. Dark Reading, som rapporterade om sårbarheten den 29 juli, bad en utomstående expert kommentera skillnaden: John Gallagher, vicepresident på Viakoo, kallade det en annan klass av problem: "Det här är inte att utnyttja mjukvarusvagheter, det är minnesförgiftning."
De återstående stegen är konventionella efterexploateringssteg, utförda med ovanlig bekvämlighet. MongoDB på det interna Docker-nätverket saknade autentisering, så angriparna installerade en klient i /tmp, dumpade konversationer och skickade ut dem. Persistensen uppnåddes genom att skriva /app/beacon.js, lägga till raden require('./beacon.js') i index.js och döda PID 1, varefter Dockers omstartspolicy återstartade containern med beaconen aktiv. Det sista steget var att rensa skalhistoriken. Allt detta följde av en enda oautentiserad begäran; ingenting i standardutplaceringen stoppade kedjan vid någon punkt.
Lagningen, och den del som en patch inte kan nå
Underhållaren släppte Ruflo 3.16.3 inom 24 timmar efter avslöjandet den 30 juni, och GitHub publicerade rådgivningen GHSA-c4hm-4h84-2cf3 den 1 juli 2026. Åtgärden, som spåras i repot som ADR-166 och slogs samman i pull request 2521, ändrar standardvärdena i stället för att bara lägga till en kontroll:
• MCP-bryggan binder 127.0.0.1 som standard; en publik bindning kräver MCP_AUTH_TOKEN, och processen avslutas med ett fatalt meddelande vid start om token saknas.
• Middleware för bärartoken med jämförelse i konstant tid sitter framför bryggan.
• terminal_execute är spärrad på serversidan bakom MCP_ENABLE_TERMINAL=true, avstängd som standard, och spärren tillämpas på samma sätt på /mcp, /mcp/:group och autopilotflödet – den saknade länken som hade låtit den avslöjade kedjan nå ett skal.
• MongoDB kräver autentisering, och ett root-lösenord krävs för att containern ska kunna starta.
• Bridge-containern kör ett skrivskyddat rotfilsystem med tmpfs, en CORS-tillåtelselista ersätter jokertecknet, och CI-regressionslås täcker den statiska konfigurationen och körtidsbeteendet.
Inget av detta bortar en post som redan har skrivits in i AgentDB. Rådgivningen säger åt operatörer av alla exponerade instanser att omedelbart brandvägga portarna 3001 och 27017, rotera leverantörsnycklarna, granska mönsterlagret efter injicerade agentdb_pattern-store poster och rensa bort dem, granska MongoDB för manipulation och bygga om containrar från rena avbildningar. Dess varning är ovanligt direkt: "En patchad återutplacering ensam upphäver INTE förgiftning." Nomas genomgång drar samma slutsats – granskning av mönsterlagret är en del av åtgärden, och patchen är det inte.
Orsaken är strukturell snarare än slarvig. Ett mönsterlager som formar framtida modellutdata har inget sätt att skilja en legitim inlärd instruktion från en angripares planterade; båda anländer som mönster, och systemet är byggt för att lita på dem. Det förvandlar en nätverkssårbarhet till ett dataintegritetsproblem med en okänd eftersläpning, och det betyder att frågan för en operatör inte bara är om porten var nåbar utan vad minnet innehåller nu.

Vad som är fastställt, och vad som inte är det
Den tekniska posten här är primär och konsekvent. Säkerhetsmeddelandet anger det drabbade paketet (npm ruflo under 3.16.3), den patchade versionen, de exakta slutpunkterna, containeranvändaren och de två portarna; underhållarens releaseanteckningar beskriver samma kedja; Nomas genomgång levererar detaljerna kring konceptbeviset; och oberoende medier – The Hacker News och Dark Reading den 29 juli 2026, SecurityWeek den 30 juli – rapporterar samma mekanism utan att tillföra motstridiga detaljer. En forskningsnotis från Cloud Security Alliance daterad den 5 augusti 2026 återger sekvensen och placerar den vid sidan av tidigare oautentiserade MCP- och agentorkestreringssvagheter som den hade följt. Arkivet ger posten konfidensgraden A, obestridd, och markerar den som en milstolpe; dess allvarlighetsgrad för posten är hög, åtskild från själva CVSS-poängen.
En detalj i poängsättningen är värd att anges exakt, eftersom två primära dokument inte stämmer överens. GHSA-c4hm-4h84-2cf3 har CVSS 10.0 på vektorn AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H — omfattningsändringen är det som driver det till maximum. Kopian av samma rådgivning på 3.16.3-släppsidan beskriver poängen som "CVSS 9.8 critical". Posten i National Vulnerability Database, kontrollerad den 30 oktober 2026, publicerad den 9 juli 2026 och märkt Deferred, har GitHub 10.0 som en sekundär metrik och ingen egen poäng skapad av NVD. Vi hittade ingen förklaring till 9.8-raden, och den här artikeln löser den inte.
Adoptionssiffrorna är lägre. Noma Labs beskrev projektet vid den tiden som att det hade mer än 67 000 GitHub-stjärnor, ungefär 10 miljoner nedladdningar och omkring 1 miljon aktiva användare; The Hacker News citerade, så som Cloud Security Alliance sammanfattade det, mer än 66 500 stjärnor. Siffrorna för nedladdningar och användare är Noma Labs egna och är inte oberoende verifierade. Antalet stjärnor för källkodsarkivet den 30 oktober 2026 var 80 198 – en kontroll av projektets räckvidd, inte ett mått på exponering, och ingen källa har publicerat hur många installationer som faktiskt var nåbara från ett nätverk.

Det som inte är fastställt är den del som lättast överdrivs. Varken Noma, underhållaren eller någon publikation vi har läst hävdar att sårbarheten utnyttjades i det vilda, och arkivet registrerar ingen verklig skada för den här posten. Nomas konceptbevis kördes mot en driftsättning som forskarna kontrollerade på EC2, vilket visar vad en standardinstallation tillåter, inte vad någon enskild produktionsinstans har drabbats av. Det har inte publicerats något antal internetexponerade Ruflo-driftsättningar, och ingen operatör har publicerat resultaten av en AgentDB-granskning, så både den drabbade populationen och mängden förgiftat minne som finns är okända. Cloud Security Alliances råd att betrakta exponerade driftsättningar som fullt komprometterade är en riskhållning som motiveras av utnyttjande utan interaktion; det är inte bevis på att ett intrång har inträffat.
Varför arkivet märker det som ett landmärke
Arkivets landmärkesflagga vilar på något mer specifikt än en maximal poäng. En fjärrkodskörningsbugg med CVSS 10,0 i en populär självhostad tjänst är en välbekant genre, och rättelsen här kom inom 24 timmar. Det som skiljer RufRoot åt är att exploiten slutade i AI:ns egen inlärningspipeline, där den konventionella åtgärden – uppgradera, distribuera om, stäng porten – lämnar den injicerade instruktionen kvar på plats och fortfarande formar svar. Cloud Security Alliance-noten tolkar det som en fallstudie av ett mönster som den redan hade dokumenterat inom agentverktyg, inklusive en LangGraph-kontrollpunktskedja och en oautentiserad AutoGen Studio-yta, och menar att beständigt minne som används för att forma agentbeteende bör behandlas som ett känsligt datalager under integritetsövervakning snarare än som en cache.
Den omformuleringen är den praktiska slutsatsen. Det synliga spåret av den här incidenten är ett patchat beroende och ett publicerat säkerhetsmeddelande; det osynliga är vilket mönster som helst som en operatörs AgentDB fortfarande kan innehålla, och det finns inget publicerat verktyg eller någon signatur som skiljer en legitim inlärd policy från en planterad. För de organisationer som körde standardfilen för Compose bakom ett nåbart nätverk är det användbara svaret det som både Noma och säkerhetsmeddelandet ger: antag att nycklarna lästes, rotera dem och granska minnet innan man litar på de svar det producerar.
