Back to skill

Security audit

SkillUp

Security checks for vulnerabilities and agentic risk

Overview

SkillUp is a coherent publishing helper, but it needs Review because it disables TLS certificate checking for an OpenClaw status call and can replace local skill files when explicitly invoked.

Install only if you intend to use a shell-based publisher that can upload skill packages, use platform tokens, create or update GitHub content, and optionally modify local agent skill directories. Avoid running OpenClaw status/publish workflows until the TLS bypass is removed, and use rollback/install-local only when you are comfortable with local skill directory replacement.

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

Error
Location
scripts/lib/openclaw.sh:3
Finding

OpenClaw Status Requests Disable TLS Certificate Verification

Content
View full analysis

Vulnerability Details

File Location: scripts/lib/openclaw.sh:3-9
Vulnerability Type: Improper certificate validation
Risk Level: High

Vulnerable Code:

sh
openclaw_status_via_cli() {
  if ! command_exists claw; then
    return 1
  fi

  NODE_TLS_REJECT_UNAUTHORIZED=0 claw skill my >/tmp/skillup-openclaw-status.out 2>/tmp/skillup-openclaw-status.log || true
  return 0
}

Technical Analysis

NODE_TLS_REJECT_UNAUTHORIZED=0 instructs Node.js to accept TLS certificates without validating their trust chain or hostname. The setting applies to the entire claw child process and therefore affects every HTTPS request made while executing claw skill my.

The status command may use credentials or session state maintained by the OpenClaw CLI. Disabling certificate validation allows an active network attacker to impersonate the remote service with an untrusted certificate. The attacker could inspect authenticated requests, return forged status data, or potentially capture reusable authentication material depending on how the CLI authenticates.

Disabling TLS verification is not necessary for the declared status or publishing functionality and exceeds the minimum safe network privileges required by the Skill.

Attack Path

  1. The victim has the claw CLI installed and authenticated.
  2. The attacker obtains a network interception position, such as control of a hostile Wi-Fi access point, proxy, DNS response, or compromised gateway.
  3. The victim invokes SkillUp in a workflow that performs OpenClaw status checks.
  4. SkillUp launches claw skill my with NODE_TLS_REJECT_UNAUTHORIZED=0.
  5. The attacker presents an untrusted certificate and impersonates the OpenClaw endpoint.
  6. The CLI accepts the certificate and communicates with the attacker-controlled endpoint.
  7. The attacker observes any authentication data sent by the CLI and can return manipulated status information.

Impact

...[truncated 626 chars]

Remediation
View remediation

Remediation Suggestions

  1. Remove NODE_TLS_REJECT_UNAUTHORIZED=0 and execute the CLI with normal certificate validation:

    sh
    claw skill my >"$status_output" 2>"$status_log"
    
  2. Correct the underlying certificate or trust-store problem instead of bypassing validation.

  3. If the service uses a private certificate authority, support an explicit trusted CA bundle through an option such as NODE_EXTRA_CA_CERTS, after validating the configured CA file.

  4. Fail closed when certificate verification fails and report the TLS failure to the user.

  5. Do not automatically retry the request with weaker TLS settings.

  6. Add a regression test that verifies the command rejects endpoints presenting invalid, expired, or hostname-mismatched certificates.

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/lib/openclaw.sh:148
Finding

Predictable Shared Temporary Files Permit Symlink-Based File Overwrite

Content
View full analysis

Vulnerability Details

File Locations:

  • scripts/lib/openclaw.sh:8
  • scripts/lib/openclaw.sh:80-80
  • scripts/lib/openclaw.sh:104-104
  • scripts/lib/openclaw.sh:148-156
  • scripts/lib/xiaping.sh:175-184
  • scripts/lib/xiaping.sh:198-204
  • scripts/lib/clawhub.sh:69-69
  • scripts/lib/clawhub.sh:129-132
  • scripts/lib/clawhub.sh:166-174
  • scripts/lib/github.sh:93-93
  • scripts/lib/github.sh:151-158

Vulnerability Type: Insecure temporary-file creation and local symlink following
Risk Level: Medium

Representative Vulnerable Code — OpenClaw:

