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

Content
View full analysis

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
View 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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

Env Variable Harvesting

High
Category
Data Exfiltration
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.

Content

Scanner excerpt · scripts/build_dashboard.py (reported line 64)May include surrounding context.

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

Undeclared Tool Scope

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.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · scripts/build_dashboard.py (reported line 10)May include surrounding context.

python
import json
import os
import pathlib
import plistlib
import re
import subprocess
from typing import Any, Dict, List, Optional

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · scripts/build_dashboard.py (reported line 239)May include surrounding context.

python
import json
import os
import pathlib
import plistlib
import re
import subprocess
from typing import Any, Dict, List, Optional

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · scripts/build_dashboard.py (reported line 240)May include surrounding context.

python
import json
import os
import pathlib
import plistlib
import re
import subprocess
from typing import Any, Dict, List, Optional

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · scripts/build_dashboard.py (reported line 243)May include surrounding context.

python
import json
import os
import pathlib
import plistlib
import re
import subprocess
from typing import Any, Dict, List, Optional

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/build_dashboard.py (reported line 74)May include surrounding context.

python
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 ""

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · scripts/setup_dashboard.sh (reported line 12)May include surrounding context.

sh
/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">

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · scripts/setup_dashboard.sh (reported line 12)May include surrounding context.

sh
/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">

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · scripts/setup_dashboard.sh (reported line 14)May include surrounding context.

sh
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>

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · scripts/setup_dashboard.sh (reported line 14)May include surrounding context.

sh
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>

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · scripts/setup_dashboard.sh (reported line 15)May include surrounding context.

sh
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>