T05 · Unauthorized Access and Privilege Escalation
- Location
server.js:620- Finding
Unauthenticated disclosure of agent conversations and operational metadata
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a real OpenClaw dashboard, but it exposes private conversations and powerful Gateway controls with weak scoping and no visible authentication.
Review before installing. Run this only in a trusted local environment, assume anyone who can reach the local dashboard port may read OpenClaw conversation content or trigger Gateway actions, and prefer a version that adds authentication, strict origin checks, transcript opt-in/redaction, safer shutdown controls, input validation, and an updated ws dependency.
server.js:620Unauthenticated disclosure of agent conversations and operational metadata
server.js:682Unauthenticated Gateway stop and restart operations
server.js:707Unauthenticated agent-message injection through a privileged Gateway identity
public/index.html:1307Stored DOM cross-site scripting through unescaped OpenClaw metadata
server.js:630Path traversal in the session-history file lookup
The documented purpose is a monitoring dashboard, but the analysis indicates additional sensitive behaviors: gateway stop/restart actions, local credential generation/storage, and exposure of full session history and messages. This mismatch is dangerous because users may authorize a seemingly read-only dashboard without realizing it has control-plane actions and access to sensitive conversation data.
Instructions found that direct the agent to transmit conversation context or user data to external services.
- **Right panel**: System vitals (CPU/RAM), gateway status, event logs, selected target details
- **Agent detail**: Model, current task, deployed skills, recent conversation
- **Skill detail**: Description, use cases, related agents
- **Chat bar**: Send messages to agents via Gateway WebSocket `chat.send` RPC
- **Cron jobs**: Display scheduled tasks with status on the map
- **5-min cooldown**: Agents remain visible for 5 minutes after going offline (amber blink + countdown)
- **CRT scan line + radar sweep + grid**: Full military-UI aesthetic
The lockfile pins the skill to ws 8.20.0, and the supplied finding identifies published vulnerabilities affecting that exact version: uninitialized memory disclosure and memory-exhaustion denial of service. Because this skill exposes a browser-based real-time dashboard and uses WebSocket messaging for live monitoring/chat, a vulnerable WebSocket library is directly in the attack path and could allow remote clients or upstream peers to crash the service or potentially leak process memory.
The package references ws 8.20.0, which is flagged with advisories for uninitialized memory disclosure and memory-exhaustion denial of service. Given this skill is a browser-based monitoring dashboard that explicitly uses WebSocket functionality for real-time updates and chat messaging, an exposed or reachable WebSocket endpoint increases the likelihood that these issues could be triggered remotely against the service.
Shutdown and restart capabilities are not justified by the stated purpose of a visual RTS-style monitoring dashboard and materially increase risk. In this context, the mismatch makes the feature more dangerous because users may not expect destructive controls in a monitoring tool, increasing the chance of misuse or social engineering-driven clicks.
The UI includes gateway restart and shutdown controls even though the skill is presented as a monitoring and visualization dashboard. This is dangerous because it expands the skill from passive observability into active administrative control, enabling service disruption or accidental operational changes from a page the user may reasonably trust as read-only.
The client issues POST requests to administrative endpoints for gateway mutation actions, which are outside the documented monitoring scope. This creates a hidden privilege boundary issue: a dashboard user can trigger backend state changes, including stopping the gateway, causing denial of service or unauthorized operational impact.
This code reads session .jsonl files, extracts recent user and assistant messages, and includes them in the dashboard state returned over HTTP/WebSocket. That goes beyond operational monitoring metadata and exposes potentially sensitive conversation content from other sessions to anyone who can access the dashboard service.
The code collects recent user and assistant messages from session logs and emits them in plain text as part of the live session objects. This is sensitive data disclosure because the dashboard becomes a passive transcript viewer for potentially private prompts, outputs, and embedded secrets.
The service exposes sensitive session content through HTTP/WebSocket interfaces without any visible warning, consent flow, or disclosure that conversation data will be shown. In a monitoring tool, silent exposure of message content increases the likelihood of inadvertent privacy violations and unauthorized observation.
The /api/session-history endpoint returns full chat transcripts by reading raw session logs and serializing user/assistant content back to the client. This creates a direct data-exfiltration path for conversation history that is inconsistent with a dashboard described as a monitoring UI.
By returning complete message transcripts from session log files, the endpoint discloses user-provided content and assistant responses in full. This can leak secrets, personal data, proprietary prompts, or internal operational context to any caller who can access the dashboard.
This endpoint returns complete transcripts without any access warning, consent checkpoint, or narrowing to metadata-only views. That materially increases privacy and confidentiality risk because operators may retrieve full user content from arbitrary sessions with no friction or safeguards.
The POST endpoints can stop or restart the OpenClaw gateway by invoking subprocess commands, with no authentication or authorization checks visible in this server. Any local webpage or script able to reach the service could trigger disruption of the platform's control plane.
Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.
return;
}
phase = 'connected';
// Now send chat message
const sessionKey = sessionId ? `agent:${agent}:${sessionId}` : `agent:${agent}:main`;
const chatId = 'm-' + Date.now();
const idempotencyKey = 'rts-' + Date.now() + '-' + Math.random().toString(36).substring(2, 8);
The primary descriptive content is presented in Chinese, and the README does not indicate that other language options are available. This can violate a language/locale policy when users are not given a choice or warned that the skill documentation is language-specific.
The skill instructs the agent to use environment-dependent behavior and to start services, install packages, and read configuration, but it declares no explicit tool scope or permission boundaries. This increases the chance the skill is invoked with broader-than-necessary capabilities, making unintended filesystem, process, and configuration access more likely.
The invocation guidance is broad enough that common user requests to 'open' or 'launch' a dashboard could trigger package installation, background process creation, and service startup. Overbroad activation raises the risk of the agent taking impactful actions without the user understanding that software will be installed or a persistent service started.
The stop instruction forcefully terminates any process bound to port 4320 without warning, ownership checks, or graceful shutdown. This can kill unrelated processes and cause data loss or service disruption, especially if another application is using that port.
The skill states that it generates and stores device keys locally for authentication but provides no user-facing warning or consent flow. Silent creation of persistent credentials can expand trust relationships and leave sensitive authentication material on disk without the user's informed approval.
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
- On first launch, generates a keypair and saves to `.device-keys.json`
- Signs each `connect.challenge` nonce using v3 protocol
- Gateway token is auto-discovered from `OPENCLAW_GATEWAY_TOKEN` env var or `gateway.auth.token` in `openclaw.json`
- Localhost connections are auto-approved by Gateway (no manual pairing needed)
- **No `dangerouslyDisableDeviceAuth` or `allowInsecureAuth` required**
## Cross-Platform
The document declares lang="zh-CN", and the visible UI text and time formatting are consistently fixed to Chinese/China locale. The policy requires flagging language or locale constraints when they are forced without user opt-in, and this file does not offer any language selection or explain that the skill is region-specific.
The dashboard retrieves and displays session chat history and allows message sending without any visible disclosure about sensitivity, retention, or operator access. This is risky because conversation content may contain secrets or private data, and the UI normalizes access to that content without warning or access-scoping cues.
The gateway control flow performs destructive backend actions with lightweight inline confirmation but no robust safeguard such as re-authentication, typed confirmation, or permission checks visible in the client. That makes accidental or coerced shutdown/restart easier, especially in a tool framed primarily as a dashboard.
The skill generates and persists a device private key used for gateway operator authentication in a local JSON file. While not inherently malicious, storing long-lived operator credentials on disk increases the attack surface: compromise of the dashboard host or file permissions could let an attacker impersonate an operator to the gateway.
Detected: suspicious.dangerous_exec, suspicious.exposed_secret_literal