Back to skill

Security audit

OpenClaw Elite Watcher

Security checks for vulnerabilities and agentic risk

Overview

The skill claims to provide real-time OpenClaw intelligence, but the bundled script only writes a hard-coded report to a user-specific path and can overwrite an existing daily report.

Review carefully before installing. This skill should not be relied on for OpenClaw intelligence as written; it needs real data collection, evidence-backed reporting, a user-selected output path, non-overwriting file behavior, and clear permission disclosure.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
watcher.py:12
Finding
Hard-Coded External Workspace Write and Predictable Report Overwrite## Vulnerability Details **File Location**: `watcher.py`, lines 12-21 **Vulnerability Type**: Hard-coded external path and unsafe file overwrite **Risk Level**: Medium ### Vulnerable Code ```python REPORT_PATH = "/Users/asdc163/.openclaw/workspace/intel_reports" def generate_summary(): if not os.path.exists(REPORT_PATH): os.makedirs(REPORT_PATH) date_str = datetime.now().strftime("%Y-%m-%d") report_file = f"{REPORT_PATH}/{date_str}.md" with open(report_file, "w") as f: ``` ### Technical Analysis The skill writes to a hard-coded absolute path in a specific user's OpenClaw workspace rather than to a skill-owned directory or a destination explicitly selected by the user. It also opens the predictable daily report filename in `w` mode, which silently truncates an existing file. The operation uses all filesystem permissions inherited from the invoking process. It does not independently escalate operating-system privileges, but it crosses the expected project boundary and can modify pre-existing OpenClaw workspace data without confirmation. The separate existence check followed by directory creation is also less robust than atomic creation with `exist_ok=True`. ### Attack Path 1. A user executes the skill while running under an account that can write to the configured OpenClaw workspace. 2. `generate_summary()` selects `/Users/asdc163/.openclaw/workspace/intel_reports` without obtaining user approval. 3. The directory is created if it does not exist. 4. The code constructs a predictable filename based only on the local date. 5. If that daily report already exists, `open(..., "w")` truncates and replaces it. 6. Existing report content can consequently be lost or replaced by the skill's static output. ### Impact Assessment The skill can create directories and replace files within the hard-coded destination using the invoking process's existing privileges. The direct scope i ...[truncated 387 chars]
Remediation
## Remediation Suggestions - Remove the user-specific absolute path. - Accept the destination through an explicit command-line option or trusted configuration. - Default to a clearly documented, skill-owned application-data directory. - Resolve the destination with `pathlib.Path.resolve()` and verify that it remains within an approved base directory. - Require explicit confirmation before writing to an existing external workspace. - Create directories atomically with `mkdir(parents=True, exist_ok=True)`. - Avoid silent truncation. Use exclusive creation (`"x"`) when reports must not already exist, or ask the user before replacement. - If replacement is intended, write to a temporary file in the same directory and atomically replace the target only after a successful write. - Apply restrictive file permissions where reports could contain sensitive information.

other

