Back to skill

Security audit

Command Center 1.4.1

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a legitimate OpenClaw dashboard, but its default server behavior can expose sensitive local agent activity without authentication.

Install only if you are comfortable with a local dashboard reading OpenClaw sessions, transcript excerpts, operator identities, memory metadata, vitals, and job state. Before running it, bind it explicitly to loopback, enable authentication, avoid exposing port 3333 to LAN/VPN/public networks, and be cautious with the unpinned npx installer.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (5)

T09 · Insecure Skill Coding Practices

Error
Location
src/index.js:248
Finding

Unauthenticated Dashboard Listens on All Network Interfaces

Content
View full analysis
{ // CORS headers res.setHeader("Access-Control-Allow-Origin", "*"); const urlParts = req.url.split("?"); const pathname = urlParts[0]; const query = new URLSearchParams(urlParts[1] || ""); // Fast path for health check if (pathname === "/api/health") { res.writeHead(200, { "Content-Type": "application/json" }); res.end(JSON.stringify({ status: "ok", port: PORT, timestamp: new Date().toISOString() })); return; } // Auth check (unless public path) const isPublicPath = AUTH_CONFIG.publicPaths.some( (p) => pathname === p || pathname.startsWith(p + "/"), ); if (!isPublicPath && AUTH_CONFIG.mode !== "none") { const authResult = checkAuth(req, AUTH_CONFIG); if (!authResult.authorized) { console.log(`[AUTH] Denied: ${authResult.reason} (path: ${pathname})`); res.writeHead(403, { "Content-Type": "text/html" }); res.end(getUnauthorizedPage(authResult.reason, authResult.user, AUTH_CONFIG)); return; } req.authUser = authResult.user; } ``` ```js // src/index.js:430-434 } else if (pathname === "/api/state") { const fullState = state.getFullState(); res.writeHead(200, { " ...[truncated 4035 chars]
Remediation
View remediation
{ // startup logging }); ``` 2. Default to an unambiguous loopback address such as `127.0.0.1`. 3. Refuse startup when authentication is `none` and the configured address is non-loopback. 4. Require authentication for all sensitive and state-changing API routes. 5. Change CORS from `*` to an explicit allowlist or omit CORS entirely for a same-origin dashboard. 6. Add Origin validation and CSRF protection to mutation endpoints. 7. Emit startup logs showing the actual bound address rather than always displaying a localhost URL. 8. Add automated tests that verify the default listener is unreachable through non-loopback interfaces. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
src/auth.js:35
Finding

Spoofable Proxy Identity and Client IP Authentication

Content
View full analysis
{ if (allowed === "*") return true; if (allowed === login) return true; if (allowed.startsWith("*@")) { const domain = allowed.slice(2); return login.endsWith("@" + domain); } return false; }); if (isAllowed) { return { authorized: true, user: { type: "tailscale", login, name, pic } }; } return { authorized: false, reason: `User ${login} not in allowlist`, user: { login } }; } ``` ```js // src/auth.js:57-72 if (mode === "cloudflare") { const email = (req.headers[AUTH_HEADERS.cloudflare.email] || "").toLowerCase(); if (!email) { return { authorized: false, reason: "Not accessed via Cloudflare Access" }; } const isAllowed = authConfig.allowedUsers.some((allowed) => { if (allowed === "*") return true; if (allowed === email) return true; if (allowed.startsWith("*@")) { const domain = allowed.slice(2); return email.endsWith("@" + domain); } return false; }); if (isAllowed) { return { authorized: true, user: { type: "cloudflare", email } }; } return { authorized: false, reason: `User ${email} not in allowlist`, user: { email } }; } ``` ```js // src/auth.js:77-90 if (mode === "allowlist") { const clientIP = req.headers["x-forwarded-for"]?.split(",")[0]?.trim() || req.socket?.remoteAddress || ""; const isAllowed = auth ...[truncated 2278 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
src/cerebro.js:170
Finding

Directory Traversal in Cerebro Topic Status Updates

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
src/auth.js:95
Finding

Reflected HTML Injection in Authentication Error Responses

Content
View full analysis
Detected: ${user.login || user.email || user.ip || "unknown"}` : ""; return ` Access Denied - Command Center ``` ```js // src/auth.js:137-144
🔐

Access Denied

${reason}
${userInfo}

This dashboard requires authentication via ${authConfig.mode}.

``` ### Technical Analysis The authentication module derives `login`, `email`, and client IP values from HTTP request headers. When authorization fails, these values are included in both the `reason` string and the `userInfo` fragment. `getUnauthorizedPage` inserts these values directly into an HTML document without entity encoding. Consequently, values containing HTML markup can break out of the intended text context. Because the response is served as `text/html`, a browser can interpret attacker-supplied tags or event handlers. Exploitation in a normal browser requires a delivery mechanism capable of setting the relevant custom header, such as a malicious client, controllable reverse proxy, extension, middleware, or crafted environment. The injec ...[truncated 1125 chars]
Remediation
View remediation
", ">") .replaceAll('"', """) .replaceAll("'", "'"); } ``` 4. Apply encoding separately to `reason`, identity values, and configuration values before interpolation. 5. Prefer a JSON error for API routes instead of returning an HTML page. 6. Add a restrictive Content Security Policy that disallows inline scripts and event handlers. 7. Add tests using payloads containing tags, quotes, event handlers, and encoded markup. ]]>

T08 · Insecure Dependencies

Warning
Location
SKILL.md:20
Finding

Installation Instructions Execute a Mutable Latest Package Version

Content
View full analysis
Remediation
View remediation
install command-center ``` 2. Document the expected package publisher and registry. 3. Provide integrity or signature verification instructions where supported. 4. Recommend inspecting the package metadata and provenance before execution. 5. Avoid mutable tags such as `latest` in security-sensitive installation documentation. 6. Use lockfiles and reproducible installation procedures for all runtime dependencies. 7. Consider distributing a verified installer artifact with checksums or signed releases. ]]>
Vulnerability Patterns
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • 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
Findings (137)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Scanning transcripts to identify human operators and extracting Slack, Telegram, and Discord identifiers creates a clear privacy risk that exceeds normal dashboard expectations. Persisting that identity metadata and refreshing it periodically compounds the impact by creating an ongoing local directory of people and communications-derived identifiers.

Content

No source excerpt is available for this finding.