Back to skill

Security audit

Find Skills — Search Every Skill Registry at Once

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly does what it claims, but its unpinned skill-install path and under-disclosed persistent temp report make it something users should review before installing.

Install only if you are comfortable with a tool that queries public registries, reads the names of locally installed skills, and may help install other skills globally. Prefer a version-pinned Skills CLI, review any recommended third-party skill before installing it, and treat the `/tmp/find-skills-*.json` report as persistent local output that may need cleanup.

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

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/find.sh:206
Finding
Predictable Persistent Temporary Report Permits Symlink-Based File Overwrite## Vulnerability Details **File Location**: `scripts/find.sh:206` **Vulnerability Type**: Predictable temporary file and unsafe destination handling **Risk Level**: Medium ### Vulnerable Code ```bash RESULT_FILE="${TMPDIR:-/tmp}/find-skills-$(date +%s).json"; cp "$OUT" "$RESULT_FILE" ``` ### Technical Analysis The script copies its result to a filename constructed from the current Unix timestamp. Timestamp resolution is one second, making the destination predictable. Unlike files stored in the protected directory created with `mktemp -d`, this report is written directly into `${TMPDIR:-/tmp}` and is not removed by the existing exit trap. The `cp` operation does not atomically reserve a new file and does not verify that the destination is a regular file. If an attacker can create the predicted destination as a symbolic link before the copy occurs, `cp` may follow that link and overwrite its target with the report contents. Exploitability depends on local filesystem protections, permissions, and timing. Protections such as Linux `fs.protected_symlinks` may prevent attacks between different users in a sticky shared directory, but the script should not rely on optional operating-system hardening. An attacker controlling `TMPDIR` can also direct the persistent report to an untrusted location. The report contains the user's search query, source health data, locally matched installed-skill names, and public registry metadata. Its persistence also contradicts the documentation stating that temporary files are discarded on exit. ### Attack Path 1. A local attacker determines that the victim is about to execute the Skill. 2. The attacker predicts the destination name from the current timestamp, such as `/tmp/find-skills-1750000000.json`. 3. Before line 206 executes, the attacker creates that pathname as a symbolic link to a file writable by the victim: ```bash ln -s /path/to/victim-writable-file /tmp/find-skills-175000000 ...[truncated 983 chars]
Remediation
## Remediation Suggestions - Keep the report inside the already protected `$TMP` directory unless persistent output is explicitly requested. - If a persistent report is required, create it atomically with `mktemp` rather than constructing its name from a timestamp: ```bash umask 077 RESULT_FILE=$(mktemp "${TMPDIR:-/tmp}/find-skills.XXXXXXXX.json") || exit 1 cp -- "$OUT" "$RESULT_FILE" ``` - Apply `umask 077` before creating temporary artifacts so report files are readable and writable only by the invoking user. - Reject an untrusted or unsafe `TMPDIR`, or use a private runtime directory owned by the current user. - Remove the persistent report during the exit trap unless the user explicitly requests retention. - If writing to a caller-selected destination, use no-follow and exclusive-creation semantics, validate that the destination is not a symbolic link, and avoid overwriting existing files. - Update the documentation to accurately describe any report that intentionally persists after execution.
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (18)

Ae1

