Kai Ole Hartwig
11 min read
Critical

RufRoot (CVE-2026-59726): Unauthenticated Remote Code Execution via Ruflo's MCP Bridge, CVSS 10.0

On 29 July 2026, Noma Security disclosed CVE-2026-59726 (“RufRoot”, CVSS 10.0): an unauthenticated remote code execution vulnerability in the MCP Bridge of Ruflo, an open-source AI agent orchestration platform with roughly 67,000 GitHub stars and about 10 million downloads. The Express.js-based bridge exposes 233 tools via the POST /mcp endpoint, with no authentication at all. Because port 3001 is bound to 0.0.0.0 by default in the bundled docker-compose.yml, a single JSON-RPC call against the ruflo__terminal_execute tool is enough for arbitrary shell command execution in the context of the bridge process. An existing command blocklist (AUTOPILOT_BLOCKED_PATTERNS) doesn't help here, since it only applies inside the application's autopilot flow and is completely bypassed by the direct /mcp call. Fixed as of PR #2521 (GHSA-c4hm-4h84-2cf3): loopback binding by default, mandatory authentication, and terminal access disabled by default.

TL;DR in 90 seconds

Affected?

Ruflo deployments where the MCP Bridge (default port 3001) is reachable from the network. Per the default Docker Compose configuration, that's every unmodified installation.

Risk?

Unauthenticated remote code execution (CVSS 10.0) via POST /mcp and the ruflo__terminal_execute tool: no login, no token, no user interaction required. Noma Security demonstrated a full compromise chain through API key theft, database access, and a persistent backdoor.

Immediate action?

Take port 3001 (and 27017 for the bundled MongoDB) off the public network, update to the fixed version (PR #2521 / GHSA-c4hm-4h84-2cf3), and set MCP_AUTH_TOKEN.

Recommendation?

Act immediately if a Ruflo instance is reachable. This is trivially exploitable (a single curl request) and delivers direct code execution.

Criticality?

critical (hero badge): CVSS 10.0, unauthenticated, trivial exploit; the source base so far rests on a single security vendor (Noma Security), and we have no confirmation of active exploitation in the wild.

What is the problem?

Ruflo is an open-source platform for orchestrating AI agents: developers build “agentic swarms” of up to 100 collaborating agents with persistent memory across sessions and tool execution via the Model Context Protocol (MCP). The MCP Bridge is the central Express.js server through which external MCP clients (agents, tools, IDEs) reach Ruflo's 233 available tools, including shell access, database operations, agent management, and memory operations.

The POST /mcp endpoint implements the MCP JSON-RPC protocol and forwards tool calls directly to executeTool(), with no authentication layer at all. A command blocklist (AUTOPILOT_BLOCKED_PATTERNS) does exist and restricts dangerous operations, but only within the application's autopilot flow. The direct /mcp endpoint bypasses this check entirely. Combined with the default bind to 0.0.0.0 in the bundled docker-compose.yml (port 3001 on all network interfaces), the result is unauthenticated remote code execution with a single HTTP request:

 

curl -s -X POST <target>/mcp -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"ruflo__terminal_execute","arguments":{"command":"id && hostname"}}}'

Who is affected?

