Back to skill

Security audit

One-Click Task Dashboard

Security checks for vulnerabilities and agentic risk

Overview

The local dashboard function is disclosed, but the package also includes account-linked ClawHub publishing and persistent retry automation that does not fit the dashboard purpose.

Install only if you want a macOS LaunchAgent-backed local dashboard and are comfortable with task names, schedules, and metrics being written under ~/.openclaw/dashboard and served on localhost. Do not run the publishing or publisher-retry scripts unless you intentionally want to publish this skill from your own ClawHub account; review or remove those scripts and any LaunchAgents they create first.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T08 · Insecure Dependencies

Warning
Location
scripts/publish_to_clawhub.sh:36
Finding
Unpinned Third-Party CLI Download and Execution via npx## Vulnerability Details **File Location**: `scripts/publish_to_clawhub.sh:36-44` **Vulnerability Type**: Unpinned third-party dependency execution **Risk Level**: Medium **Complete Code Snippet**: ```sh echo "[1/3] 检查 ClawHub 登录态..." "${NPX_BIN}" -y clawhub whoami --no-input echo "[2/3] 发布 Skill..." "${NPX_BIN}" -y clawhub publish "${SKILL_DIR}" \ --slug "${SLUG}" \ --name "${NAME}" \ --version "${VERSION}" \ --tags "latest" \ --no-input ``` ### Technical Analysis The script invokes `npx` with `-y` and the unversioned package name `clawhub`. If the package is not already available in the local cache or installation, `npx` can automatically resolve, download, and execute the package without interactive confirmation. Because no exact package version, lockfile, or integrity hash is enforced, the code executed at publication time can differ from the code originally audited. This creates a supply-chain risk: a compromised package release, registry account, or unexpectedly incompatible future release could execute arbitrary package or lifecycle code under the invoking user's account. The process is particularly sensitive because the command operates within an authenticated ClawHub publishing context and receives the Skill directory as input. ### Attack Path 1. An attacker compromises the upstream `clawhub` package, its publisher account, or a subsequently resolved package release. 2. A user runs `scripts/publish_to_clawhub.sh`, either directly or through the persistent publisher job. 3. `npx -y clawhub` resolves and downloads the unpinned package without requesting confirmation. 4. The downloaded package or its lifecycle logic executes with the user's privileges. 5. Malicious code can inspect user-accessible files and environment data, misuse available ClawHub authentication, alter the project, or publish modified content. ### Impact Assessment Successful exploitation provides code execution w ...[truncated 508 chars]
Remediation
## Remediation Suggestions 1. Pin the CLI to a reviewed exact version, such as `clawhub@1.2.3`, rather than resolving the latest available release. 2. Prefer a preinstalled, trusted CLI and fail with explicit installation instructions if it is unavailable. 3. Remove `-y` so unexpected installation does not occur without user confirmation. 4. Manage the dependency through a committed lockfile and use a deterministic installation method such as `npm ci`. 5. Verify package provenance and registry integrity metadata before execution. 6. Run publishing from a restricted environment with only the files and credentials required for publication. 7. Regularly review and deliberately update the pinned version after validating its source and behavior.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (52)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The skill claims to generate and refresh a local dashboard, but it also installs persistent launchd jobs and sets up periodic retry behavior tied to publishing rather than dashboard refresh. Persistence plus purpose mismatch is especially risky because it can cause ongoing background execution the user did not knowingly approve.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The skill claims to generate and refresh a local dashboard, but it also installs persistent launchd jobs and sets up periodic retry behavior tied to publishing rather than dashboard refresh. Persistence plus purpose mismatch is especially risky because it can cause ongoing background execution the user did not knowingly approve.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill claims to generate and refresh a local dashboard, but it also installs persistent launchd jobs and sets up periodic retry behavior tied to publishing rather than dashboard refresh. Persistence plus purpose mismatch is especially risky because it can cause ongoing background execution the user did not knowingly approve.

Env Variable Harvesting

High
Category
Data Exfiltration
Content
def run_cmd(args: List[str]) -> str:
    env = os.environ.copy()
    if args and args[0] == "openclaw":
        args = list(args)
        args[0] = resolve_openclaw_bin()
Confidence
60% confidence
Finding
Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill documentation advertises shell execution, file writes, local service setup, and LaunchAgent installation, but declares no explicit tool scope or permissions boundary. That makes the skill harder to review safely and increases the chance an agent or user will grant broad execution capability without understanding the persistence and filesystem changes involved.

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
The documentation instructs users to run automated marketplace publishing and retry setup commands even though the skill is presented as a dashboard-generation utility. Embedding unrelated automation for publication can mislead users into granting broader execution than needed and may trigger repeated external actions in the background.

Context-Inappropriate Capability

Medium
Confidence
94% confidence
Finding
Marketplace publication capability is not justified by the stated local-dashboard purpose, so its presence suggests unnecessary privilege and external interaction. In context, this makes the skill more dangerous because users seeking local monitoring would not reasonably expect account-linked publication workflows or retries.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The display name, description, and default prompt are all written in Chinese, with no indication that the skill supports other languages or that Chinese is an optional locale. This can constitute a language/locale policy issue when a skill implicitly forces a specific language without user opt-in or documented regional scope.

Vague Triggers

