Back to skill

Security audit

Openclaw Skill Observability

Security checks for vulnerabilities and agentic risk

Overview

This observability skill is mostly coherent, but it can return raw local gateway logs and session details through chat without redaction or clear disclosure of that data exposure.

Review this skill before installing if your OpenClaw gateway logs or session titles may contain prompts, identifiers, file paths, URLs, tokens, or other sensitive details. It should be limited to trusted operators, and safer versions should redact log output, omit or truncate session identifiers and titles, and clearly document journal access.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
index.mjs:116
Finding

Unredacted system logs and session metadata may be disclosed through an external chat channel

Content
View full analysis
{ const lower = line.toLowerCase(); return lower.includes('error') || lower.includes('exception') || lower.includes('fail') || lower.includes('warn'); }); // Unique entries const uniqueLines = [...new Set(filteredLines)]; // Limit to last 10 const last10 = uniqueLines.slice(-10); if (last10.length > 0) { systemLogsOutput = last10.map(l => `- \`${l.trim()}\``).join('\n'); } else { systemLogsOutput = "No recent error/warning logs found in journalctl."; } } catch (error) { systemLogsOutput = `Failed to retrieve system logs: ${error.message}`; } // 2. Session Errors (Secondary) try { const sessions = await getSessions(50); // Filter logic: lastStatus != 'ok' OR abortedLastRun is true const failedSessions = sessions.filter(s => { const statusNotOk = (s.lastStatus && s.lastStatus !== 'ok'); const aborted = (s.abortedLastRun === true); return statusNotOk || aborted; }); if (failedSessions.length > 0) { sessionErrorsOutput = failedSessions.map(s => `- **${s.id}** (${s.title || 'Untitled'}): Status=${s.lastStatus || 'N/A'}, Aborted=${s.abortedLastRun || false}` ).join('\n'); } else { sessionErrorsOutput = "No recent failed sessions found."; } } catch (error) { sessionErrorsOutput = `Error checking sessions: ${error.message}`; } ``` ### Technical Analysis The Skill reads up to 100 OpenClaw gateway journal entries and returns matching warning or error lines verbatim. It performs keyword filtering but does not redact secrets or minimize t ...[truncated 2810 chars]
Remediation
View remediation
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (3)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger is defined as "User asks 'How much did I spend today?' or similar," but "or similar" leaves the activation scope undefined. The document does not provide a bounded list of accepted phrases, constraints, or negative examples to distinguish this skill from ordinary conversation about spending.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill invokes a local shell command (openclaw sessions list --json --limit ${limit}) through exec, which introduces unnecessary command-execution capability into the skill. Although the current call site passes fixed numeric limits, using a shell for routine data access expands the attack surface and could become exploitable if any argument later becomes user-controlled or if the executed binary/path is hijacked in the host environment.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill reads host-level service logs via journalctl --user -u openclaw-gateway -n 100 --no-pager, exposing potentially sensitive operational data such as prompts, identifiers, internal errors, or environment-specific details. In a skill context without clearly documented need and access boundaries, this creates an information disclosure risk and broadens the skill's visibility into the host beyond its apparent reporting function.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.