Back to skill

Security audit

OpenClaw Dashboard

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent local monitoring dashboard, but it exposes sensitive OpenClaw data over an unauthenticated server bound to all network interfaces.

Review before installing. Run it only on a trusted local machine, avoid exposing port 3721 to a LAN/VPN/container network, and prefer changing the server to bind to 127.0.0.1 with authentication before using real OpenClaw data. Treat memory files, session replays, logs, and Claude Code usage as sensitive because they may contain secrets or private prompts.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (2)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
server.js:641
Finding

Unauthenticated Network Exposure of Sensitive OpenClaw Data

Content
View full analysis
{ const { agentId, file } = req.params // Security: only allow .jsonl files, no path traversal if (!file.endsWith('.jsonl') || file.includes('/') || file.includes('..')) { return res.status(400).json({ error: 'Invalid file' }) } const filePath = path.join(OC, 'agents', agentId, 'sessions', file) let events = [] try { const content = fs.readFileSync(filePath, 'utf8') events = content.split('\n') .filter(l => l.trim()) .map(l => { try { return JSON.parse(l) } catch { return null } }) .filter(Boolean) .filter(e => !(e.type === 'message' && e.message?.model === 'delivery-mirror')) } catch (err) { return res.status(404).json({ error: err.message }) } res.json(events) }) ``` The log endpoint similarly returns local gateway logs without access control: ```js app.get('/api/log', (req, res) => { try { const content = fs.readFileSync(path.join(OC, 'logs', 'gateway.log'), 'utf8') res.json(content.split('\n').filter(Boolean).slice(-300)) } catch { res.json([]) } }) ``` The server is explicitly exposed on every IPv4 network interface: ```js app.listen(PORT, '0.0.0.0', () => { console.log(`\n🦞 OpenClaw API → http://localhost:${PORT}`) console.log(` Frontend dev → npm run dev (http://localhost:5173)\n`) }) ``` ### Technical Analysis The Express application does not install any authentication or authorization middleware before its `/api` routes. At the same time, `app.listen(..., '0.0.0.0')` makes TCP port 3721 reachable through all availab ...[truncated 2466 chars]
Remediation
View remediation
{ console.log(`OpenClaw API listening on http://${HOST}:${PORT}`) }) ``` 2. Require authentication before every `/api` endpoint. Use a securely generated token, authenticated local session, or trusted reverse proxy rather than a hardcoded credential. 3. Apply authorization checks to agent and session identifiers so users can access only explicitly permitted data. 4. If remote access is intentionally enabled: - Require TLS. - Use a strong authentication mechanism. - Restrict allowed source addresses with a firewall or allowlist. - Set explicit CORS and trusted-host policies. - Place the application behind an authenticated reverse proxy. - Do not rely on obscurity of the port. 5. Redact credential-like values from logs, tool arguments, tool results, conversations, and memory before returning them to the browser. 6. Return only the minimum fields required by each UI component. In particular, avoid returning full memory documents through the general `/api/data` response. 7. Add request rate limits and connection limits, especially for `/api/events`, session replay, and log endpoints. 8. Update the documentation to state exactly which interface is used, whether remote access is supported, and what sensitive information the dashboard exposes. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
server.js:606
Finding

Memory File Path Containment Can Be Bypassed by Prefix Collisions or Symbolic Links

Content
View full analysis
{ const relPath = req.query.path if (!relPath) return res.status(400).json({ error: 'missing path' }) const memRoot = path.join(OC, 'workspace', 'memory') const full = path.join(memRoot, relPath) // Safety: ensure we stay within memRoot if (!full.startsWith(memRoot)) return res.status(403).json({ error: 'forbidden' }) const content = readText(full) if (content === null) return res.status(404).json({ error: 'not found' }) res.json({ content, path: relPath }) }) ``` ### Technical Analysis The endpoint attempts to confine reads to the OpenClaw memory directory by checking whether the constructed path starts with the textual value of `memRoot`. This is a lexical prefix comparison, not a reliable filesystem-boundary check. A sibling directory whose name begins with `memory` can pass the check. For example, if the intended root is: ```text /home/user/.openclaw/workspace/memory ``` a normalized path such as: ```text /home/user/.openclaw/workspace/memory-private/secret.txt ``` also starts with the string `/home/user/.openclaw/workspace/memory`. A request path resembling the following could therefore escape into such a sibling directory: ```text ../memory-private/secret.txt ``` The check also does not resolve symbolic links. If a path beneath the memory directory is a symbolic link to a location outside the directory, `readText()` follows that link and reads the external target even though the lexical path begins with `memRoot`. The endpoint accepts arbitrary query input and does not restrict reads to files that appeared in the server-generated memory index. Its exposure through the unauthenticated, all-interface HTTP server increases exploitability. ### Attack Path #### Prefix-collision ...[truncated 1359 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (34)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The skill is described as a monitoring dashboard, but the detected behavior includes exposing memory files, agent documents, conversation/session history, and live logs through API endpoints. That mismatch is dangerous because users may consent to a UI dashboard without realizing they are also exposing sensitive local data, secrets, internal prompts, or operational logs.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: browserslist==4.28.1 — 2 advisory(ies): CVE-2026-73088 (Browserslist: Uncaught crash / prototype write via untrusted browserslist-stats.); CVE-2026-73089 (Browserslist: Unbounded memory growth (no cache eviction) via distinct query res)

