This release includes 1 security fix for security teams reviewing exposed deployments.
Topics
+14 more
Affected surfaces
Summary
AI summaryUpdates What's fixed in 3.16.3, Verification, and https://github.com/ruvnet/ruflo/security/advisories/GHSA-c4hm-4h84-2cf3 across a mixed release.
Full changelog
🔒 Security release
Advisory: GHSA-c4hm-4h84-2cf3 — CVSS 9.8 critical
ADR: ADR-166: MCP Bridge Unauthenticated RCE — Coordinated Disclosure Remediation
What was vulnerable
The MCP bridge shipping in ruflo/docker-compose.yml exposed POST /mcp with no authentication. The docker-compose defaults bound the bridge and MongoDB to all interfaces. Combined, an unauthenticated network attacker could invoke tools/call → terminal_execute inside the bridge container, obtain a shell, read every provider API key from the container env, spawn attacker-controlled swarms on the victim's keys, and persist a poisoned pattern into the AgentDB learning store that steers future AI outputs.
What's fixed in 3.16.3
- MCP bridge binds
127.0.0.1by default. Public bind requiresMCP_AUTH_TOKENor the process exits ≠0 at boot with a FATAL message. - Bearer auth middleware with
timingSafeEqualconstant-time compare. - Server-side
executeToolgate forterminal_execute(opt-in viaMCP_ENABLE_TERMINAL=true) — enforced identically on/mcp,/mcp/:group, and autopilot. This was the missing link that made the disclosed RCE chain reach shell. docker-compose.yml:read_onlybridge rootfs, MongoDB--authon by default,MONGO_INITDB_ROOT_PASSWORDrequired to boot.- CORS allowlist wiring via
MCP_CORS_ORIGIN. - Static + runtime regression locks (12/12 static, 12/12 runtime green) + CI workflow.
⚠️ Operators of any exposed instance MUST
- Firewall
:3001and:27017immediately if you were running the previous default docker-compose on a public IP. - Rotate
OPENAI,GOOGLE,OPENROUTER,ANTHROPICkeys. - Audit the AgentDB pattern store for injected
agentdb_pattern-storeentries and purge them. A patched redeploy alone does NOT undo the AI-supply-chain poisoning vector. - Audit MongoDB for tampering.
Breaking change (correct one, for security)
docker-compose.yml now refuses to start without MONGO_INITDB_ROOT_PASSWORD. Generate one:
echo "MONGO_INITDB_ROOT_PASSWORD=$(openssl rand -base64 32)" >> .env
For the optional public-bind deployment pattern, additionally:
echo "MCP_BIND_HOST=0.0.0.0" >> .env
echo "MCP_AUTH_TOKEN=$(openssl rand -base64 32)" >> .env
docker compose -f docker-compose.yml -f docker-compose.public.yml up -d
Credit
Coordinated disclosure by an external security researcher (name to be published with the CVE) and Dragan Spiridonov (ADR-166 co-author). The end-to-end 8-step PoC drove the choice to bind loopback by default rather than paper over with token-only auth — thank you.
Verification
@claude-flow/[email protected]—npm view @claude-flow/cli@latest version→ 3.16.3[email protected]—npm view claude-flow@latest version→ 3.16.3[email protected]—npm view ruflo@latest version→ 3.16.3- All three dist-tags (
latest,alpha,v3alpha) point at 3.16.3
🤖 Generated with RuFlo
Breaking Changes
- docker‑compose.yml now refuses to start without MONGO_INITDB_ROOT_PASSWORD set
- MCP bridge binds 127.0.0.1 by default; public bind requires MCP_AUTH_TOKEN or the process exits with a FATAL message
Security Fixes
- GHSA-c4hm-4h84-2cf3 — Unauthenticated RCE in MCP bridge fixed; now requires MONGO_INITDB_ROOT_PASSWORD, binds localhost only, adds bearer auth with timing‑safe comparison, enforces executeTool gate and read‑only rootfs
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
Related context
Related tools
Beta — feedback welcome: [email protected]