Skip to the content.

dimensionalOS/dimos - security scan

Repository: dimensionalOS/dimos Commit scanned: abf5152582f3e6d22d4e8cf3a91eb9bc25d795ce Scan date: 2026-07-27 Disclosure status: public — post-only (commercial-backed, secure-by-default, quality gate false)

Summary

Severity Count
Critical 1
High 75
Medium 204
Low 0
Info 0

Total findings: 280 (--min-severity medium) — 0 real after curation

This is the 25th clean scan in the series, and the first to look at an agentic OS for physical robots: dimOS (~3.8k★, Apache-2.0, Dimensional Inc.) lets you command humanoids, quadrupeds, drones, and manipulators in natural language, and build multi-agent systems wired to real cameras, lidar, and actuators. When the thing your code drives is a two-legged robot in a room with people, the question stops being “can an attacker read a file?” and becomes “can an attacker move the arm?” — so that is the question this scan chased.

Top findings

1. The natural-language robot-command server is unauthenticated — but binds loopback by default

2. The lone Critical (chromadb pre-auth RCE) is not reachable — chromadb is embedded, not served

3. Seven XML parsers flagged for XXE are DoS-only — they read local robot descriptions

4. The exec/eval/shell hits are operator-local tools and developer build config

5. The 21-finding SQL cluster is the #1 identifier FP — with a guard

Patterns observed

Secure-by-default is the whole story on the control plane. The scariest thing a robot OS can ship is an unauthenticated way to make hardware move, and dimOS technically ships one — POST /unitree/command has no auth. But the web server, the MCP transport, and the visualizer all resolve their bind address through one config field, global_config.listen_host, which defaults to 127.0.0.1. The scattered 0.0.0.0 literals elsewhere are exactly the surfaces that need LAN reach — teleop from a phone or a Quest headset, drone MAVLink, gstreamer video. The dangerous default is the safe one, and the opt-in-to-expose surfaces are the device-connectivity ones. That is the right shape, and it is the reason a 280-finding report curates to zero.

Reachability, again, does more work than any scanner rank. The single Critical looked alarming — “pre-authentication code execution” on a robot platform — and evaporated the moment you read line 63 of the vector DB: chromadb.Client(), embedded, no server, no endpoint. The same lens flattens the rest of the dependency wall. The transformers RCE is mitigation-shaped: trust_remote_code=True is a default, but the models default to pinned, trusted IDs (microsoft/Florence-2-base, vikhyatk/moondream2) that require it to load their own modeling code. The 11 Pillow CVEs are reachable through the vision stack but are memory-safety DoS on crafted images. The LangSmith SDK CVEs sit behind a transitive dep with no direct import site. None of it is a free kill.

A safety-mature project reads differently. dimOS ships an AI_POLICY.md that opens with “the code here moves real hardware and is operating in production in safety-critical real-world environments,” requires that contributors understand every line of a PR, and mandates simulation/replay testing for anything that produces motion. That posture shows up in the code: data values are bound, identifiers are validated, the risky default is loopback. When the physical-world blast radius is this real, “the maintainers take safety seriously” is not a platitude — it is visible in the diff. The one honest hardening note is the wildcard-CORS-with-credentials pairing on the loopback dev interface; the one honest code change is swapping in defusedxml.

Notes on the tool

Disclosure timeline

Reproduce

GIT_LFS_SKIP_SMUDGE=1 git clone --depth 1 https://github.com/dimensionalOS/dimos /tmp/scan-target
python scanner/run_scan.py --repo /tmp/scan-target --reports-dir ./reports/dimensionalos-dimos --min-severity medium