
RufRoot: una richiesta non autenticata al bridge MCP di Ruflo ha eseguito comandi, rubato chiavi e avvelenato la memoria dell'IA
- OrcaNUOVOOrcaCyber: MiniMax M3.1 Flash Abliterated / Uncensored2026-10-29101 tok/s
- OrcaNUOVOOrcaCyber: GLM 5.3 Flash Abliterated / Uncensored2026-10-27$0.80 / $1.60 per 1M di token · 103 tok/s
- OrcaNUOVOOrcaCyber: Qwen3.8 Flash Next Abliterated / Uncensored2026-10-26$0.80 / $1.60 per 1M di token · 283 tok/s
- OrcaNUOVOOrcaCyber: MiMo V2.6 Flash Abliterated / Uncensored2026-10-26$0.80 / $1.60 per 1M di token · 93 tok/s
- MoonshotNUOVOMoonshotAI: Kimi K3.1 Pro2026-10-2446Intelligenza
- OrcaNUOVOOrcaCyber: DeepSeek V4.1 Flash Abliterated / Uncensored2026-10-23$0.80 / $1.60 per 1M di token · 107 tok/s
- minimaxNUOVOMiniMax: M3.1 Flash2026-10-1929Intelligenza
- OrcaNUOVOOrca: OrcaCyber Ultra 1.02026-10-17$5.00 / $10.00 per 1M di token · 70 tok/s
- deepseekNUOVODeepSeek: DeepSeek V4.1 Flash 10172026-10-1733Intelligenza
- DeepSeekNUOVODeepSeek: DeepSeek V4.1 Flash2026-10-1740Intelligenza
- OrcaOrca: OrcaCyber Zero 1.52026-10-10$3.00 / $7.50 per 1M di token · 96 tok/s
- openaiOpenAI: GPT-6.1 Sol2026-09-2955Intelligenza
- anthropicAnthropic: Claude Sonnet 5.52026-09-2854Intelligenza
- typesafeTypeSafe: Jev 1.132026-09-24$0.04 / $0.00 per 1M di token · 168 tok/s
- OpenAIOpenAI: GPT-6 Luna2026-09-2228Intelligenza
- OpenAIOpenAI: GPT-6 Sol2026-09-2248Intelligenza
- AnthropicAnthropic: Claude Opus 5.52026-09-2258Intelligenza
- xiaomiXiaomi: MiMo-V2.6-Flash2026-09-2127Intelligenza
- xiaomiXiaomi: MiMo-V2.6-Pro2026-09-2130Intelligenza
- xAIGrok 4.72026-09-2134Intelligenza
Il 30 giugno 2026, Noma Labs ha consegnato al manutentore di Ruflo un exploit funzionante contro il progetto stesso. Il reparto di ricerca di Noma Security aveva scoperto che Ruflo — una piattaforma open source di orchestrazione di agenti, precedentemente distribuita come Claude Flow — forniva una distribuzione Docker Compose predefinita che collegava il suo Model Context Protocol bridge alla porta 3001 su ogni interfaccia di rete e non richiedeva alcuna autenticazione. Una singola richiesta HTTP all'endpoint /mcp era sufficiente per eseguire comandi shell all'interno del container come utente node, e da quella shell un attaccante poteva leggere ogni chiave API dei provider LLM nell'ambiente, scaricare ogni conversazione memorizzata, generare sciami di agenti addebitati sulle chiavi della vittima e scrivere istruzioni nell'archivio di apprendimento AgentDB che avrebbero continuato a orientare le risposte dell'AI per ogni utente di quell'istanza. La falla è CVE-2026-59726, soprannominata RufRoot, con un punteggio CVSS 10.0 e corretta nella versione 3.16.3 entro 24 ore. Nessuna fonte consultata riporta che sia stata sfruttata in natura. Il record dell'archivio stesso per questa falla, con il suo elenco di fonti e il grado di affidabilità, si trova in l'archivio degli incidenti AI, accanto alle altre voci MCP e infrastrutturali registrate intorno ad essa.
Il default che ha aperto la porta
Ruflo è quello che Noma Labs chiama un meta-harness per agenti: un livello self-hosted per sciami fino a 100 agenti, realizzato per Claude Code e OpenAI Codex, con memoria a lungo termine e un server MCP integrato per il tool calling. La configurazione tipica è quella descritta da Noma — clonare il repository, aggiungere le chiavi API LLM, eseguire docker compose up -d. Il file compose predefinito del progetto vincolava il bridge a 0.0.0.0 sulla porta 3001 e vincolava il suo MongoDB complementare a tutte le interfacce su 27017, con l'autenticazione Mongo disattivata. La portata effettiva dipende dal firewall, dal security group e dalla segmentazione di rete attorno alla distribuzione; la formulazione stessa di Noma è che qualsiasi istanza raggiungibile dalla rete era pienamente sfruttabile senza autenticazione.
Il bridge MCP è un server Express.js che trasforma le richieste JSON-RPC in arrivo via HTTP in chiamate alla libreria di strumenti interna di Ruflo. Nella riga vulnerabile, tale libreria conteneva 233 strumenti che coprivano l'accesso alla shell, le operazioni sul database, la gestione degli agenti e l'archiviazione della memoria. L'analisi di Noma è schietta su ciò che questo rende: "Il MCP Bridge non è una casuale interfaccia ausiliaria di debug; è piuttosto il sistema nervoso centrale di Ruflo. Ogni chiamata di strumento, ogni azione degli agenti, ogni operazione sulla memoria passa attraverso il MCP Bridge."
Lo strato di autenticazione era assente, non semplicemente debole. POST /mcp e POST /mcp/:group implementano il protocollo MCP JSON-RPC e inoltrano le richieste in ingresso di tools/call direttamente alla funzione interna executeTool() funzione. Ruflo manteneva una blocklist dei comandi, AUTOPILOT_BLOCKED_PATTERNS, pensata per fermare operazioni shell pericolose, ma l'avviso di GitHub è esplicito nel dire che "veniva applicata solo nel flusso autopilot. POST /mcp e POST /mcp/:group la aggiravano". Una chiamata non autenticata che nominava ruflo__terminal_execute ha quindi eseguito comandi arbitrari come utente node del container, registrato nell'avviso come uid 1000, senza token, sessione o interazione precedente richiesti. Non è servito alcun aumento dei privilegi per ciò che è seguito: le credenziali, le API degli agenti, l'archivio di memoria e il database erano tutti raggiungibili da quella shell.
La catena, in otto passaggi
Noma Labs ha pubblicato una proof of concept in otto passaggi e ha confermato ogni passaggio dal vivo su una distribuzione Ruflo predefinita su AWS EC2, utilizzando callback fuori banda verso Burp Collaborator per verificare l'esecuzione e l'esfiltrazione. I passaggi non sono conseguenze speculative costruite su un bug teorico; sono una sequenza dimostrata, e la sezione di remediation dell'advisory è scritta per operatori che potrebbero già trovarsi nel mezzo di essa.

