Back to skill

Security audit

Catch My Skill

Security checks for vulnerabilities and agentic risk

Overview

This skill is a mostly coherent version-checking tool, but its update command can install mutable remote skill code and has an unvalidated shell-command path.

Review this skill carefully before installing. Use the read-only check features only if you accept its local JSON state and ClawHub queries. Avoid the update command unless the shell-injection issue is fixed and the update source is verified, and do not enable any recurring cron job without clear opt-in and removal instructions.

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

T09 · Insecure Skill Coding Practices

Error
Location
index.js:186
Finding

Shell Command Injection Through Unvalidated Skill Names and Configuration

Content
View full analysis
{ const match = line.match(/^(GITHUB_USERNAME|CATCH_INTERVAL)=(.+)$/); if (match) { if (match[1] === 'GITHUB_USERNAME') config.githubUsername = match[2].trim(); if (match[1] === 'CATCH_INTERVAL') config.interval = parseInt(match[2].trim()); } }); } return config; } ``` ```js function addSkill(name) { const local = getLocalSkills(); if (local.skills.find(s => s.name === name)) { log(`${name} 已在列表中`, 'yellow'); return; } local.skills.push({ name, version: 'unknown' }); fs.writeFileSync(path.join(DATA_DIR, 'local.json'), JSON.stringify({ skills: local.skills, updated: new Date().toISOString() }, null, 2)); log(`✅ 已添加 ${name}`, 'green'); } ``` ```js const config = loadConfig(); const repoUrl = `https://github.com/${config.githubUsername}/${name}`; try { execSync(`cd ~/.openclaw/workspace/skills && git clone ${repoUrl} 2>/dev/null`, { timeout: 30000 }); log(`✅ 已从 GitHub 更新`, 'green'); } catch { execSync(`clawhub install ${name}`, { timeout: 30000 }); log(`✅ 已从 ClawHub 更新`, 'green'); } ``` ### Technical Analysis The Skill constructs shell command strings using two untrusted values: 1. The skill name supplied through the command line and persisted by `addSkill()`. 2. The GitHub username read from `~/.openclaw/.backup.env`. Neither value is validated, escaped, or passed as an isolated process argument. Node.js `execSync()` executes string commands through a shell, so shell metacharacters embedded in either value are ...[truncated 1732 chars]
Remediation
View remediation
/dev/null`. Use the process API's `cwd`, `stdio`, and absolute paths instead. 4. Validate values when they enter the application and again immediately before security-sensitive process execution. 5. Store structured metadata rather than executable command fragments, and reject malformed entries already present in `data/local.json`. 6. Add tests covering semicolons, command substitutions, pipes, redirections, whitespace, newlines, and other shell metacharacters. ]]>

T08 · Insecure Dependencies

Warning
Location
index.js:186
Finding

Unverified Installation of Mutable Third-Party Skill Content

Content
View full analysis
/dev/null`, { timeout: 30000 }); log(`✅ 已从 GitHub 更新`, 'green'); } catch { execSync(`clawhub install ${name}`, { timeout: 30000 }); log(`✅ 已从 ClawHub 更新`, 'green'); } ``` ### Technical Analysis The `update` operation installs content from a mutable GitHub repository or, if cloning fails for any reason, silently switches to a ClawHub package. It does not: - Pin an immutable commit, tag digest, or package checksum. - Verify a cryptographic signature. - Confirm that the configured GitHub owner is trusted. - Verify that the GitHub repository and ClawHub entry represent the same publisher. - Present the source change to the user for approval. - Audit downloaded content before placing it in the active skills directory. The GitHub owner is loaded from a user-writable configuration file. Additionally, the broad `catch` block treats every clone failure as authorization to install from a different source. Network errors, an existing destination directory, repository removal, or other unrelated failures can therefore unexpectedly select the fallback supply channel. Although this function does not explicitly execute a downloaded script immediately, it writes third-party content into the active OpenClaw skills area. That content may subsequently be loaded or executed by the agent framework. ### Attack Path 1. An attacker compromises a trusted upstream GitHub account or ClawHub entry, takes over an abandoned name, or influences the configured GitHub username. 2. The attacker publishes modified Skill content under the expected skill name. 3. A user invokes `update`. 4. The Skill clones the current m ...[truncated 1113 chars]
Remediation
View remediation
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
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (12)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The skill’s declared purpose is version-difference detection, but the documented behavior includes broader capabilities such as initialization that writes local tracking files, add/remove state management, auto-update actions, and scheduled execution. This mismatch is security-relevant because users may grant trust based on a narrow description while the skill performs persistence, local configuration access, network retrieval, and potentially software installation/update actions beyond what was clearly disclosed.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill is presented as a version-difference checker, but it also performs remote update/install actions that modify the user's local environment. This expands the trust boundary significantly: a user invoking a seemingly read-only check utility may end up cloning or installing untrusted code from GitHub or ClawHub into their skills directory.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The code executes shell commands to clone repositories and install packages even though the skill's stated purpose is version checking. This can lead to arbitrary external code being fetched and installed, and the shell invocation increases risk because repository targets are influenced by configuration and command arguments rather than a tightly constrained allowlist.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README states that a cron job is 'automatically added to crontab' every 30 minutes, but it does not clearly warn the user that the skill modifies a system scheduling configuration. Silent or poorly disclosed persistence-style changes are security-relevant because they create ongoing execution and can surprise users, increasing the blast radius if the skill is buggy or compromised.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The initialization flow states that it automatically pulls remote skill data and generates local tracking files, but the description does not warn users about these network and filesystem side effects before first run. This can lead to uninformed consent and unexpected local state changes, which is especially risky for a skill that inventories installed tools and persists metadata.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill documents installation of a recurring cron job that performs periodic network checks and writes logs, but this persistent background behavior is not prominently disclosed as a security-sensitive action. Persistence mechanisms can materially change system behavior, generate continuous outbound requests, and create log files containing environment or operational data.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The top-level description is written as a Chinese-only natural-language instruction/description, with no indication that the user can choose another language or locale. Under the policy, forcing a specific language without opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The comments and logic imply online version data comes only from ClawHub, but the update path also pulls from GitHub. This mismatch is dangerous because it obscures the real remote trust sources, making users and reviewers believe the skill is limited to one ecosystem when it can fetch code from another, user-configurable source.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Repository cloning and package installation are side-effecting operations, but the code gives no warning or interactive confirmation before contacting external services and modifying the local skills directory. In a skill context, this is risky because users may reasonably expect informational commands, not software deployment behavior.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README content is presented entirely in Chinese and does not offer an alternative language or indicate that the skill is intended only for a Chinese-speaking or region-specific audience. This can violate language/locale policy where user choice or documented justification is required.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
97% confidence
Finding

The manifest description forces a specific language presentation, and the rest of the skill instructions are likewise Chinese-only. There is no indication that the skill is region-specific or that users can opt into this locale, which conflicts with the language/locale policy described in the audit rules.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

The skill reads ~/.openclaw/.backup.env to load configuration values, which is access to a user-local environment-style file that may contain sensitive settings. The file access is not accompanied by any warning or explanatory comment indicating that local configuration data will be read.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
index.js:61