Skip to the content.

EverMind-AI/Raven — security scan

Repository: EverMind-AI/Raven Commit scanned: 668348301df9 Scan date: 2026-07-23 Disclosure status: public (post-only — clean scan, strict-norm repo)

Summary

Severity Count
Critical 0
High 25
Medium 62
Low 0
Info 0

Total findings: 87 (0 real after curation) — 21st clean scan

Raven is a memory-first, self-improving agent harness (2.5k★, Apache-2.0, built on EverOS with MiroThinker deep research). It is ~73% Python: a gateway that runs agent turns, a tool layer (shell exec, web fetch, media gen, MCP client), a plugin/provider/channel registry system, an “evolver” that mutates and re-benchmarks harness variants, and a TUI. For an agent harness the two questions that decide everything are (1) can an untrusted party drive the agent over the network? and (2) is the web-fetch surface an open SSRF? — and Raven answers both well.

Top findings (all resolved to non-issues)

1. Three MCP Python SDK server-transport CVEs — not reachable (client, not server)

2. Web-fetch SSRF — defended, and defended well

3. Gateway binds 0.0.0.0 — the default is unused; the real bind is loopback

4. Shipped eval() in the evolver policy gate — false positive (param name)

5. tarfile.extractall() without filter='data' — benchmark tier, self-produced tars

Patterns observed

The reachability question cut the 25 highs to zero. Beyond the MCP client/server split (§1), the two run-shell-injection highs in release.yml interpolate $ into run: — but the workflow triggers only on push: tags: v* and workflow_dispatch, both privileged (a fork PR can’t push a tag), so the tag name is maintainer-set, not attacker-controlled — the same trigger-context lesson as openmed and nexent. The two python37-compatibility highs are a compat lint, not security. The one JS detect-child-process high is an execFileNoThrow wrapper (argv, no shell) in the TUI.

The medium tier is the usual scanner-noise census. The 14 JavaScript path-join-resolve-traversal hits all land in raven/tracing/viewer/*.js — a localhost tracing viewer dev tool — plus the WhatsApp bridge. The five non-literal-import hits are the plugin / provider / channel / evolver-launch registries — dynamic import by design, keyed on internal registry names, the datachain mod-loader pattern. The three dynamic-urllib hits are an operator-configured embedding endpoint (knn_router.py, embedding_endpoint config — not an attacker URL), a localhost tracing probe, and a benchmark. The three sha1 hits are cache keys and content hashes (hashlib.sha1(f"{url}|{path}")[:16] → a filename), not crypto. The 18 github-actions-mutable-action-tag are CI supply-chain lint. Every single medium resolves to FP, by-design, or CI hygiene.

What the maintainers do well is the network boundary. Raven is a pre-alpha agent harness with shell-exec and filesystem tools — exactly the kind of project where an SSRF hole or an unauthenticated network listener would be catastrophic. Instead there’s a dedicated raven/security/network.py (ported from nanobot, MIT-credited) with a metadata-blocking allowlist wired into web_fetch, a redirect-revalidating variant used by the DingTalk adapter, a health endpoint pinned to loopback, and TUI↔gateway traffic kept on local FIFOs. web_fetch even routes through Jina Reader (server-side fetch) and validates the target first — defense in depth. For a fast-moving pre-alpha, that’s a notably deliberate posture.

The one genuine residual is a dependency refresh, all reachability-gated or opt-in: Pillow (11 memory-safety/DoS CVEs, reachable via multimodal image handling — the perennial treadmill, à la SwanLab), mistune (DoS + XSS, reached only through the opt-in Matrix channel’s markdown→HTML formatter, channels/adapters/matrix/content.py — DoS there is self-inflicted on the agent’s own output, XSS is downstream-sanitized by Matrix clients), plus json_repair, lxml_html_clean, protobufjs, and setuptools tails. Pin/bump hardening, not a filing — and the repo asks for private vulnerability reporting anyway (see disclosure note).

Notes on the tool

Disclosure timeline

Reproduce

git clone https://github.com/EverMind-AI/Raven /tmp/scan-target
python scanner/run_scan.py --repo /tmp/scan-target --reports-dir ./reports/evermind-ai-raven --min-severity medium