CVECVE-2026-59726
RufRoot
CVSS10.0 (maximum)
Fixed inRuflo 3.16.3
Root causePort 3001 bound to
0.0.0.0 by default
in docker-compose.yml
What happened
Ruflo is an open-source agent meta-harness for building and running multi-agent AI workflows that uses the Model Context Protocol to connect language models to tools and data sources. The default docker-compose.yml shipped with Ruflo bound the MCP bridge service to 0.0.0.0 on port 3001, exposing it to all network interfaces rather than restricting it to the loopback address 127.0.0.1. The MCP bridge includes a tool called ruflo__terminal_execute that accepts an HTTP POST request to the /mcp endpoint and runs arbitrary commands inside the container. An unauthenticated attacker who could reach port 3001, whether directly or through a misconfigured cloud security group, could send a crafted POST and execute commands with container-level permissions. From there, the attacker could read stored LLM provider API keys, extract conversation history and agent learning-store data, deploy persistent backdoors inside the container, and poison the AgentDB database to manipulate future agent behavior. No authentication was required for any of it. CVE-2026-59726, codenamed RufRoot, carries a CVSS score of 10.0. Ruflo 3.16.3 binds the MCP bridge to the loopback interface by default, restricts terminal execution to configured allowlists, and enables MongoDB authentication. No exploitation in the wild has been confirmed.
Why it matters
Ruflo is one of dozens of agent framework projects that grew quickly alongside the deployment of AI agent systems in 2025 and 2026. Most use MCP or a similar tool-invocation protocol to give agents access to local execution, file systems, and external APIs. The security practices around these frameworks have not kept pace with their adoption. Binding an execution endpoint to all interfaces by default, shipping without authentication, and accepting arbitrary commands from network input are three separate decisions, each of which would be unacceptable in any other networked service. Agent frameworks are networked services. They run with access to API keys, conversation data, and in many deployments file system and code execution permissions. The Ruflo default configuration treated port 3001 as a local development convenience rather than a security boundary. In containerized cloud deployments where port 3001 was inadvertently exposed through a security group or load balancer rule, it was neither.
Don't miss
Ruflo is unlikely to be the only agent framework with this category of problem. The MCP ecosystem has produced dozens of servers, bridges, and harnesses, many maintained by small teams, that expose execution and file-system tools over HTTP without authentication. The pattern is consistent: a developer ships a local development configuration that binds to 0.0.0.0, the project gets adopted in containerized production environments, and the configuration is copied without review. Teams deploying any agent framework or MCP server should explicitly confirm the network binding before putting it in a cloud environment, regardless of what the default documentation implies about its intended use case.
Potential actions
- Update Ruflo to version 3.16.3. This is the only version with the MCP bridge bound to loopback by default, terminal execution restricted, and MongoDB authentication enabled. Confirm the version string in the running container rather than assuming the image tag reflects the docker-compose.yml applied.
- Audit cloud security groups, firewall rules, and load balancer configurations for any Ruflo deployment to confirm port 3001 is not reachable from untrusted networks. A container behind a rule that blocks port 3001 has a different risk profile from one exposed directly, but internal network access from other containers in the same environment is still a meaningful attack path.
- For any Ruflo installation that ran before 3.16.3, rotate all LLM provider API keys stored in the environment. If port 3001 was reachable from any network segment, those keys should be treated as potentially read by an external party.
The Sip
One HTTP POST to port 3001. Command execution, API key access, conversation history, the ability to manipulate future agent behavior. No credentials required because the default config never asked for any. Update to 3.16.3, then check whether that port was reachable before you did.