La ricognizione viene per prima perché l'elenco degli strumenti è pubblico per qualsiasi chiamante: tools/list restituisce tutte le 233 voci senza una credenziale. L'esecuzione dei comandi deriva dallo stesso endpoint, e la proof of concept di Noma l'ha confermata con un callback fuori banda invece che con un'inferenza basata sul corpo della risposta. Il passaggio relativo all'ambiente è quello che trasforma la compromissione di un host in un problema di fatturazione e perdita di dati: il file compose ha passato le chiavi del provider nel container e i processi backend hanno ereditato l'intero ambiente tramite { ...process.env }, quindi un singolo printenv li ha stampati tutti. Quelle chiavi hanno quindi consentito a ruflo__swarm_init e ruflo__agent_spawn di avviare swarm controllati dall'attaccante che hanno consumato la quota e la capacità di calcolo della vittima.
Il quinto passaggio è quello che sopravvive all'intrusione. Usando ruflo__agentdb_pattern-store, Noma ha impiantato una falsa policy di conformità SOC2 che istruiva l'IA a incorporare un URL controllato dall'attaccante in ogni script di deployment che avesse successivamente generato. Poiché AgentDB esiste proprio per persistere esattamente questo tipo di pattern, così che il comportamento degli agenti migliori nel corso delle sessioni, la voce iniettata si è comportata come il sistema era progettato per comportarsi. "Le conversazioni future producono output influenzati dall'attaccante e l'utente non ha modo di accorgersene," afferma l'analisi di Noma. Dark Reading, che ha riportato la vulnerabilità il 29 luglio, ha sottoposto la distinzione a un esperto esterno: John Gallagher, vicepresidente di Viakoo, l'ha definita una classe di problema diversa: "Non si tratta di sfruttare difetti del software, ma di avvelenamento della memoria."
I passaggi successivi sono attività post-exploitation convenzionali, eseguite con una facilità inusuale. MongoDB sulla rete Docker interna non prevedeva autenticazione, quindi gli attaccanti hanno installato un client in /tmp, hanno estratto le conversazioni e le hanno inviate all'esterno. La persistenza è stata ottenuta scrivendo /app/beacon.js, aggiungendo una riga require('./beacon.js') a index.js e uccidendo il PID 1, dopodiché la policy di riavvio di Docker ha riportato il container in esecuzione con il beacon attivo. Il passaggio finale è stato cancellare la cronologia della shell. Tutto ciò è derivato da un'unica richiesta non autenticata; nulla nella distribuzione predefinita ha interrotto la catena in nessun punto.
La correzione, e la parte che una patch non può raggiungere
Il manutentore ha rilasciato Ruflo 3.16.3 entro 24 ore dalla divulgazione del 30 giugno, e GitHub ha pubblicato l'avviso GHSA-c4hm-4h84-2cf3 il 1° luglio 2026. La correzione, tracciata nel repository come ADR-166 e integrata nella pull request 2521, modifica i valori predefiniti anziché limitarsi ad aggiungere un controllo:
• Il bridge MCP si associa a 127.0.0.1 per impostazione predefinita; un bind pubblico richiede MCP_AUTH_TOKEN, e il processo termina con un messaggio fatale all'avvio se il token è assente.
• Il middleware per il token Bearer, con confronto a tempo costante, si trova davanti al bridge.
• terminal_execute è vincolato lato server a MCP_ENABLE_TERMINAL=true, disattivato per impostazione predefinita, e il vincolo viene applicato in modo identico su /mcp, /mcp/:group e sul flusso autopilot — l'anello mancante che aveva consentito alla catena divulgata di raggiungere una shell.
MongoDB richiede l'autenticazione, con una password di root necessaria per l'avvio del container.
• Il container del bridge esegue un filesystem root in sola lettura con tmpfs, un'allowlist CORS sostituisce il wildcard e i lock di regressione della CI coprono la configurazione statica e il comportamento a runtime.
Niente di tutto ciò rimuove una voce già scritta in AgentDB. L'avviso indica agli operatori di qualsiasi istanza esposta di bloccare immediatamente tramite firewall le porte 3001 e 27017, ruotare le chiavi del provider, verificare nell'archivio dei pattern la presenza di voci iniettate agentdb_pattern-store e rimuoverle, controllare MongoDB alla ricerca di manomissioni e ricostruire i container da immagini pulite. Il suo avviso è insolitamente diretto: "Un nuovo deployment con la patch da solo NON annulla l'avvelenamento." La nota di Noma giunge alla stessa conclusione: verificare l'archivio dei pattern fa parte del rimedio, e la patch no.
La ragione è strutturale, non dovuta a negligenza. Un archivio di pattern che plasma l'output futuro del modello non ha alcun modo di distinguere un'istruzione appresa legittima da una impiantata da un attaccante; entrambe arrivano sotto forma di pattern, e il sistema è costruito per fidarsi di essi. Questo trasforma una vulnerabilità di rete in un problema di integrità dei dati con un arretrato sconosciuto, e significa che la domanda per un operatore non è solo se la porta fosse raggiungibile, ma cosa contiene ora la memoria.

