Back to skill

Security audit

Task Monitor

Security checks for vulnerabilities and agentic risk

Overview

This task monitor is purpose-aligned, but it exposes OpenClaw session and transcript-derived data over an unauthenticated LAN web server.

Install only if you are comfortable exposing OpenClaw activity metadata and prompt-derived task descriptions. Before running it, bind the server to localhost, add authentication or firewall restrictions, disable transcript-derived descriptions, and avoid using the LAN URL on shared or untrusted networks.

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

T05 · Unauthorized Access and Privilege Escalation

Error
Location
server.js:12
Finding

Unauthenticated LAN Exposure of Sensitive Session and Transcript Data

Content
View full analysis
({ ...s, description: getTaskDescription(s.sessionId) })); // Enhance cron sessions with job names const enhancedCrons = cronSessions.map(s => { const jobId = s.key.split(':cron:')[1]; const cronJob = cronJobs.find(j => j.id === jobId); const name = cronJob ? cronJob.name : 'Unknown Job'; if (!cronJob && cronJobs.length > 0) { console.log(`No match for jobId: ${jobId}, available IDs: ${cronJobs.slice(0, 3).map(j => j.id).join(', ')}`); } return { ...s, name: name }; }); return { timestamp: new Date().toISOString(), totalSessions: data.count, main: mainSession, discord: discordSession, subagents: enhancedSubagents, recentCrons: enhancedCrons }; ``` ```javascript app.get('/api/status', async (req, res) => { try { const now = Date.now(); const cacheAge = now - cache.timestamp; if (cache.data && cacheAge < CACHE_TTL_MS) { return res.json({ ...cache.data, cached: true, cacheAge: Math.round(cacheAge / 1000) }); } if (!cache.isRefreshing) { refreshCache(); } if (cache.data) { return res.json({ ...cache.data, cached: true, cacheAge: Math.round(cacheAge / 1000), refreshing: true }); } const data = await fetchStatusData(); cache.data = data; cache.timestamp = Date.now(); res.json({ ...data, cached: false }); } catch (error) { res.status(500).json({ error: error.message, timestamp: new Date().toISOString() }); } }); ``` ```javascript app.listen(PORT, ...[truncated 2542 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
server.js:421
Finding

Stored DOM-Based Cross-Site Scripting Through Unescaped Monitoring Data