Warning
Location
watcher.py:7
Finding
Fabricated Monitoring Results Presented as Current Intelligence## Vulnerability Details **File Location**: `watcher.py`, lines 7-29; `SKILL.md`, lines 15-18 **Vulnerability Type**: Deceptive fabricated intelligence and documentation mismatch **Risk Level**: Medium ### Vulnerable Code and Documentation `SKILL.md` advertises active monitoring: ```markdown ## Features - **Real-time Commit Monitoring**: Tracks the official OpenClaw repository. - **Developer Intel**: Monitors key contributors and their latest technical experiments. - **Strategic Summaries**: Converts complex code changes into human-readable bullet points. ``` However, `watcher.py` defines sources without using them and writes fixed claims: ```python TRACK_LIST = [ {"name": "Peter Steinberger (GitHub)", "url": "https://github.com/steipete"}, {"name": "OpenClaw (GitHub)", "url": "https://github.com/openclaw/openclaw"}, {"name": "OpenClaw Community (X)", "url": "https://x.com/openclaw"} ] REPORT_PATH = "/Users/asdc163/.openclaw/workspace/intel_reports" def generate_summary(): if not os.path.exists(REPORT_PATH): os.makedirs(REPORT_PATH) date_str = datetime.now().strftime("%Y-%m-%d") report_file = f"{REPORT_PATH}/{date_str}.md" with open(report_file, "w") as f: f.write(f"# OpenClaw Intel Summary - {date_str} 🦞\n\n") f.write("## 📢 今日情報焦點\n") f.write("- **[系統]**:成功切換至 Intel Agent 模式,全面追蹤核心開發者動態。\n") f.write("- **[動態]**:OpenClaw 創始人 Peter 正在優化 MCP 協議層,這對我們的資訊串接極有幫助。\n\n") f.write("## 🛠️ 自主進化建議\n") f.write("- **發現新工具**:`agent-twitter-client` (elizaOS)。這能讓我們更穩定地獲取 X 資訊,建議今日完成初步整合。\n") f.write("- **環境升級**:檢測到 Node.js v22.22.0 穩定版,目前已在使用,維持最佳性能。\n") ``` ### Technical Analysis No GitHub, X, commit, contributor, or local Node.js inspection is performed. Although `requests` is imported and `TRACK_LIST` contains remote URLs, neither is used. The program performs no network request, parses no r ...[truncated 1548 chars]
Remediation
## Remediation Suggestions - Implement actual retrieval of repository commits and contributor activity through documented, authenticated APIs. - Inspect the local Node.js version through a controlled, non-shell command invocation before reporting it. - Derive each report statement from collected evidence rather than fixed text. - Include source URLs, commit identifiers, retrieval timestamps, and relevant API response fields for every intelligence claim. - Clearly distinguish verified observations, analysis, recommendations, and unverified hypotheses. - Handle network failures explicitly and state that no current data was available instead of falling back to claims presented as facts. - Remove unused imports and source lists if active monitoring is not intended. - If the script is only a report-template generator, rename it accordingly and revise `SKILL.md` so its stated capabilities match the implementation. - Add automated tests that fail when a report presents monitoring or environment claims without corresponding collected evidence.
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (7)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The declared description promises an automated intelligence engine that watches protocol commits from specific developers and analyzes raw code diffs into actionable reports. The supplied code does not implement any of that behavior. Although it imports requests and defines a TRACK_LIST with GitHub/X targets, those are unused. The script neither fetches remote data nor inspects commits, diffs, or developer activity. Instead, it simply creates a local markdown file containing predetermined, static content. This is a material mismatch in primary purpose and actual capabilities.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The implementation does not perform any live monitoring, commit collection, or diff analysis, yet it emits a report presenting hardcoded assertions as fresh intelligence. This is dangerous because users may rely on fabricated or stale output for operational or investment decisions, and the mismatch between claimed capability and actual behavior undermines trust and can conceal future malicious embellishments.

Intent-Code Divergence

High
Confidence
99% confidence
Finding
The report claims successful mode changes, detected protocol work, discovered tools, and confirmed environment versions without performing any such checks. Fabricated status and telemetry are dangerous because they can manipulate operator decisions, mask monitoring failures, and provide a false basis for follow-on automation or ecosystem analysis.

Lp3

Medium
Category
MCP Least Privilege
Confidence
84% confidence
Finding
The skill advertises behavior that requires network access and potentially writing data, but it does not declare any explicit tool scope such as permissions or allowed-tools. This creates an authorization ambiguity where a host agent may grant broader capabilities than users expect, increasing the risk of unintended outbound access or local file modification.

Rp1

Medium
Category
MCP Rug Pull
Confidence
90% confidence
Finding
Using `npx openclaw` without a pinned version allows execution of whatever package version is current at runtime, which can change unexpectedly or be compromised in a supply-chain attack. In a skill intended for monitoring and intelligence collection, this is especially risky because it combines remote code retrieval with network-capable behavior.

Description-Behavior Mismatch

Medium
Confidence
88% confidence
Finding
The track list is inconsistent with the stated purpose and is not used at all by the code, indicating deceptive or nonfunctional monitoring scope. While this is not direct code execution risk, it can mislead users about what sources are being watched and create false assurance that developer activity is being tracked.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
The generated report content is written entirely in Chinese, including headings and status messages, and there is no indication that the user can opt into this language or that the skill is intentionally limited to a Chinese-speaking context. This creates a natural-language locale policy issue because the file forces a specific language in user-visible output.

Static analysis

No suspicious patterns detected.