Che cosa è stabilito e che cosa non lo è
La documentazione tecnica qui è primaria e coerente. L'avviso indica il pacchetto interessato (npm ruflo inferiore alla 3.16.3), la versione corretta, gli endpoint esatti, l'utente del container e le due porte; le note di rilascio del manutentore descrivono la stessa catena; l'analisi di Noma fornisce i dettagli del proof-of-concept; e testate indipendenti — The Hacker News e Dark Reading il 29 luglio 2026, SecurityWeek il 30 luglio — riportano lo stesso meccanismo senza aggiungere dettagli contraddittori. Una nota di ricerca della Cloud Security Alliance datata 5 agosto 2026 ribadisce la sequenza e la colloca accanto a precedenti vulnerabilità di MCP non autenticato e di orchestrazione degli agenti che aveva monitorato. L'archivio assegna al record una confidenza A, indiscussa, e lo contrassegna come pietra miliare; il suo grado di severità per il record è alto, distinto dal punteggio CVSS stesso.
Un dettaglio sul punteggio merita di essere precisato, perché due documenti primari sono in disaccordo. GHSA-c4hm-4h84-2cf3 riporta CVSS 10.0 sul vettore AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H — è il cambio di scope a spingerlo al massimo. La copia dello stesso advisory sulla pagina di rilascio 3.16.3 descrive il punteggio come "CVSS 9.8 critico". Il record del National Vulnerability Database, verificato il 30 ottobre 2026, pubblicato il 9 luglio 2026 e contrassegnato Deferred, riporta il 10.0 di GitHub come metrica secondaria e nessun punteggio redatto da NVD proprio. Non abbiamo trovato una spiegazione per la riga del 9.8, e questo articolo non lo risolve.
Le cifre di adozione sono più esigue. All'epoca Noma Labs descriveva il progetto come avente più di 67.000 stelle GitHub, circa 10 milioni di download e circa 1 milione di utenti attivi; The Hacker News, come riassunto dalla Cloud Security Alliance, citava più di 66.500 stelle. I conteggi dei download e degli utenti sono di Noma e non sono verificati in modo indipendente. Il conteggio delle stelle del repository al 30 ottobre 2026 era 80.198 — un controllo della portata del progetto, non una misura dell'esposizione, e nessuna fonte ha pubblicato quante distribuzioni fossero effettivamente raggiungibili da una rete.