Content
View full analysis
0) { const textContent = contentArray.find(c => c.type === 'text'); if (textContent?.text) { const text = textContent.text.substring(0, 100); return text + (textContent.text.length > 100 ? '...' : ''); } } } if (entry.role === 'user' && entry.content) { const text = entry.content.substring(0, 100); return text + (entry.content.length > 100 ? '...' : ''); } ``` The dashboard interpolates that content and other CLI-controlled values into HTML: ```javascript data.subagents.forEach(task => { const age = formatAge(task.ageMs); const status = task.abortedLastRun ? 'Aborted' : 'Running'; html += `
Task ${task.sessionId.substring(0, 8)} ${status}
${task.description}
Model: ${task.model} Age: ${age} Tokens: ${task.totalTokens}
`; }); ``` Cron data is handled in the same unsafe way: ```javascript data.recentCrons.forEach(cron => { const lastRun = new Date(cron.updatedAt).toLocaleString(); const status = cron.abortedLastRun ? 'Error' : 'OK'; const jobName = cron.name || 'Unknown Job'; html += `
${jobName} ${status} ...[truncated 2666 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
server.js:496
Finding

Path Traversal in Transcript File Lookup

Content
View full analysis
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
  • Rogue AgentSelf-Modification, Session Persistence
Findings (21)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The skill reportedly executes local CLI commands, reads session transcript files, and exposes derived metadata over HTTP without declared permissions. This creates a clear confidentiality risk because local operational and conversation data may be published through a network service accessible beyond localhost.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The skill reportedly executes local CLI commands, reads session transcript files, and exposes derived metadata over HTTP without declared permissions. This creates a clear confidentiality risk because local operational and conversation data may be published through a network service accessible beyond localhost.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The skill reportedly executes local CLI commands, reads session transcript files, and exposes derived metadata over HTTP without declared permissions. This creates a clear confidentiality risk because local operational and conversation data may be published through a network service accessible beyond localhost.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill reportedly executes local CLI commands, reads session transcript files, and exposes derived metadata over HTTP without declared permissions. This creates a clear confidentiality risk because local operational and conversation data may be published through a network service accessible beyond localhost.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The server binds to 0.0.0.0 and provides unauthenticated access to internal session, token, model, cron, and task information. In this skill, that exposure is especially dangerous because the API also includes transcript-derived task descriptions, turning a local monitoring tool into a network-accessible information disclosure service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This markdown file includes access instructions for both localhost and a LAN IP, which implies the dashboard may expose session and cron monitoring data to other devices on the network. There is no accompanying warning about privacy, access control, or the risks of making monitoring data reachable beyond the local machine.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README explicitly states the server is accessible on the local network and provides LAN access instructions, but does not warn that anyone on that network may be able to view session/task metadata. For a monitoring dashboard tied to OpenClaw sessions, this can expose operational details, models, task descriptions, and timing information to other users on the same network, especially on shared home, office, or public Wi‑Fi environments.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README advertises a JSON status API and includes example output containing session counts, model names, token usage, session identifiers, descriptions, and cron metadata without warning that this information may be sensitive. Even if this is 'only metadata,' it can leak workload details, internal task names, activity patterns, and partial identifiers that aid reconnaissance or reveal private user activity.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill advertises and appears to require network and environment-adjacent capabilities, yet it declares no explicit tool scope or permissions. That makes its operational boundary ambiguous and weakens user consent, especially for a dashboard that serves data over HTTP and interacts with local system state.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The documentation states the server is accessible on the LAN and exposes an API with session/task details, but it provides no warning about the privacy implications. In this context, monitoring data may include sensitive operational metadata or transcript-derived descriptions, so network exposure substantially increases the blast radius.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The script goes beyond session metadata collection and opens per-session transcript files to extract user message content for display in a dashboard. That creates an unnecessary data exposure path: sensitive prompts or secrets from transcripts can be copied into a broadly accessible markdown file, which is outside the stated monitoring/dashboard purpose.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

Reading the first user message from local transcript files exposes potentially sensitive user input that is not necessary for a real-time task monitor. Because the content is then surfaced in a dashboard, private data from prompts, credentials, internal URLs, or business context may be disclosed to anyone with access to the dashboard file.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The code copies raw user-authored transcript content into DASHBOARD.md without any warning, consent flow, or sanitization. This creates a silent secondary publication channel for potentially confidential text, increasing the chance of accidental disclosure through file sharing, local web serving, backups, or logs.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
65% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/start-server.sh (reported line 23)May include surrounding context.

sh
# Start server in background
echo "Starting Task Monitor Web Server..."
nohup node "$SERVER_SCRIPT" >> "$LOG_FILE" 2>&1 &
echo $! > "$PID_FILE"

echo "Server started with PID $(cat "$PID_FILE")"

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The helper reads local OpenClaw session transcript files and extracts the first user message, then exposes that text through the dashboard. That goes beyond operational status monitoring and can leak sensitive prompts, secrets, internal instructions, or user data to anyone who can access the API/UI.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Session transcript content is surfaced to clients without any warning, consent, or indication that sensitive prompt data may be displayed. This increases the likelihood of accidental disclosure because operators may deploy or share the dashboard thinking it only shows benign runtime status.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The documentation says the legacy generator updates a markdown file in the workspace root, which is a file-modifying action. There is no accompanying warning or disclosure that running the script will overwrite or modify workspace content.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

The dependency is declared with a caret range (^4.22.1), which allows installation of newer compatible 4.x releases instead of a single fixed version. While common in Node projects, this weakens build reproducibility and can unexpectedly pull in a vulnerable or malicious upstream release, which is relevant for a web dashboard exposed over HTTP.

Content

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

json
"dev": "node server.js"
  },
  "dependencies": {
    "express": "^4.22.1"
  },
  "keywords": [
    "monitoring",

Unverifiable Dependency: express has 5 known advisory(ies) (CVE-2024-10491 (Express ressource injection); CVE-2014-6393 (No Charset in Content-Type Header in express); CVE-2024-9266 (Express Open Redirect vulnerability) +2 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

The HTML root element is emitted with lang="en", which forces an English locale choice without any visible user opt-in or configurability. This is a natural-language locale preference embedded in the skill output and may conflict with organizational language-choice policies.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

This code file contains natural-language documentation and runtime messages exclusively in Spanish, such as the header comments and success/error output. Under the policy, forcing a specific language without user opt-in can be a locale-policy violation when no justification or language choice is provided.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec, suspicious.env_credential_access

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/generate-dashboard.js:9

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
server.js:499