ConfigurationStatusCondition
Ruflo with default docker-compose.yml, port 3001 reachable externallyFully exposed (unauthenticated RCE)No MCP_AUTH_TOKEN set, bridge bound to 0.0.0.0
Ruflo behind a reverse proxy/firewall without access restriction on 3001Exposed to anyone with network access to the proxyNo separate auth layer in front of the bridge
Ruflo, bridge bound only to localhost/internal networkMaterially reduced riskAttacker already needs host or internal network access
Ruflo on the patched line (PR #2521 / GHSA-c4hm-4h84-2cf3)No longer exposed by defaultLoopback binding by default, MCP_AUTH_TOKEN required for public binding

Particularly relevant for organisations running Ruflo experimentally or in production for internal automation, coding agents, or workflow orchestration: the default configuration prioritises setup simplicity over security, a pattern that has repeatedly led to critical vulnerabilities in AI agent tooling over the past months (comparable to the Langflow and LiteLLM cases already documented on this blog).

Impact

Noma Security demonstrated a full eight-step attack chain: (1) reconnaissance via tools/list, enumerating all 233 available tools; (2) code execution via terminal_execute; (3) theft of API keys from environment variables (OpenAI, Anthropic, Google, and OpenRouter credentials were reachable in the demonstrated environment); (4) “weaponizing” further agents via ruflo__swarm_init and ruflo__agent_spawn to spin up attacker-controlled swarms; (5) memory poisoning by injecting manipulated patterns into the learning pipeline via ruflo__agentdb_pattern-store; (6) data theft through unauthenticated access to the underlying MongoDB (dumping all conversations); (7) persistence by injecting a beacon script at /app/beacon.js with a startup hook; (8) covering tracks by clearing shell history.

The effect therefore goes well beyond classic server compromise: alongside full code execution, possible consequences include stolen LLM API keys, compromised agent swarms, and manipulated behaviour patterns permanently embedded in the learning pipeline. The latter is especially hard to fully clean up, since affected patterns can continue influencing downstream agent decisions.

Mitigation / immediate steps

Operational decision block

Step 1: Immediately restrict network access

 

# Firewall rules for the MCP bridge and its MongoDB backend
sudo ufw deny 3001/tcp
sudo ufw deny 27017/tcp

# If using Docker Compose: restrict the port mapping to localhost
# instead of "3001:3001" -> "127.0.0.1:3001:3001" in docker-compose.yml

 

Step 2: Update to the patched line

 

# Update Ruflo to the state after PR #2521 / GHSA-c4hm-4h84-2cf3
git pull
# or: pull the current release image that includes the fix

# Set the mandatory authentication environment variable
export MCP_AUTH_TOKEN="$(openssl rand -hex 32)"

# Terminal access remains disabled by default after the patch;
# only enable explicitly if strictly required:
# export MCP_ENABLE_TERMINAL=true

 

Step 3: Verify after patching

 

# Test unauthenticated access -- should fail after the patch
curl -s -X POST <host>/mcp -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
# expected response: error/rejection due to missing authentication,
# not the list of 233 tools

Detection / verification

Establish inventory

 

# Check whether a Ruflo MCP bridge is reachable on port 3001
nmap -p 3001 <host-or-range>

# Test unauthenticated access (only against your own systems!)
curl -s -X POST <host>/mcp -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
# If you get back a list of ~233 tools, the instance is vulnerable

 

Check for compromise

 

# Check for suspicious files that could serve as a backdoor
ls -la /app/beacon.js 2>/dev/null && echo "SUSPICIOUS: beacon.js found"

# Check MongoDB for unauthorized access/tampering
# (Ruflo's backend DB, default port 27017 -- review access logs)

# Check shell history for gaps/tampering (attackers typically clear traces)
history | tail -100
cat ~/.bash_history | wc -l

 

Runtime indicators

Operator guidance

Mid-market

Check immediately whether Ruflo is in use anywhere, including as a “shadow IT” experiment run by individual teams outside the official software inventory. If an instance is reachable, take port 3001/27017 off the public network immediately and update to the patched line. As a precaution, rotate all LLM API keys that were configured in the Ruflo environment, regardless of whether compromise is confirmed.

Enterprise

This case underlines a recurring pattern in AI agent tooling: frameworks optimised for fast onboarding often bind management and control interfaces to all network interfaces by default and skip authentication “for simplicity.” Build an inventory of all MCP servers and agent-orchestration tools across the organisation (officially adopted or not) and explicitly check their default configuration for open management ports before they go into production.

Decision block

Frequently asked questions about CVE-2026-59726 (RufRoot)

Do we need to rotate all LLM API keys even without evidence of compromise?+

If your Ruflo instance was reachable and you can't fully verify the period before your patch against the indicators listed in this post, we recommend rotating as a precaution. Stolen API keys don't necessarily leave traces that can be conclusively proven after the fact.

Is a reverse proxy with basic auth in front of port 3001 enough as a workaround?+

As an interim measure, yes, provided the proxy is configured to genuinely secure every request on every path and the bridge itself remains unreachable directly. It doesn't replace the update long-term: the patch also fixes the command-blocklist bypass and the unauthenticated MongoDB connection, neither of which a front-end proxy alone addresses.

What's the difference between the MCP Bridge and Ruflo's regular web interface?+

The regular web interface targets human users and typically has its own auth mechanisms. The MCP Bridge is a separate interface on its own port, intended for machine MCP clients (other agents, tools, IDE integrations). That very separation is exactly why it shipped without its own authentication, while the main interface may have been secured.

Are we affected if Ruflo only runs on our internal company network?+

The risk is lower but not zero. Anyone with access to the internal network (a compromised employee endpoint, another already-compromised system, or an internal attacker) can reach the unauthenticated endpoint. The risk is real especially in flat internal networks without microsegmentation.

Is CVE-2026-59726 already being actively exploited?+

We have no confirmed reports of active exploitation in the wild so far. The available information rests on the advisory from Noma Security, which found and demonstrated the issue. Given how trivial the exploit is (a single curl request) and how widely Ruflo is deployed, that shouldn't be read as reassurance.

Is it enough to set MCP_AUTH_TOKEN instead of updating?+

Not reliably. Without the patched codebase, the missing authentication check in the endpoint itself remains. Depending on the Ruflo version, it's unclear whether an environment variable set after the fact is even evaluated without the corresponding code fix. Only the combination of updating to the patched line (PR #2521) and then setting MCP_AUTH_TOKEN is reliable.

Conclusion

RufRoot is another example of a pattern that has repeated across AI agent tooling in recent months: a control interface meant for machine rather than human clients ships without authentication for simplicity's sake, under the tacit assumption that it won't be publicly reachable anyway. That assumption rarely holds in practice: default Docker Compose configurations often bind ports to all interfaces, and “internal only” quickly becomes “reachable from the internet” the moment a cloud provider, a NAT gateway, or a misconfigured load balancer enters the picture. The architectural lesson is the same as in the Langflow and LiteLLM cases already documented on this blog: any management or tool-execution interface of an AI agent framework is a production, privileged service and must be treated as such from day one: with authentication by default, not as an afterthought.

Sources

Note: the technical detail in this post rests on a single security vendor as a source. We did not find an independent second source (e.g. an NVD entry or Ruflo's own advisory page) confirming these details at the time of research. Check the original advisory and Ruflo's GitHub repository (GHSA-c4hm-4h84-2cf3, PR #2521) for current information before making operational decisions.

I review your AI agent and MCP server landscape for open management interfaces and set up an inventory with monitoring for this often-overlooked attack surface.

Inventory of all MCP servers and agent-orchestration tools across your organisation (officially adopted or shadow IT), external reachability testing of their management ports, and a review of default configurations for missing authentication.

Platform operations, not paper advice: I review, harden, and continuously monitor your AI agent infrastructure, including fast-growing, experimental tool landscapes.

About the author