Ciò che non è stabilito è la parte più facilmente gonfiabile. Né Noma, né il maintainer né alcuna fonte che abbiamo consultato afferma che la falla sia stata sfruttata in the wild, e l’archivio non registra alcun danno reale per questa voce. Il proof of concept di Noma è stato eseguito contro un deployment controllato dai ricercatori su EC2, il che mostra ciò che consente un’installazione predefinita, non ciò che ha subito una particolare istanza di produzione. Non è stato pubblicato alcun conteggio dei deployment di Ruflo esposti a Internet, e nessun operatore ha pubblicato i risultati di un audit di AgentDB, quindi sia la popolazione interessata sia la quantità di memoria avvelenata esistente sono sconosciute. Il consiglio della Cloud Security Alliance di trattare i deployment esposti come compromissioni complete è una postura di rischio giustificata dallo sfruttamento senza interazione; non è prova che si sia verificata una violazione.
Perché l’archivio lo classifica come pietra miliare
Il flag emblematico dell'archivio si basa su qualcosa di più specifico di un punteggio massimo. Un bug di esecuzione di codice remoto con CVSS 10.0 in un popolare servizio self-hosted è un genere familiare, e la correzione è arrivata entro 24 ore. Ciò che distingue RufRoot è che l'exploit terminava nella pipeline di apprendimento dell'IA stessa, dove il rimedio convenzionale — aggiornare, ridistribuire, chiudere la porta — lascia l'istruzione iniettata al suo posto e continua a plasmare le risposte. La nota della Cloud Security Alliance lo legge come un caso di studio di un pattern che aveva già documentato nel tooling degli agenti, tra cui una catena di checkpoint LangGraph e una superficie AutoGen Studio non autenticata, e sostiene che la memoria persistente usata per modellare il comportamento degli agenti dovrebbe essere trattata come un archivio di dati sensibili soggetto a monitoraggio dell'integrità, anziché come una cache.
Quella riformulazione è l'insegnamento pratico. L'artefatto visibile di questo incidente è una dipendenza corretta e un advisory pubblicato; quello invisibile è qualunque pattern che l'AgentDB di un operatore possa ancora contenere, e non esiste alcuno strumento o firma pubblicati che distingua una politica appresa legittima da una impiantata. Per le organizzazioni che hanno eseguito il file compose predefinito dietro una rete raggiungibile, la risposta utile è quella che danno sia Noma sia l'advisory: presumere che le chiavi siano state lette, ruotarle e ispezionare la memoria prima di fidarsi delle risposte che produce.