sh
NODE_TLS_REJECT_UNAUTHORIZED=0 claw skill my >/tmp/skillup-openclaw-status.out 2>/tmp/skillup-openclaw-status.log || true
sh
if (cd "$publish_skill_dir" && "$cli_bin" skill publish $publish_args >/tmp/skillup-openclaw-cli.log 2>&1); then
sh
if (cd "$publish_skill_dir" && "$cli_bin" skill publish >/tmp/skillup-openclaw-cli.log 2>&1); then
sh
if [ -n "$auth_header" ]; then
  http_code=$(curl -sS -o /tmp/skillup-openclaw-response.json -w '%{http_code}' \
    -X POST "$base_url$upload_path" \
    -H "Authorization: Bearer $token" \
    -F "file=@$artifact_path")
else
  http_code=$(curl -sS -o /tmp/skillup-openclaw-response.json -w '%{http_code}' \
    -X POST "$base_url$upload_path" \
    -F "file=@$artifact_path")
fi

Representative Vulnerable Code — Xiaping:

sh
http_code=$(curl -sS -o /tmp/skillup-xiaping-response.json -w '%{http_code}' \
  -X POST "$base_url$upload_path" \
  -H "Authorization: Bearer $api_key" \
  -F "name=$name" \
  -F "description=$description" \
  -F "trigger=$trigger" \
  -F "category=$category" \
  -F "tags=$tags" \
  -F "version=$version" \
  -F "file=@$artifact_path")