High
Category
Supply Chain
Confidence
84% confidence
Finding

browserslist 4.28.1 is flagged for crashes/prototype write via untrusted browserslist-stats and unbounded memory growth from distinct query resolution. In this repository it is part of the frontend build chain, not the app runtime, so the risk is mainly to developer machines and CI systems. The build-tool context lowers direct customer impact, but this is still a true vulnerability if untrusted stats/config inputs can reach the toolchain.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: lodash==4.17.23 — 2 advisory(ies): CVE-2025-13465 (lodash vulnerable to Prototype Pollution via array path bypass in `_.unset` and ); CVE-2021-23337 (lodash vulnerable to Code Injection via `_.template` imports key names)

High
Category
Supply Chain
Confidence
89% confidence
Finding

lodash 4.17.23 is flagged for prototype pollution and template code-injection issues. In this lockfile it is a transitive dev dependency of concurrently rather than an obvious production dependency, which reduces direct runtime exposure; however, if any tooling path processes attacker-controlled objects or templates, it can still affect developer or CI environments. The issue is therefore real, though less dangerous in this specific dashboard context than if lodash were used in request handling.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: nanoid==3.3.11 — 3 advisory(ies): CVE-2026-67214 (nanoid: non-secure generators can loop indefinitely with negative size); CVE-2026-67213 (nanoid: custom generators can loop indefinitely when size is zero); CVE-2026-73086 (nanoid: Integer Overflow or Wraparound)

High
Category
Supply Chain
Confidence
80% confidence
Finding

nanoid 3.3.11 is reported vulnerable to infinite-loop and integer overflow conditions in non-secure/custom generator edge cases. In this project it is a transitive dev dependency through PostCSS tooling, so risk is concentrated in build environments rather than the deployed app. The context lowers exploitability, but malformed or attacker-influenced build inputs could still trigger denial of service in CI or local builds.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The README advertises direct browsing of ~/.openclaw/ data including agent configs, session files, logs, memory files, and replay history, but does not warn that these artifacts may contain secrets, prompts, credentials, or sensitive operational data. In a dashboard whose core purpose is aggregating and displaying local agent telemetry, lack of a privacy/exposure warning can lead users to expose sensitive data in a browser session, screenshots, demos, or shared environments.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

The README instructs users to run npx clawhub install openclaw-dashboard without pinning a specific package version. This causes execution of whatever package version is current at install time, which creates a supply-chain risk if the package is compromised, replaced, or updated maliciously. Because this is an installation command in documentation, users may execute it directly with little scrutiny.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding

The Chinese README section repeats the same unpinned npx clawhub install openclaw-dashboard installation instruction. This duplicates the same supply-chain exposure for another audience, increasing the likelihood that users will execute an unversioned remote package. Documentation-driven execution is especially risky because it normalizes trust in transient package state.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
83% confidence
Finding

The skill advertises installation and runtime behavior but does not declare any explicit tool scope or permissions, despite detected environment-related capabilities. This makes the trust boundary unclear and can lead users to install or run a skill without understanding what data or host resources it can access.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The feature list mentions memory browsing, session replay, and live logs, but it does not warn users that these features may expose sensitive conversation history, internal agent memory, documents, or secrets. In this context, missing disclosure increases the chance of unsafe deployment and accidental overexposure of highly sensitive local data.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
90% confidence
Finding

Using npx clawhub install openclaw-dashboard without a pinned version allows whatever package version is current at execution time to be fetched and run. This creates a supply-chain risk where a compromised, replaced, or unexpectedly changed package could execute arbitrary code during installation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

