Back to skill

Security audit

clawvision-ee

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a disclosed local conversation export tool, but its generated HTML can include unsafe model-controlled attributes, so users should review it before installing or sharing exports.

Install only if you are comfortable granting access to selected conversation history and writing local export files. Do not use it on sensitive conversations unless you review/redact the output, and be cautious opening or sharing generated HTML until the checklist status field is validated and escaped.

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
scripts/generate_visual.py:383
Finding

Stored HTML Attribute Injection Through Unvalidated Checklist Status

Content
View full analysis
{_h(c.get('text', ''))} {_h(status)}\n" ``` ### Technical Analysis The `checklist[].status` field originates from summary JSON produced from conversation content. Although the intended values are `ready`, `pending`, and `blocked`, the renderer does not validate the field against that set. The status is escaped with `_h()` when inserted as visible text, but it is inserted without escaping into the quoted `class` attribute: ```html ``` An attacker who can influence the generated summary could supply a value such as: ```text pending" onmouseover="alert(document.domain) ``` This produces an element resembling: ```html ``` The injected event handler executes when the event is triggered. Because the payload is written into the exported HTML file, this is a stored client-side injection vulnerability. The absence of a restrictive Content Security Policy increases the likelihood that an injected inline handler can execute. ### Attack Path 1. An attacker places specially crafted instructions or content in a conversation that the Skill is asked to summarize. 2. The local summarization model incorporates attacker-controlled content into `checklist[].status` instead of returning one of the documented status values. 3. The resulting JSON is passed to `scripts/generate_visual.py`. 4. The renderer inserts the status directly into the HTML `class` attribute without validation or attribute encoding. 5. The user opens the generated HTML export. 6. When the injected event is triggered, attacker-controlled JavaScript execute ...[truncated 856 chars]
Remediation
View remediation
{_h(c.get("text", ""))} ' f'{safe_status}\n' ) ``` 3. Validate the complete summary object against a JSON schema before rendering. Define `checklist[].status` as an enum containing only `ready`, `pending`, and `blocked`, and reject malformed structures. 4. Add a restrictive Content Security Policy to the generated HTML. Prefer moving the inline script to a separately hashed script or using an appropriate CSP hash. At minimum, prohibit inline event handlers and unnecessary network destinations. 5. Add regression tests using status values containing quotes, angle brackets, event-handler text, and JavaScript URLs. Verify that generated elements cannot acquire attacker-defined attributes. 6. Treat model-generated JSON as untrusted input regardless of whether inference is performed locally. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • 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 (3)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description presents a full local export pipeline for OpenClaw conversations, including session access, summarization via a local LLM, and multi-format export generation. The supplied code does none of that. Instead, it simply opens existing PNG screenshots from five hardcoded preset folders, pastes them side by side into a collage, labels each column, and saves one combined PNG preview. While this is local file I/O and PNG-related output, its primary purpose is materially different from the declared tool behavior, and the key declared capabilities are absent.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The embedded summarization prompt requires fields such as "简短中文标题" and "一句话背景", which directs the model to produce Chinese output regardless of user preference. Although other sections mention language choices, this prompt itself hard-codes Chinese output and can override the stated language-selection behavior.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

This code sets --lang to default to zh, which causes generated output to use a specific language unless the user explicitly overrides it. The policy for natural-language behavior allows locale choice or justified constraints, but here the file imposes a language default without any documented opt-in or region-specific justification.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.