Back to skill

Security audit

Openclaw Pixel Agents Dashboard

Security checks for vulnerabilities and agentic risk

Overview

This is a real dashboard with relevant features, but it exposes powerful controls and agent conversation data over unauthenticated network services.

Install only in a trusted local environment, bind it to localhost or put it behind authentication before use, avoid exposing port 5070 to a network, prefer SSH keys over passwords, and update vulnerable dependencies before relying on it for real deployments.

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 (5)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
server/index.ts:215
Finding

Unauthenticated privileged management API exposed on all network interfaces

Content
View full analysis
{ console.log('[UPDATE] OpenClaw update triggered'); try { const result = runUpdate(); res.json(result); } catch { res.status(500).json({ error: 'Update failed' }); } }); app.post('/api/restart/:id', (req, res) => { const { id } = req.params; const gatewayId = id === 'earl' ? 'earl-gateway' : id === 'solara' ? 'solara-gateway' : null; if (!gatewayId) { res.status(400).json({ error: 'Unknown gateway. Use earl or solara.' }); return; } console.log(`[RESTART] Gateway restart triggered: ${id}`); const result = restartService(gatewayId); if (result.success) { res.json({ ok: true, message: `${id} gateway restarting` }); } else { res.status(500).json({ error: result.error }); } }); app.post('/api/services/:id/:action', (req, res) => { const { id, action } = req.params; if (action !== 'start' && action !== 'stop') { res.status(400).json({ error: 'Invalid action. Use start or stop.' }); return; } const result = controlService(id, action); if (result.success) { res.json({ ok: true }); } else { res.status(500).json({ error: result.error }); } }); app.post('/api/spawn', async (req, res) => { const { agent, task } = req.body; try { const session = await spawner.spawn(agent, task); res.json({ ok: true, id: session.id, agent: session.agent, sessionKey: session.sessionKey, }); } catch (err) { const status = (err as Error).message.includes('Max concurrent') ? 429 : 400; res.status(status).json({ ok: false, error: (err as Error).message }); } }); server.listen(SERVER_PORT, '0.0.0.0', () => { console.log(`\n🎮 Pixel Agents Dashboard running at http://lo ...[truncated 2591 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
server/index.ts:69
Finding

Unauthenticated WebSocket and REST disclosure of agent conversations and operational activity

Content
View full analysis
(); function broadcast(event: DashboardEvent): void { const data = JSON.stringify(event); for (const client of clients) { if (client.readyState === WebSocket.OPEN) { client.send(data); } } } wss.on('connection', (ws) => { console.log('[WS] Client connected'); clients.add(ws); const agentStates = watcher.getAgentStates(); ws.send(JSON.stringify({ type: 'init', features: FEATURES, spawnable: SPAWNABLE_AGENTS, agents: agentStates.map(s => ({ id: s.id, name: s.config.displayName, emoji: s.config.emoji, palette: s.config.palette, hueShift: s.config.hueShift, alwaysPresent: s.config.alwaysPresent, isActive: s.isActive, isStalled: s.isStalled, currentTask: s.currentTask, channel: s.channel, lastChatMessage: s.lastChatMessage, tools: s.tools, })), })); }); app.get('/api/spawn', (_req, res) => { res.json({ ok: true, sessions: spawner.listSessions() }); }); ``` The parser places conversation content into broadcast events: ```ts if (chatText.length > 0 && chatText !== 'NO_REPLY' && chatText !== 'HEARTBEAT_OK' && chatText !== 'ANNOUNCE_SKIP' && chatText !== 'REPLY_SKIP') { state.lastChatMessage = chatText.length > 2000 ? chatText.slice(0, 1997) + '...' : chatText; events.push({ type: 'agentChat', id: agentId, message: state.lastChatMessage }); break; } ``` ```ts if (taskText) { state.currentTask = taskText; events.push({ type: 'agentTask', id: agentId, task: taskText }); } ``` ```ts if (toolName === 'sessions_spawn') { const args = block.arguments || {}; const label = ( ...[truncated 2178 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
server/setupWizard.ts:42
Finding

First-run setup interface permits SSRF and unauthenticated configuration takeover

Content
View full analysis
{ try { const res = await fetch(`${url}/v1/models`, { signal: AbortSignal.timeout(3000), }); return res.ok || res.status === 401; } catch { return false; } } export function serveSetupWizard(app: Express, server: Server, port: number): void { const discovered = discoverAgents(); app.get('/api/setup/discover', (_req, res) => { res.json({ agents: discovered }); }); app.get('/api/setup/check-gateway', async (req, res) => { const url = (req.query.url as string) || 'http://localhost:18789'; const reachable = await checkGateway(url); res.json({ url, reachable }); }); app.post('/api/setup/save', (req, res) => { const config = req.body; if (!config || !config.agents || config.agents.length === 0) { res.status(400).json({ error: 'At least one agent is required' }); return; } const configPath = path.resolve(CONFIG_FILENAME); try { fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); console.log(`[Setup] Config written to ${configPath}`); res.json({ ok: true, path: configPath }); setTimeout(() => { console.log('[Setup] Restarting server with new config...'); process.exit(0); }, 1000); } catch (err) { res.status(500).json({ error: `Failed to write config: ${(err as Error).message}` }); } }); server.listen(port, '0.0.0.0', () => { console.log(`\n🧙 Pixel Agents Setup Wizard running at http://localhost:${port}`); }); } ``` The saved gateway configuration is later used with the gateway credential: ```ts const response = await fetch(`${GATEWAY_URL}/tools/invoke`, { method: 'POST', headers: { 'Content-Type': 'applica ...[truncated 2678 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
server/services.ts:60
Finding

Remote-agent configuration is interpolated into shell commands

Content
View full analysis
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
server/version.ts:50
Finding

Unauthenticated endpoints trigger unpinned global package updates locally and remotely

Content
View full analysis
&1', 120_000); solaraCachedVersion = null; solaraLastCheckMs = 0; return { success: true, output }; } catch (err) { const error = err as { stderr?: string; message?: string }; return { success: false, output: error.stderr || error.message || 'Remote update failed' }; } } ``` The update functions are directly exposed by routes without access control: ```ts app.post('/api/update', (_req, res) => { console.log('[UPDATE] OpenClaw update triggered'); try { const result = runUpdate(); res.json(result); } catch { res.status(500).json({ error: 'Update failed' }); } }); app.post('/api/update/solara', (_req, res) => { console.log('[UPDATE] Solara OpenClaw update triggered'); try { const result = runSolaraUpdate(); res.json(result); } catch { res.status(500).json({ error: 'Solara update failed' }); } }); ``` ### Technical Analysis The web server allows callers to trigger `npm update -g openclaw` locally and over SSH. The update target is not pinned to an administrator-approved version, ...[truncated 1720 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (94)

Known Vulnerable Dependency: shell-quote==1.8.3 — 2 advisory(ies): CVE-2026-13311 (shell-quote: Quadratic-complexity Denial of Service in `parse()` (CWE-407)); CVE-2026-9277 (shell-quote quote() does not escape newlines in object .op values)

Critical
Category
Supply Chain
Confidence
90% confidence
Finding

shell-quote is present only as a development dependency through concurrently, and its issues affect parsing/quoting shell fragments. Although one advisory is marked critical, this lockfile does not show the package being used in production request handling; risk is primarily to local scripts or CI if attacker-controlled strings are interpolated into shell commands.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The gap between a benign-sounding dashboard description and behavior such as execSync, npm updates, SSH/sshpass use, and remote administrative updates is security-significant. These capabilities enable code execution and privileged changes on local or remote systems, and misleading packaging can cause operators to grant access they would not otherwise approve.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The gap between a benign-sounding dashboard description and behavior such as execSync, npm updates, SSH/sshpass use, and remote administrative updates is security-significant. These capabilities enable code execution and privileged changes on local or remote systems, and misleading packaging can cause operators to grant access they would not otherwise approve.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The gap between a benign-sounding dashboard description and behavior such as execSync, npm updates, SSH/sshpass use, and remote administrative updates is security-significant. These capabilities enable code execution and privileged changes on local or remote systems, and misleading packaging can cause operators to grant access they would not otherwise approve.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The gap between a benign-sounding dashboard description and behavior such as execSync, npm updates, SSH/sshpass use, and remote administrative updates is security-significant. These capabilities enable code execution and privileged changes on local or remote systems, and misleading packaging can cause operators to grant access they would not otherwise approve.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The gap between a benign-sounding dashboard description and behavior such as execSync, npm updates, SSH/sshpass use, and remote administrative updates is security-significant. These capabilities enable code execution and privileged changes on local or remote systems, and misleading packaging can cause operators to grant access they would not otherwise approve.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The gap between a benign-sounding dashboard description and behavior such as execSync, npm updates, SSH/sshpass use, and remote administrative updates is security-significant. These capabilities enable code execution and privileged changes on local or remote systems, and misleading packaging can cause operators to grant access they would not otherwise approve.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

The gap between a benign-sounding dashboard description and behavior such as execSync, npm updates, SSH/sshpass use, and remote administrative updates is security-significant. These capabilities enable code execution and privileged changes on local or remote systems, and misleading packaging can cause operators to grant access they would not otherwise approve.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

The gap between a benign-sounding dashboard description and behavior such as execSync, npm updates, SSH/sshpass use, and remote administrative updates is security-significant. These capabilities enable code execution and privileged changes on local or remote systems, and misleading packaging can cause operators to grant access they would not otherwise approve.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The gap between a benign-sounding dashboard description and behavior such as execSync, npm updates, SSH/sshpass use, and remote administrative updates is security-significant. These capabilities enable code execution and privileged changes on local or remote systems, and misleading packaging can cause operators to grant access they would not otherwise approve.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The gap between a benign-sounding dashboard description and behavior such as execSync, npm updates, SSH/sshpass use, and remote administrative updates is security-significant. These capabilities enable code execution and privileged changes on local or remote systems, and misleading packaging can cause operators to grant access they would not otherwise approve.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The gap between a benign-sounding dashboard description and behavior such as execSync, npm updates, SSH/sshpass use, and remote administrative updates is security-significant. These capabilities enable code execution and privileged changes on local or remote systems, and misleading packaging can cause operators to grant access they would not otherwise approve.

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
80% confidence
Finding

browserslist is only a development dependency path here, but the advisories include crash/prototype write and unbounded memory growth on untrusted stats/query inputs. In this skill context that mainly threatens developer machines or CI pipelines, not the live dashboard, unless untrusted project metadata is processed automatically.

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 appears here as a dev dependency through PostCSS, and the listed issues are denial-of-service style failures around malformed size inputs or overflow. Those are real defects, but in this skill they are most likely to affect build-time tooling rather than the deployed dashboard unless untrusted build inputs are processed.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: path-to-regexp==8.3.0 — 2 advisory(ies): CVE-2026-4923 (path-to-regexp vulnerable to Regular Expression Denial of Service via multiple w); CVE-2026-4926 (path-to-regexp vulnerable to Denial of Service via sequential optional groups)

High
Category
Supply Chain
Confidence
86% confidence
Finding

path-to-regexp is in the Express/router runtime path, and the advisories describe ReDoS/DoS conditions triggered by crafted route patterns or matching behavior. In a dashboard service with HTTP routes, this can impact availability if attacker-controlled paths interact with vulnerable matching logic, though exploitability depends on how routes are defined in application code.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: picomatch==4.0.3 — 2 advisory(ies): CVE-2026-33672 (Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Mat); CVE-2026-33671 (Picomatch has a ReDoS vulnerability via extglob quantifiers)

High
Category
Supply Chain
Confidence
80% confidence
Finding

picomatch is a dev-tool dependency used by Vite/globbing, and the advisories include incorrect glob matching and ReDoS with crafted patterns. This is real, but in this repository it likely affects file watching/build behavior rather than production runtime, unless the app accepts user-supplied glob patterns somewhere else not visible here.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: postcss==8.5.8 — 4 advisory(ies): CVE-2026-45623 (PostCSS: Arbitrary file read and information disclosure via attacker-controlled ); CVE-2026-69153 (PostCSS: incomplete fix of GHSA-6g55-p6wh-862q — attacker-controlled sourceMappi); CVE-2026-41305 (PostCSS has XSS via Unescaped </style> in its CSS Stringify Output) +1 more

High
Category
Supply Chain
Confidence
80% confidence
Finding

PostCSS is a dev dependency in the frontend toolchain, and the advisories include arbitrary file read, source map abuse, and XSS in generated style output. These are meaningful if untrusted CSS or sourcemap content is processed during builds or previews, but the lockfile alone does not show direct runtime exposure to end users.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: vite==7.3.1 — 5 advisory(ies): CVE-2026-39365 (Vite Vulnerable to Path Traversal in Optimized Deps `.map` Handling); CVE-2026-53571 (vite: `server.fs.deny` bypass on Windows alternate paths); CVE-2026-39363 (Vite Vulnerable to Arbitrary File Read via Vite Dev Server WebSocket) +2 more

High
Category
Supply Chain
Confidence
87% confidence
Finding

Vite is a development dependency, but its advisories include path traversal and arbitrary file read via dev-server features, which are serious if the dev server is reachable by others. Given this skill is a real-time dashboard likely developed and tested with live local networking, exposed dev instances could leak local files or project data.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: ws==8.19.0 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
88% confidence
Finding

ws is a direct production dependency and highly relevant for a real-time dashboard that likely relies on WebSockets for live agent activity. The cited memory disclosure and memory exhaustion issues could allow remote attackers to leak data or degrade/kill the service through crafted WebSocket traffic, making this more dangerous in this skill context than a typical dormant dependency.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: ws==8.19.0 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
89% confidence
Finding

The project depends on ws, and the finding indicates resolution to ws==8.19.0, a version with published advisories including memory disclosure and memory exhaustion DoS. This is especially relevant for a real-time dashboard that likely exposes WebSocket functionality, because remote clients may be able to trigger denial of service or potentially leak process memory through network interaction.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: vite==7.3.1 — 5 advisory(ies): CVE-2026-39365 (Vite Vulnerable to Path Traversal in Optimized Deps `.map` Handling); CVE-2026-53571 (vite: `server.fs.deny` bypass on Windows alternate paths); CVE-2026-39363 (Vite Vulnerable to Arbitrary File Read via Vite Dev Server WebSocket) +2 more

High
Category
Supply Chain
Confidence
91% confidence
Finding

The manifest includes vite, and the finding reports resolution to vite==7.3.1 with multiple advisories including path traversal, file read, and dev-server-related bypass issues. In the context of an ops dashboard, developers may run the dev server locally or in shared/internal environments, making these issues more dangerous because they can expose source files, configuration, or host filesystem contents during development or preview use.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The code constructs and executes shell commands for SSH access using interpolated values from configuration, including user, host, key path, password, and remote command text. This creates both local shell-injection risk and a dangerous remote command-execution capability that is disproportionate to the stated dashboard purpose.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The password-based path passes credentials to sshpass on the command line, which can expose secrets via process listings, logs, crash reports, or other local inspection mechanisms. It also normalizes storing reusable remote credentials inside application configuration, increasing the blast radius if the service is compromised.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The module builds SSH command lines and executes them with execSync, including remote update operations and use of stored passwords. Because remote.user, remote.host, remote.password, and the embedded remote command are interpolated directly into shell strings, any compromise or unsafe configuration of those values can lead to local shell injection, credential exposure, or unauthorized remote code execution. In a real-time ops dashboard, embedding remote administration and update capability in a version-check component significantly increases the blast radius.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The markdown advertises a breaker panel to start, stop, and restart gateway services, which can affect system availability and running workloads. The description provides no user-facing caution about operational impact, interruption risk, or the need to ensure the user intends to control live services.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
bin/pixel-agents.cjs:24

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
server/hardware.ts:69

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
server/services.ts:82

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
server/version.ts:29