Medium
Confidence
88% confidence
Finding
The default prompt is a broad activation phrase that automatically steers the agent into executing the skill without clear user intent boundaries or confirmation. In a skill that generates files, aggregates task status, and starts a local service, this can cause unintended invocation and operational side effects, especially if the agent matches loosely on similar user requests.

Session Persistence

Medium
Category
Rogue Agent
Content
import json
import os
import pathlib
import plistlib
import re
import subprocess
from typing import Any, Dict, List, Optional
Confidence
75% 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.

Session Persistence

Medium
Category
Rogue Agent
Content
import json
import os
import pathlib
import plistlib
import re
import subprocess
from typing import Any, Dict, List, Optional
Confidence
75% 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.

Session Persistence

Medium
Category
Rogue Agent
Content
import json
import os
import pathlib
import plistlib
import re
import subprocess
from typing import Any, Dict, List, Optional
Confidence
75% 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.

Session Persistence

Medium
Category
Rogue Agent
Content
import json
import os
import pathlib
import plistlib
import re
import subprocess
from typing import Any, Dict, List, Optional
Confidence
75% 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.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
if bin_dir and bin_dir not in base.split(":"):
            env["PATH"] = f"{bin_dir}:{base}"
    try:
        cp = subprocess.run(args, capture_output=True, text=True, check=False, env=env)
        return (cp.stdout or "").strip()
    except Exception:
        return ""
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The script writes operational telemetry into data.json and index.html under a predictable local directory without setting restrictive permissions or warning the user that task names, schedules, run times, status, and metric summaries will be persisted. In this skill context, those files may expose sensitive internal automation details and business data to other local users, backup systems, or any local web server serving the dashboard.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The script performs repeated publication to ClawHub, which goes beyond the stated purpose of generating and refreshing a local task dashboard. This creates an unexpected external distribution action with retry logic, increasing the risk of unintended publishing, account misuse, or data exposure if the skill is run as-is.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The script not only publishes to a marketplace but also prompts the operator to set a sale price, which is unrelated to the described visualization functionality. This indicates hidden commercialization behavior that could mislead users about the skill's true actions and cause unauthorized listing or monetization under their account.

Natural-Language Policy Violations

Medium
Confidence
97% confidence
Finding
The notification string and title are fixed in Chinese, with no indication that the user can choose another language or locale. This is a natural-language policy issue because the skill imposes a specific language in user-facing output without documented opt-in or justification.

Rp1

Medium
Category
MCP Rug Pull
Confidence
90% confidence
Finding
The script invokes `npx -y clawhub ...` without pinning an exact package version, so execution depends on whatever version of the `clawhub` package is resolved at runtime. If the upstream package is compromised, typosquatted, or changes behavior unexpectedly, the publish workflow could execute untrusted code on the operator machine or alter release behavior.

Session Persistence

Medium
Category
Rogue Agent
Content
/usr/bin/python3 "${SKILL_DIR}/scripts/build_dashboard.py" --output-dir "${OUT_DIR}" >/dev/null

cat > "${HOME}/Library/LaunchAgents/${REFRESH_LABEL}.plist" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
Confidence
83% confidence
Finding
The here-doc beginning at this line writes a LaunchAgent plist, enabling session persistence. Repeated or duplicate matches are likely analyzer artifacts, but the underlying behavior is still persistence without interactive confirmation.

Session Persistence

Medium
Category
Rogue Agent
Content
/usr/bin/python3 "${SKILL_DIR}/scripts/build_dashboard.py" --output-dir "${OUT_DIR}" >/dev/null

cat > "${HOME}/Library/LaunchAgents/${REFRESH_LABEL}.plist" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
Confidence
83% confidence
Finding
The here-doc beginning at this line writes a LaunchAgent plist, enabling session persistence. Repeated or duplicate matches are likely analyzer artifacts, but the underlying behavior is still persistence without interactive confirmation.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The script silently creates and overwrites LaunchAgent plist files under ~/Library/LaunchAgents, establishing persistence without any user prompt or prior disclosure. Even if intended for convenience, persistence mechanisms are security-sensitive because they survive beyond the current session and normalize unattended execution of local code.

Session Persistence

Medium
Category
Rogue Agent
Content
cat > "${HOME}/Library/LaunchAgents/${REFRESH_LABEL}.plist" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key><string>${REFRESH_LABEL}</string>
Confidence
82% confidence
Finding
This duplicate finding again reflects LaunchAgent persistence via plist definition. The danger is not the XML itself but that the skill installs an automatically executed job in the user's session context.

Session Persistence

Medium
Category
Rogue Agent
Content
cat > "${HOME}/Library/LaunchAgents/${REFRESH_LABEL}.plist" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key><string>${REFRESH_LABEL}</string>
Confidence
82% confidence
Finding
This duplicate finding again reflects LaunchAgent persistence via plist definition. The danger is not the XML itself but that the skill installs an automatically executed job in the user's session context.

Session Persistence

Medium
Category
Rogue Agent
Content
cat > "${HOME}/Library/LaunchAgents/${REFRESH_LABEL}.plist" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key><string>${REFRESH_LABEL}</string>
  <key>ProgramArguments</key>
Confidence
85% confidence
Finding
At this point the plist defines ProgramArguments that will be executed automatically by launchd. Persistently launching local scripts broadens the trust boundary: if the referenced script or directory is later modified, the LaunchAgent will continue to execute it unattended.

Static analysis

No suspicious patterns detected.