High
Category
analysis-evasion
Content
allowed-tools: Bash(bash scripts/find.sh*), Bash(scripts/find.sh*), Bash(curl *), Bash(jq *), Bash(gh *), Bash(unzip *), Bash(npx -y skills *), Bash(npx skills
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
allowed-tools: Bash(bash scripts/find.sh*), Bash(scripts/find.sh*), Bash(curl *), Bash(jq *), Bash(gh *), Bash(unzip *), Bash(npx -y skills *), Bash(npx skills
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
allowed-tools: Bash(bash scripts/find.sh*), Bash(scripts/find.sh*), Bash(curl *), Bash(jq *), Bash(gh *), Bash(unzip *), Bash(npx -y skills *), Bash(npx skills
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
allowed-tools: Bash(bash scripts/find.sh*), Bash(scripts/find.sh*), Bash(curl *), Bash(jq *), Bash(gh *), Bash(unzip *), Bash(npx -y skills *), Bash(npx skills
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
allowed-tools: Bash(bash scripts/find.sh*), Bash(scripts/find.sh*), Bash(curl *), Bash(jq *), Bash(gh *), Bash(unzip *), Bash(npx -y skills *), Bash(npx skills
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
allowed-tools: Bash(bash scripts/find.sh*), Bash(scripts/find.sh*), Bash(curl *), Bash(jq *), Bash(gh *), Bash(unzip *), Bash(npx -y skills *), Bash(npx skills
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
missions. Treat any discovered skill as untrusted third-party code: review its `SKILL.md` and any bundled scripts before running it, and be wary of low-install
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Lp1

High
Category
MCP Least Privilege
Confidence
75% confidence
Finding
The skill uses 'shell' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
An unpinned npm-based tool reference in the manifest creates a direct supply-chain risk path under the agent's permitted commands. Since this skill evaluates and helps install other skills, any compromise in the helper CLI could subvert recommendations, downloads, or installation steps.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
An unpinned npm-based tool reference in the manifest creates a direct supply-chain risk path under the agent's permitted commands. Since this skill evaluates and helps install other skills, any compromise in the helper CLI could subvert recommendations, downloads, or installation steps.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The trigger guidance is broad enough to activate on common requests like 'how do I do X', causing the skill to engage in many ordinary conversations. Because this skill performs network lookups and recommends third-party installations, over-broad invocation increases the chance of unnecessary external queries and social-engineering-style nudges toward untrusted code.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding
Allowing `npx skills` without version pinning makes runtime behavior dependent on the latest published npm package instead of a reviewed artifact. In a skill whose purpose is discovering and helping install third-party code, that increases exposure to supply-chain compromise and unexpected code execution.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding
Allowing `npx skills` without version pinning makes runtime behavior dependent on the latest published npm package instead of a reviewed artifact. In a skill whose purpose is discovering and helping install third-party code, that increases exposure to supply-chain compromise and unexpected code execution.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The repeated 'when to use' language lacks clear boundaries, so an orchestrator may invoke this skill for ambiguous requests that do not actually require third-party skill discovery. In context, that is risky because this skill is explicitly designed to search registries and steer users toward installation of external code, magnifying exposure when invoked unnecessarily.

Unrestricted Tool Access

Medium
Category
Excessive Agency
Content
| --- | --- | --- |
| `curl-pipe-install` | ⛔ risky | pipes a remote script straight into `sh`/`bash` — the #1 audit-failing pattern |
| `eval-remote` / `base64-pipe-exec` | ⛔ risky | executes fetched or obfuscated code at runtime |
| `broad-tool-grant` | ⚠ caution | `allowed-tools` grants `Bash(*)` or unrestricted tool access |
| `reads-secrets` | ⚠ caution | references `~/.ssh`, `~/.aws`, `.env`, private keys |
| `solicits-credentials` | ⚠ caution | asks the user to paste an API key / token / password |
Confidence
85% confidence
Finding
Skill grants unrestricted tool access without appropriate constraints. An agent with unfettered tool access can perform arbitrary actions including file modification, network requests, and code execution.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
The installation guidance tells users to run `npx -y skills add ...` without pinning the CLI version. This can cause users to execute unreviewed package code from the registry at install time, which is a classic supply-chain execution path.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding
Recommending `npx skills init <name>` without version pinning again relies on the latest npm package at runtime. While this is a lower-risk scaffolding path than installing arbitrary remote skills, it still executes code from an unpinned upstream package.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The script writes a persistent JSON file to a predictable /tmp-derived path containing the user's query, cross-registry results, and inferred locally installed skill names. On multi-user systems or systems with weak temporary-directory isolation, this can expose behavioral and environment metadata to other local users or processes, and the script does not clearly warn or ask consent before persisting it.

Static analysis

No suspicious patterns detected.