Back to skill

Security audit

zara-research

Security checks for vulnerabilities and agentic risk

Overview

The skill is a disclosed Zara research helper that sends user-directed catalog and store queries to Crawlora, with only limited scoping issues worth noting.

Install only if you are comfortable giving this skill access to your Crawlora API key and sending Zara search terms or store-location coordinates to Crawlora. Prefer using the documented GET examples; avoid POST or undocumented paths unless the publisher tightens the helper validation.

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

Note
Location
scripts/crawlora.sh:44
Finding
Overly Permissive HTTP Method and API Path Allowlist<![CDATA[ ## Vulnerability Details **File Location**: `scripts/crawlora.sh`, lines 44–65 and 99–102 **Vulnerability Type**: Excessive request capabilities and insufficient route validation **Risk Level**: Low ### Vulnerable Code ```bash case "$method" in GET|POST) ;; *) echo "only GET and POST are supported by the zara-research skill" >&2 exit 2 ;; esac # Reject path syntax that could smuggle a route through a shell glob check. case "$path" in ""|*[?#%]*|*..*|*//* ) echo "invalid path for the zara-research skill" >&2 exit 2 ;; esac case "$path" in /zara/categories) ;; /zara/category/*/products) ;; /zara/product/*) ;; /zara/search) ;; /zara/stores) ;; /zara/suggest) ;; *) echo "path is not in the zara-research skill catalog" >&2 exit 2 ;; esac ``` The accepted POST request is subsequently sent with the API credential: ```bash else [ -n "$body" ] || body="${rest[0]:-}" [ -n "$body" ] || body='{}' # Stream the body on stdin so curl never interprets a user value as its # @file shorthand (and cannot read local files supplied in a request body). printf '%s' "$body" | curl -fsS -X "$method" "${auth[@]}" \ -H "Content-Type: application/json" --data-binary @- "${base}${path}" fi ``` ### Technical Analysis All six Zara endpoints documented in `reference/endpoints.md` are read-only `GET` endpoints. The helper nevertheless accepts both `GET` and `POST`, including arbitrary JSON request bodies. POST access therefore exceeds the minimum capabilities necessary for the declared Zara research functionality. The path patterns `/zara/category/*/products` and `/zara/product/*` are also broader than the documented endpoint formats. The documentation requires numeric category and product identifiers, but shell wildcard matching accepts nonnumeric identifiers and may accept additional path content. Although characters such as `?`, `#`, `%`, path traversal sequences, and duplicate slashes are rejected, the al ...[truncated 1897 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove POST support and reject every method except GET: ```bash if [ "$method" != "GET" ]; then echo "only GET is supported by the zara-research skill" >&2 exit 2 fi ``` 2. Replace broad shell wildcard patterns with exact validation. Require numeric identifiers and prevent additional path segments: ```bash case "$path" in /zara/categories|/zara/search|/zara/stores|/zara/suggest) ;; *) if [[ "$path" =~ ^/zara/category/[0-9]+/products$ ]] || [[ "$path" =~ ^/zara/product/[0-9]+$ ]]; then : else echo "path is not in the zara-research skill catalog" >&2 exit 2 fi ;; esac ``` 3. Enforce endpoint-specific query parameters: - Reject all parameters for `/zara/categories`. - Permit only `query`, `section`, `limit`, and `offset` for `/zara/search`. - Permit only `query` for `/zara/suggest`. - Permit only `lat`, `lng`, `radius`, `pickup_only`, and `donation_only` for `/zara/stores`. - Reject query parameters on product and category detail routes unless explicitly documented. 4. Validate numeric ranges and types locally, including search limits, offsets, coordinates, radius, and boolean filters. 5. Keep the existing fixed HTTPS base URL, API-key character validation, private temporary curl configuration, cleanup trap, and rejection of curl `@file` query syntax, as these controls appropriately reduce credential redirection and local-file disclosure risks. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (9)

Lp3

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding
The skill instructs use of a shell helper script but does not declare any tool restrictions or allowed-tool scope. That creates an avoidable trust gap: an agent may permit broader shell execution than is necessary, increasing the chance of command misuse or unsafe expansion if future edits introduce user-influenced arguments.

External Transmission

Medium
Category
Data Exfiltration
Content
#!/usr/bin/env bash
# Crawlora REST helper — minimal, dependency-free (curl only).
# Calls https://api.crawlora.net/api/v1 with your Crawlora API key.
# Get a free key (2,000 credits/mo, no card) at https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills.
#
Confidence
70% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#!/usr/bin/env bash
# Crawlora REST helper — minimal, dependency-free (curl only).
# Calls https://api.crawlora.net/api/v1 with your Crawlora API key.
# Get a free key (2,000 credits/mo, no card) at https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills.
#
# Usage:
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#!/usr/bin/env bash
# Crawlora REST helper — minimal, dependency-free (curl only).
# Calls https://api.crawlora.net/api/v1 with your Crawlora API key.
# Get a free key (2,000 credits/mo, no card) at https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills.
#
# Usage:
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#!/usr/bin/env bash
# Crawlora REST helper — minimal, dependency-free (curl only).
# Calls https://api.crawlora.net/api/v1 with your Crawlora API key.
# Get a free key (2,000 credits/mo, no card) at https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills.
#
# Usage:
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
#!/usr/bin/env bash
# Crawlora REST helper — minimal, dependency-free (curl only).
# Calls https://api.crawlora.net/api/v1 with your Crawlora API key.
# Get a free key (2,000 credits/mo, no card) at https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills.
#
# Usage:
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
# Keep the API key out of the curl process command line. A private temporary
# config supplies the header and is removed automatically on exit.
curl_config="$(mktemp "${TMPDIR:-/tmp}/crawlora-curl.XXXXXX")"
chmod 600 "$curl_config"
trap 'rm -f "$curl_config"' EXIT
printf 'header = "x-api-key: %s"\n' "$CRAWLORA_API_KEY" >"$curl_config"
auth=(--config "$curl_config")
Confidence
80% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

External Transmission

Medium
Category
Data Exfiltration
Content
[ -n "$body" ] || body='{}'
  # Stream the body on stdin so curl never interprets a user value as its
  # @file shorthand (and cannot read local files supplied in a request body).
  printf '%s' "$body" | curl -fsS -X "$method" "${auth[@]}" \
    -H "Content-Type: application/json" --data-binary @- "${base}${path}"
fi
Confidence
70% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Low
Confidence
78% confidence
Finding
This markdown file states that all requests require the header `x-api-key: $CRAWLORA_API_KEY`, which implies access to sensitive credentials. The file provides no warning or guidance about handling that secret safely, despite documenting credential-dependent behavior in a user-facing skill reference.

Static analysis

No suspicious patterns detected.