sh
upload_code=$(curl -sS -o /tmp/skillup-xiaping-upload-response.json -w '%{http_code}' \
  -X POST "$base_url/api/upload" \
  -H 
...[truncated 4506 chars]
Remediation
View remediation

Remediation Suggestions

  1. Create a private temporary directory for each invocation:

    sh
    temp_dir=$(mktemp -d "${TMPDIR:-/tmp}/skillup.XXXXXX") || exit 1
    chmod 700 "$temp_dir"
    trap 'rm -rf "$temp_dir"' EXIT HUP INT TERM
    
  2. Store every response and log beneath that directory:

    sh
    openclaw_response="$temp_dir/openclaw-response.json"
    openclaw_log="$temp_dir/openclaw-cli.log"
    
  3. Replace all fixed /tmp/skillup-* paths across the OpenClaw, Xiaping, ClawHub, GitHub, and rollback implementations.

  4. Set a restrictive umask before creating files that may contain platform responses or authentication-related diagnostics:

    sh
    umask 077
    
  5. Do not use mktemp -u; create files or directories atomically.

  6. Verify that response files are regular files owned by the current user before parsing them.

  7. Ensure parallel workers receive distinct paths inside the invocation-specific directory.

  8. Add tests that pre-create symlinks at the former fixed paths and verify that unrelated target files remain unchanged.

Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (27)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description frames the skill as a publishing tool, but the documented behavior also includes local installation into user home directories, rollback that restores local files from GitHub release assets, and version-editing of project files. That mismatch is dangerous because users or policy systems may approve it for remote publishing while overlooking that it can overwrite local files, modify repositories, and pull remote artifacts into trusted locations.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
它被设计成可在 Codex、OpenClaw 中文社区及其他能读取 `SKILL.md` 并执行 shell 命令的智能体环境中使用。

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
它被设计成可在 Codex、OpenClaw 中文社区及其他能读取 `SKILL.md` 并执行 shell 命令的智能体环境中使用。

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
它被设计成可在 Codex、OpenClaw 中文社区及其他能读取 `SKILL.md` 并执行 shell 命令的智能体环境中使用。

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The rollback path downloads an archive from GitHub and then removes the local skill directory before restoring content from the downloaded artifact. This is dangerous because it performs destructive replacement of local files based on remote content, and integrity/trust validation is limited to the GitHub release/tag selection and CLI behavior.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

Disabling certificate verification for a silent status check is especially risky because it occurs without any user-facing warning or confirmation. Users may assume a trusted TLS connection while the tool is actually accepting unverified peers, enabling transparent interception and falsified remote status data.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill advertises shell, file read/write, and environment-variable usage but does not declare any explicit tool scope such as permissions or allowed-tools. In an agent ecosystem, that omission weakens user visibility and policy enforcement, increasing the chance the skill is invoked with broader capabilities than expected, including access to local files and publishing credentials.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The primary skill description and usage guidance are written in Chinese and specifically mention use in the OpenClaw Chinese community, without offering an English or user-selectable language option. This creates a natural-language locale constraint that is not presented as optional or justified as a region-specific compliance requirement.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The trigger list includes generic brand/tool names like "SkillUp" and "skillup" without any task-scoping language, which can cause the skill to activate in contexts where the user merely mentions the product rather than intending to publish a skill. In a publishing tool with external platform integrations, unintended invocation increases the chance of accidental packaging, syncing, or disclosure actions if the surrounding agent framework auto-routes based on triggers.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This code accesses sensitive credentials via SKILLUP_CLAWHUB_TOKEN or CLAWHUB_TOKEN and then exports and uses the token for login. Within this file, there is no confirmation prompt or user-facing warning that credentials will be read and transmitted to the ClawHub service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The function publishes via the clawhub CLI and, on fallback, sends the artifact with curl to a remote endpoint. Although results are recorded after execution, there is no prior confirmation prompt or clear user-facing disclosure here that local skill contents will be transmitted off-system.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The manifest description frames SkillUp as a cross-platform publishing and syncing tool for GitHub/Xiaping/OpenClaw/ClawHub. However, the documented modes include install-local and rollback, and the code implements copying skills into $HOME/.codex/skills and $HOME/.openclaw/skills as well as deleting and restoring a local skill directory from a GitHub release. Those are materially broader local system modification capabilities than remote packaging/sync alone.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The summary strings emitted in print_publish_diff_summary are hard-coded in Chinese, which enforces a specific language regardless of user preference. The policy allows locale constraints only when users are given a choice or when the constraint is clearly justified, neither of which is shown here.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

install_local_skill writes into $HOME/.codex/skills and $HOME/.openclaw/skills, replacing existing installations after moving them aside. For a tool described as packaging and syncing custom skills to named publishing platforms, modifying end-user local runtime directories is a separate deployment capability that is not stated in the manifest description.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This code deletes the existing local skill directory and replaces it without any user-facing confirmation at the point of destruction. A mistaken version, compromised release asset, or operator error could therefore cause immediate local data loss or unwanted code/content replacement.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

print_status_summary returns user-facing status messages entirely in Chinese such as 已同步, 未同步, and 待确认. This imposes a fixed locale on all users without offering a language choice or documenting a justified regional restriction.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

This shell script can create a GitHub repository, copy an artifact into a target repository, commit it, and push to a remote branch. While results are recorded after the fact, there is no visible confirmation prompt or user-facing disclosure in this file before these state-changing operations occur.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

The script uploads artifacts to GitHub releases and may create a new release remotely, which sends user-provided build artifacts to an external service. This file does not include a user-facing warning, confirmation, or explanatory comment/docstring describing that network publication behavior.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
99% confidence
Finding

The status check explicitly sets NODE_TLS_REJECT_UNAUTHORIZED=0, disabling TLS certificate validation for the claw CLI connection. That makes the network request vulnerable to man-in-the-middle interception or spoofing, allowing an attacker on the network path to tamper with responses and potentially influence downstream status decisions without detection.

Content

No source excerpt is available for this finding.

Unsafe Defaults

Medium
Category
Tool Misuse
Confidence
99% confidence
Finding

This is an unsafe default: the code hard-codes NODE_TLS_REJECT_UNAUTHORIZED=0 rather than leaving certificate validation enabled. Because it is built into normal execution of the status path, insecure transport trust becomes the default behavior rather than an exceptional troubleshooting mode.

Content

Scanner excerpt · scripts/lib/openclaw.sh (reported line 8)May include surrounding context.

sh
return 1
  fi

  NODE_TLS_REJECT_UNAUTHORIZED=0 claw skill my >/tmp/skillup-openclaw-status.out 2>/tmp/skillup-openclaw-status.log || true
  return 0
}

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The script uploads an artifact with curl and may include an Authorization: Bearer token, which is a network operation involving user/project data and credentials. The code records results after the fact, but it does not provide a visible warning, confirmation, or explanatory comment about transmitting the file and token to a remote endpoint.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This code reads a sensitive credential from configuration or environment and sends it in Authorization headers during curl POST requests. The script contains no confirmation prompt, user-facing log, or explanatory comment/docstring warning that credentials and skill metadata will be transmitted to a remote service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The publish function performs a multipart POST that uploads the local artifact file and associated metadata to a remote server. Aside from dry-run/result bookkeeping, there is no prompt, visible pre-upload notice, or inline warning in this file explaining that local files will be transmitted off-system.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The manifest uses Chinese-only natural-language fields for the description, title, summary, category, and trigger text, with no indication that the skill is region-specific or that users can choose another language. This creates a language/locale policy concern because the skill metadata appears to enforce a specific language by default.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
72% confidence
Finding

The manifest presents category and several descriptions only in Chinese while other fields are in English, and it targets a Chinese community in natural-language metadata. Because no explicit language-selection or locale-scoping guidance is provided, the skill may impose a language/locale experience without clear user opt-in.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.