Back to skill

Security audit

Local Claw Skill Nest Client

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent private skill-repository client, but its install/update path can write outside the intended skills folder or execute unsafe archive handling when the configured repository is malicious or compromised.

Install only if you control and trust the configured Claw Skill Nest server. Avoid remote plaintext HTTP endpoints, replace the default API key, and treat install/update as persistent filesystem modification. The client should validate skill names, filenames, archive entries, and extracted paths before broad use.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/manage_local_claw_skill_nest.ts:95
Finding

PowerShell Command Injection Through an Unvalidated Skill Name

Content
View full analysis
{ try { if (process.platform === 'win32') { await run('powershell', [ '-NoProfile', '-Command', `Expand-Archive -Path \"${archivePath}\" -DestinationPath \"${targetDir}\" -Force`, ]); return true; } ``` The affected destination is constructed from the externally influenced Skill name: ```ts const skillDir = join(SKILLS_DIR, skillName); ``` ### Technical Analysis On Windows, `targetDir` is interpolated directly into a string passed to PowerShell's `-Command` argument. The backslashes before the double quotes are JavaScript string escapes; they do not provide PowerShell-safe escaping in the resulting command. The `targetDir` value includes `skillName`. The name is supplied through a command-line argument and must also match a name returned by the configured repository. A malicious or compromised repository can publish a specially crafted name containing a quotation mark and PowerShell syntax. If that name is selected for installation, the injected syntax becomes part of the PowerShell program. Using `spawn()` does not prevent this vulnerability because PowerShell is intentionally invoked with `-Command`, causing the supplied string to be interpreted as executable PowerShell source. ### Attack Path 1. An attacker controls or compromises the configured private Skill repository. 2. The repository returns a Skill whose `name` contains PowerShell metacharacters and injected commands. 3. The user installs that Skill using its exact repository-provided name. 4. `installSkill()` incorporates the name into `skillDir`. 5. `extractZip()` interpolates that directory into a PowerShell `-Command` string. 6. PowerShell parses and ...[truncated 423 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/manage_local_claw_skill_nest.ts:120
Finding

Path Traversal Through Skill Names and Repository-Provided Filenames

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/manage_local_claw_skill_nest.ts:95
Finding

Untrusted ZIP Archives Are Extracted Without Entry or Resource Validation

Content
View full analysis
{ try { if (process.platform === 'win32') { await run('powershell', [ '-NoProfile', '-Command', `Expand-Archive -Path \"${archivePath}\" -DestinationPath \"${targetDir}\" -Force`, ]); return true; } if (existsSync('/usr/bin/unzip') || existsSync('/bin/unzip')) { await run('unzip', ['-o', archivePath, '-d', targetDir]); return true; } } catch { return false; } return false; } ``` ### Technical Analysis Archives downloaded from the configured repository are passed directly to platform-specific extraction tools. The client does not inspect archive entries before extraction and does not enforce restrictions on: - Absolute or parent-relative entry paths. - Symbolic links and other special entries. - The number of archive entries. - Per-file or total expanded size. - Compression ratios. - Overwrites of existing files in the destination. Although individual extraction tools may implement some traversal protections, the implementation relies on platform-dependent behavior rather than enforcing its own security boundary. The `-o` and `-Force` options also permit replacement of existing destination files. ### Attack Path 1. An attacker controls or compromises the configured repository. 2. The attacker supplies a malicious ZIP archive containing dangerous paths, links, a very large expanded payload, or a high compression ratio. 3. The user installs or updates the Skill. 4. The archive is downloaded and passed directly to `unzip` or `Expand-Archive`. 5. Depending on extractor behavior, malicious entries may overwrite files or escape intended paths. Independently, a decompression bomb can consume exc ...[truncated 483 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/manage_local_claw_skill_nest.ts:15
Finding

API Credential Uses a Hardcoded Default and May Be Transmitted Over Plaintext HTTP

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:53
Finding

Documentation Executes an Unpinned Runtime Package Through npx

Content
View full analysis
` - `npx tsx scripts/manage_local_claw_skill_nest.ts update ` - `npx tsx scripts/manage_local_claw_skill_nest.ts upload [skill-name] [description]` ``` The displayed command names above are English translations of the documented operations; the security-relevant invocation is the unversioned `npx tsx` command. ### Technical Analysis The documented execution method invokes `tsx` through `npx` without a pinned version, committed lockfile, or integrity constraint. If `tsx` is unavailable locally, `npx` may retrieve executable package content from the configured package registry. Consequently, the code executed before this audited script starts can change independently of the Skill package. The effective runtime therefore depends on mutable registry state and the user's registry configuration. ### Attack Path 1. A user follows the documented `npx tsx` command. 2. No trusted, locally pinned `tsx` installation is available. 3. `npx` resolves and downloads a package version from the configured registry. 4. A compromised registry account, registry response, local registry configuration, or malicious package release supplies altered package content. 5. The downloaded package executes with the invoking user's privileges before or while launching the audited script. ### Impact Assessment A compromised runtime package can execute arbitrary code with the user's privileges. It could access local files and environment variables, including `SKILLHUB_API_KEY`, alter uploaded archives, replace downloaded content, or modify the user workspace. Exploitation depe ...[truncated 75 chars]
Remediation
View remediation
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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (10)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill documents access to environment variables and a local/private network service, but it does not declare any explicit tool scope or permissions boundaries. That makes the skill's operational capabilities less transparent to users and runtime policy, increasing the chance of unintended secret access or network actions against the local Skill Nest service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The skill requires SKILLHUB_URL and SKILLHUB_API_KEY and communicates with a local/private service, but it does not clearly warn users that data and credentials will be transmitted to that service. Even though the target is described as local/private, authenticated network communication can still expose sensitive content or secrets if the service endpoint is misconfigured or untrusted.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

Using npx tsx without pinning a specific version allows execution of whatever package version is resolved at runtime. In a compromised registry, poisoned cache, or dependency-confusion scenario, this can result in arbitrary code execution on the local machine when the documented command is run.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

Using npx tsx without pinning a specific version allows execution of whatever package version is resolved at runtime. In a compromised registry, poisoned cache, or dependency-confusion scenario, this can result in arbitrary code execution on the local machine when the documented command is run.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

Using npx tsx without pinning a specific version allows execution of whatever package version is resolved at runtime. In a compromised registry, poisoned cache, or dependency-confusion scenario, this can result in arbitrary code execution on the local machine when the documented command is run.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

Using npx tsx without pinning a specific version allows execution of whatever package version is resolved at runtime. In a compromised registry, poisoned cache, or dependency-confusion scenario, this can result in arbitrary code execution on the local machine when the documented command is run.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The skill states that installation writes into ~/.openclaw/workspace/skills/<name> but does not present a clear user-facing warning that install and update operations modify the local filesystem. For a skill that downloads or updates content from a local/private repository, lack of an explicit modification warning can mislead users about persistence and overwrite risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script hardcodes Chinese for error messages, console output, usage text, and even the accepted command names such as 安装, 更新, 列出, and 上传. This imposes a specific language/locale on all users with no opt-in or alternative, which matches the language-policy violation criteria.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The script downloads archives from the configured Nest server and then invokes host-native extraction tools (PowerShell or unzip) on that untrusted content. This expands the trust boundary from simple file transfer to local processing of attacker-controlled archives, increasing risk of archive-based attacks such as path traversal, overwrite of files under the skills directory, or abuse of external tooling behavior on malformed archives.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The manifest/documentation says the skill is used when installing or updating skills from the local/private claw-skill-nest. In code, '更新' is implemented by directly calling installSkill, which fetches the named skill from /api/skills and downloads it, rather than performing a distinct update flow or checking an already-installed local skill state.

Content

No source excerpt is available for this finding.