Across multiple endpoints, the server exposes agent memory, session history, activity excerpts, cron history, and gateway logs without any visible authentication, authorization, or user consent controls. Because this is a dashboard for OpenClaw agents, the exposed data is inherently sensitive operational content, and binding the server to all interfaces materially increases the chance of unintended access.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The /api/session/:agentId/:file endpoint returns full parsed session events, including raw user and assistant message bodies, which can contain prompts, secrets, credentials, personal data, and internal reasoning artifacts. In a monitoring dashboard context, exposing replay-grade content is broader than necessary telemetry and becomes especially dangerous because the server binds to 0.0.0.0 and there is no authentication or authorization shown anywhere in the file.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The memory browser exposes workspace memory structure and file contents via /api/memory and /api/memory/file, allowing retrieval of arbitrary .md/.txt memory documents under the workspace tree. Those files are likely to contain long-term agent memory, project notes, credentials, strategy, or sensitive user data, and the path check uses startsWith on a joined path, which is not a robust containment check without path normalization/realpath validation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code automatically requests /api/memory and, on selection, /api/memory/file, which exposes workspace memory structure and file contents to the UI. There is no visible notice, comment, or other disclosure explaining that potentially sensitive memory data will be retrieved and displayed.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The function formats times using toLocaleTimeString with a fixed 'en-US' locale, which forces a specific locale policy on all users. This matches the policy-violation category because the file does not offer a locale choice or indicate that the US-specific formatting is required for a justified regional use case.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The root HTML element sets lang="en", which imposes a specific language/locale in the user-facing skill interface. The file does not provide any user opt-in, language selection, or documented justification for restricting the interface to English.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: @babel/core==7.29.0 — 1 advisory(ies): CVE-2026-49356 (@babel/core: Arbitrary File Read via sourceMappingURL Comment)

Low
Category
Supply Chain
Confidence
83% confidence
Finding

@babel/core 7.29.0 is flagged for an arbitrary file read via sourceMappingURL comment. In this lockfile it is a dev dependency pulled in by the Vite/React toolchain, so exposure is mainly during local build or developer workflows rather than the production dashboard runtime. It is still a real supply-chain risk if untrusted code or files are processed during builds.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: baseline-browser-mapping==2.10.0 — 1 advisory(ies): CVE-2026-45819 (baseline-browser-mapping process termination on invalid input causes denial of s)

Low
Category
Supply Chain
Confidence
72% confidence
Finding

baseline-browser-mapping 2.10.0 has a denial-of-service issue on invalid input. Here it is a transitive dev-only dependency of browserslist/autoprefixer tooling, so exploitation would generally require influencing build-time inputs rather than attacking the deployed dashboard directly. That makes the issue real but low-risk in this skill context.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: body-parser==1.20.4 — 1 advisory(ies): CVE-2026-12590 (body-parser vulnerable to denial of service when invalid limit value silently di)

Low
Category
Supply Chain
Confidence
80% confidence
Finding

body-parser 1.20.4 is reported vulnerable to denial of service when an invalid limit value is silently handled unsafely. Because Express is a production dependency in this dashboard, the package is more relevant than build-only tooling, but actual exploitability depends on whether the application sets parser limits from untrusted input or misconfiguration. With only the lockfile, this is best treated as a real but likely limited-risk issue.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: esbuild==0.21.5 — 1 advisory(ies): GHSA-67mh-4wv8-2f99 (esbuild enables any website to send any requests to the development server and r)

Low
Category
Supply Chain
Confidence
86% confidence
Finding

esbuild 0.21.5 has a known issue where websites can interact with the development server in unintended ways. Since esbuild here is a dev dependency used through Vite, the main exposure is when a developer runs the dev server while browsing malicious sites. That makes the finding real, but mostly limited to local development rather than the deployed monitoring dashboard.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 13)May include surrounding context.

json
"server": "node server.js"
  },
  "dependencies": {
    "express": "^4.18.2",
    "react": "^18.3.1",
    "react-dom": "^18.3.1",
    "react-markdown": "^9.0.1",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 14)May include surrounding context.

json
},
  "dependencies": {
    "express": "^4.18.2",
    "react": "^18.3.1",
    "react-dom": "^18.3.1",
    "react-markdown": "^9.0.1",
    "chart.js": "^4.4.3",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 15)May include surrounding context.

json
"dependencies": {
    "express": "^4.18.2",
    "react": "^18.3.1",
    "react-dom": "^18.3.1",
    "react-markdown": "^9.0.1",
    "chart.js": "^4.4.3",
    "react-chartjs-2": "^5.2.0"

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 16)May include surrounding context.

json
"express": "^4.18.2",
    "react": "^18.3.1",
    "react-dom": "^18.3.1",
    "react-markdown": "^9.0.1",
    "chart.js": "^4.4.3",
    "react-chartjs-2": "^5.2.0"
  },

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 17)May include surrounding context.

json
"react": "^18.3.1",
    "react-dom": "^18.3.1",
    "react-markdown": "^9.0.1",
    "chart.js": "^4.4.3",
    "react-chartjs-2": "^5.2.0"
  },
  "devDependencies": {

Static analysis

No suspicious patterns detected.