Back to skill

Security audit

Product Desc

Security checks for vulnerabilities and agentic risk

Overview

The skill includes useful product-description templates, but it also ships an unclear utility that can save user input locally without explaining that behavior.

Review this before installing. The product-description template script appears harmless, but the package also includes a generic local data utility that can retain product details or search terms in plaintext under the user's data directory. Avoid entering confidential product plans, credentials, customer data, or unpublished business information unless the publisher removes or clearly documents that storage behavior.

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/script.sh:6
Finding
Undisclosed Plaintext Persistence of User-Supplied Data<![CDATA[ ## Vulnerability Details **File Location**: `scripts/script.sh:6-9`, `scripts/script.sh:34`, `scripts/script.sh:58-60`, `scripts/script.sh:67-69`, and `scripts/script.sh:76-79` **Vulnerability Type**: Undisclosed plaintext storage, insufficient filesystem hardening, and unnecessary data retention **Risk Level**: Medium ### Vulnerable Code ```bash DATA_DIR="${PRODUCT_DESC_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/product-desc}" DB="$DATA_DIR/data.log" mkdir -p "$DATA_DIR" ``` ```bash _log() { echo "$(date '+%m-%d %H:%M') $1: $2" >> "$DATA_DIR/history.log"; } ``` ```bash cmd_add() { echo "$(date +%Y-%m-%d) $*" >> "$DB"; echo " Added: $*" _log "add" "${1:-}" } ``` ```bash cmd_search() { grep -i "$1" "$DB" 2>/dev/null || echo " Not found: $1" _log "search" "${1:-}" } ``` ```bash cmd_export() { [ -f "$DB" ] && cat "$DB" || echo "No data" _log "export" "${1:-}" } ``` ### Technical Analysis The skill is documented as a product-description, SEO, comparison, and localization helper. However, `scripts/script.sh` implements an unrelated persistent data utility that creates a local data directory and records caller-supplied values in plaintext. The `add` command writes all supplied arguments to `data.log`. The `_log` function also appends command names and selected arguments to `history.log`. Search terms are therefore retained as well. This storage behavior is not disclosed in `SKILL.md`, and the implementation provides no retention limits, sensitive-data warning, access-control initialization, or secure deletion mechanism. The directory and files inherit permissions from the executing process's current `umask`. The script does not enforce a restrictive mode such as owner-only access. On systems with permissive defaults, shared accounts, backups, or other local readers, retained product information may become accessible beyond its intended audience. The `PRODUCT_DESC_DIR` environment variable permits storage to be redirected ...[truncated 1946 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove `scripts/script.sh` if it is unrelated boilerplate and route the documented product-description commands exclusively through `scripts/desc.sh`. 2. If persistent storage is genuinely required, document exactly what is stored, why it is stored, where it is stored, and how users can inspect and delete it. 3. Enforce restrictive permissions before creating storage: ```bash umask 077 install -d -m 700 -- "$DATA_DIR" ``` 4. Create data files with owner-only permissions and verify that existing targets are regular files owned by the expected user. 5. Reject symbolic links and unexpected file types before writing. Where practical, use file-opening mechanisms that provide no-follow semantics. 6. Validate or constrain `PRODUCT_DESC_DIR`; resolve its canonical parent and reject unsafe, shared, or unexpected paths. 7. Do not log raw command arguments by default. Record only non-sensitive operational metadata, or make logging explicit and opt-in. 8. Implement retention limits and an actual deletion command that removes requested records rather than only printing a success message. 9. Clearly warn users not to submit credentials, personal data, confidential product information, or other secrets to commands that persist input. 10. Add automated tests covering restrictive permissions, symbolic-link rejection, path validation, data deletion, and disabled-by-default argument logging. ]]>
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (7)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The declared description says this skill generates product descriptions and related marketing/SEO content. The supplied code instead implements a general-purpose command-line data/log management tool. Its main functions are creating a data directory, writing entries to a local log database, listing/searching/exporting those entries, and recording command history. There is no logic for text generation, SEO optimization, bullet-point extraction, competitor comparison, or multilingual localization. The primary purpose is materially different from the declared purpose, so this is a clear mismatch.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The implementation materially diverges from the declared skill purpose: instead of generating product descriptions, it provides a generic local data-management CLI with commands to add, list, search, and export stored content. This kind of capability mismatch is dangerous because it can hide unauthorized data collection or persistence behavior behind an innocuous skill description, defeating user trust and review expectations.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The skill says to 'Use when writing product descriptions' and emphasizes that anyone can use it quickly, but it does not define clear trigger boundaries, input constraints, or exclusions. Overly broad invocation guidance can cause an agent to activate the skill in loosely related contexts, increasing the chance of unnecessary data exposure to the skill or inappropriate autonomous use.

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
The script's generated guidance and prompts are written in Chinese, and the skill does not state that users may choose another language. This creates a natural-language locale policy concern because the skill effectively defaults to a specific language without opt-in.

Intent-Code Divergence

Medium
Confidence
96% confidence
Finding
The header and help text explicitly present the tool as a 'Multi-purpose utility tool', contradicting the documented skill purpose of product-description generation. Such inconsistent self-description increases the risk that reviewers or users misunderstand what the skill actually does, and in the context of agent skills this ambiguity can conceal broader-than-expected functionality.

Natural-Language Policy Violations

Low
Confidence
75% confidence
Finding
The help output presents localization as a general capability, but the example explicitly uses "英语" and the rest of the script is Chinese-centric. While not a hard technical restriction, the natural-language framing does not clearly offer a free user language choice and may imply a default locale bias.

Natural-Language Policy Violations

Low
Confidence
95% confidence
Finding
This markdown file presents all usage guidance and best practices in Chinese, which effectively forces a specific language for users. The policy allows locale constraints only when users are given a choice or when the restriction is clearly documented and justified, neither of which appears here.

Static analysis

No suspicious patterns detected.