Back to skill

Security audit

English Daily Report

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent English-learning report skill, but its PDF script has a real local file-overwrite weakness and its network/TTS privacy disclosure is incomplete.

Review the PDF script before installing or running this skill, especially if your OpenClaw uploads directory can be modified by other users or processes. Treat web fetching and TTS as networked features that may send content to external services, and avoid passing untrusted date values to the PDF script until it is hardened with mktemp, date validation, and consistent HTML escaping.

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

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/generate-pdf-html.sh:23
Finding

Predictable Temporary HTML File Allows Symlink-Based File Overwrite

Content
View full analysis
"$HTML_FILE" << HTMLEOF ``` ### Technical Analysis The script uses the fixed path `uploads/report-temp.html` as a temporary HTML file. Shell output redirection follows symbolic links and truncates the resolved target before writing. If another local process or workspace participant can create files in the `uploads` directory, it can replace `report-temp.html` with a symbolic link to another file writable by the account running the Skill. When the Skill executes, the shell follows that link and overwrites the target with generated HTML. The predictable filename also causes a race condition between concurrent report-generation operations. Multiple invocations can overwrite the same temporary file while another Chrome process is reading it, leading to incorrect output or cross-job content exposure. ### Attack Path 1. An attacker obtains write access to `${HOME}/.openclaw/workspace/uploads`. 2. The attacker removes any existing `report-temp.html`. 3. The attacker creates a symbolic link named `report-temp.html` pointing to a sensitive file writable by the OpenClaw account. 4. The user or Agent invokes `generate-pdf-html.sh`. 5. The `cat > "$HTML_FILE"` redirection follows the symbolic link. 6. The target file is truncated and replaced with the generated HTML document. A concurrent-operation variant is also possible: 1. Two report jobs run at approximately the same time. 2. Both jobs write to the same `report-temp.html` path. 3. One job overw ...[truncated 988 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
scripts/generate-pdf-html.sh:13
Finding

Unescaped Date Argument Enables HTML Injection During PDF Rendering

Content
View full analysis
英语学习计划 · 每日推送 · Generated on ${DATE} ``` ### Technical Analysis The script correctly creates `DATE_ESCAPED` for one part of the generated document, but the footer interpolates the original `DATE` value directly into the HTML heredoc. An attacker who can influence the first command-line argument can supply HTML markup instead of a date. Headless Chrome then interprets that markup while rendering the document. For example, an injected image, stylesheet, frame, or other resource-bearing element can cause Chrome to contact an attacker-controlled server. This behavior contradicts the Skill documentation's claim that the PDF-generation script does not access the external network. HTML escaping applied to the title, content, translation, and vocabulary does not protect this separate unescaped interpolation point. The issue does not, by itself, demonstrate arbitrary native code execution or credential theft. Browser sandboxing and local file-access controls limit the likely effect, but the injection can still manipulate the generated report and initiate unintended network requests. ### Attack Path 1. An attacker controls or influences the `DATE` argument passed to `generate-pdf-html.sh`. 2. The attacker supplies a value containing an HTML element that references an external URL, such as a remote image. 3. The script places the value into the footer without HTML escaping. 4. The generated temporary file contains attacker-controlled HTML markup. 5. Headless Chrome opens and renders the file. 6. Chrome ...[truncated 929 chars]
Remediation
View remediation
English Learning Plan · Daily Delivery · Generated on ${DATE_ESCAPED} ``` Strictly validate the argument before using it in HTML or file paths: ```bash if [[ ! "$DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then printf 'ERROR: DATE must use YYYY-MM-DD format.\n' >&2 exit 1 fi ``` Additional hardening measures: 1. Apply contextual escaping to every variable interpolated into HTML, including footer and metadata values. 2. Keep date validation even after adding HTML escaping because the value is also used to construct output filenames. 3. Run headless Chrome with network access disabled when converting a fully local document. 4. Enforce outbound network restrictions at the process, container, or firewall level rather than relying solely on browser flags. 5. Use an isolated Chrome profile and retain the browser sandbox. 6. Add regression tests with characters such as `<`, `>`, `"`, `'`, and `&` in every externally influenced field and verify that no markup is interpreted. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (8)

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill’s security note says the script does not access external networks, but the documented workflow explicitly depends on networked tools and services such as web_search, web_fetch, and online TTS. This creates misleading security assurances that can cause users to underestimate data exposure and runtime risk when the skill is used.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · SKILL.md (reported line 72)May include surrounding context.

md
### 安装 Chrome(如未安装)

- **macOS**: https://www.google.com/chrome/
- **Linux**: `sudo apt install chromium-browser` 或 `sudo yum install chromium`
- **Windows (WSL)**: 使用 Windows Chrome 路径

### 配置 TTS

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · SKILL.md (reported line 372)May include surrounding context.

md
### 安装 Chrome(如未安装)

- **macOS**: https://www.google.com/chrome/
- **Linux**: `sudo apt install chromium-browser` 或 `sudo yum install chromium`
- **Windows (WSL)**: 使用 Windows Chrome 路径

### 配置 TTS

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · SKILL.md (reported line 373)May include surrounding context.

md
### 安装 Chrome(如未安装)

- **macOS**: https://www.google.com/chrome/
- **Linux**: `sudo apt install chromium-browser` 或 `sudo yum install chromium`
- **Windows (WSL)**: 使用 Windows Chrome 路径

### 配置 TTS

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill instructs the agent to fetch external news content and use networked TTS services without a clear up-front privacy warning. User-provided text, selected articles, and generated summaries may be transmitted to third-party services, which creates privacy and compliance risk if users are not adequately informed.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The markdown requires every report to include a Chinese translation ("中文翻译") as part of the output format. This is a language/locale constraint presented as mandatory behavior, and the document does not indicate user opt-in or an alternative language choice.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This markdown repeatedly presents the report format as an 'English Daily Report' and labels the main body as 'English Content' without indicating that users may choose another language. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale constraint is explicitly justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The script description and arguments explicitly require English content and a Chinese translation, and the generated document labels are fixed to English and Chinese. This imposes a specific language/locale behavior without any user opt-in or documented justification for the locale restriction.

Content

No source excerpt is available for this finding.