Skip to the content.

openagents-org/openagents - security scan

Repository: openagents-org/openagents Commit scanned: bf32ccbda43b1535ef650df42ee908d8a9961d75 Scan date: 2026-06-30 Disclosure status: public — post-only (no real, high-confidence first-party item cleared the bar; no upstream issue filed)

Summary

Severity Count
Critical 8
High 251
Medium 421
Low 0 (filtered at --min-severity medium)
Info 0

Total findings: 680 — and the count is the story: it almost entirely describes the JavaScript/TypeScript frontends, not the Python agent-network core.

OpenAgents is an “AI Agent Networks” platform — a Python SDK + relay/transport layer for connecting agents across machines into shared workspaces, plus an Electron launcher, a web studio, and a Go web component. It’s a real monorepo: sdk/ (Python core), packages/agent-connector + packages/launcher (Node/TS), workspace/frontend + sdk/studio + packages/go/web (web frontends).

At 680 findings this looks like the heaviest scan in the series. It isn’t — it’s the harbor pattern again: once you split first-party Python from the bundled frontends, the scary numbers all live in node_modules-shaped lockfiles and JS lint, and the Python agent core is modest and largely by-design.

Top findings

1. All 8 criticals are npm frontend lockfiles

2. The Python agent-network core is modest and mostly by-design

3. The cleartext-WebSocket finding is mostly already mitigated

4. Secret hits: Firebase web keys (public by design) + a test-workspace token

Patterns observed

The monorepo ownership split decides everything here. This is the third scan in the series (after harbor and Kiln) where the headline count is an artifact of bundled frontends. 680 findings: the 8 criticals are npm, ~360 trivy rows are npm across five web/Node lockfiles, and the ~300 semgrep hits are overwhelmingly js-* rules in packages/agent-connector (43 ERRORs alone), packages/launcher, and the web frontends. The first-party Python agent network — the thing a security review of “OpenAgents” should actually care about — contributes a couple dozen findings, and they curate to by-design (local subprocess, local mod loading) or FP (compat lint, logger-disclosure).

The transport story is the reachability lesson in miniature. A flat reading says “insecure WebSocket — agents talk in cleartext.” The code says the default relay is wss:// and the HTTP transport upgrades https→wss; only a secondary direct-peer path hardcodes ws://. Same rule hit, very different conclusion once you read which transport is the default and which is the fallback. The maintainers already reached for TLS where it counts.

Firebase keys are not secrets. Two of the 17 gitleaks hits are Firebase web config, which is meant to ship in the client bundle. Treating them as leaked credentials would be the kind of false alarm that erodes trust in a report. The genuine items reduce to one test-workspace token, which is test-scope.

This is not strict-norm (no SECURITY.md, no commercial backing), so a real first-party finding would have earned a focused courtesy issue. There wasn’t one: the criticals are frontend dependency drift on a repo that already runs Dependabot, and the Python core’s scariest-looking finding is already mitigated in its default path. Post-only is the honest call.

Notes on the tool

Disclosure timeline

This is a post-only write-up. After the ownership split, no real, reachable, undefended first-party item cleared the quality gate: the criticals are frontend npm drift (Dependabot is active), the Python core is by-design or FP, the WebSocket finding is mitigated in its default path, and the secret hits are public Firebase keys plus one test-scope token.

Reproduce

git clone https://github.com/openagents-org/openagents /tmp/scan-target
python scanner/run_scan.py --repo /tmp/scan-target \
  --reports-dir ./reports/openagents-org-openagents \
  --min-severity medium --ignore-samples