Back to skill

Security audit

amazon-jobs-research

Security checks for vulnerabilities and agentic risk

Overview

This is mostly a disclosed Crawlora API helper for public Amazon job searches, but its helper can send authenticated POST requests outside the documented job-search API scope.

Review this before installing if you will set a real Crawlora API key. The normal GET search/detail workflow is clear and limited, but the helper should ideally reject POST and request bodies so an agent or untrusted instruction cannot make undocumented authenticated calls that may consume credits or send unintended data to Crawlora.

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/crawlora.sh:34
Finding
Authenticated POST Requests Exceed the Skill's Declared API Scope<![CDATA[ ## Vulnerability Details **File Location**: `scripts/crawlora.sh`, lines 34–49 and 91–98 **Vulnerability Type**: Excessive HTTP method permissions and out-of-contract authenticated requests **Risk Level**: Medium ### Vulnerable Code ```bash method="GET" body="" args=() while [ $# -gt 0 ]; do case "$1" in -X) method="$2"; shift 2 ;; -d) body="$2"; shift 2 ;; *) args+=("$1"); shift ;; esac done [ "${#args[@]}" -ge 1 ] || { echo "usage: crawlora.sh [-X METHOD] /path [k=v ... | json-body]" >&2; exit 2; } path="${args[0]}" rest=("${args[@]:1}") # This skill's helper is limited to its documented Crawlora route set. Keep # caller-account surfaces and unrelated API routes out of the helper even if # someone supplies an undocumented path directly. case "$method" in GET|POST) ;; *) echo "only GET and POST are supported by the amazon-jobs-research skill" >&2 exit 2 ;; esac ``` ```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 The helper accepts `POST` through the `-X` option and attaches the user's `CRAWLORA_API_KEY` to the resulting request. It also permits an arbitrary JSON body to be supplied through `-d` or a positional argument. This behavior exceeds the minimum permissions required by the Skill. The endpoint specification in `reference/endpoints.md` defines only these operations: - `GET /amazon-jobs/job` - `GET /amazon-jobs/search` No POST operation is documented or required for Amazon job search or job-detail retrieval. Although the helper fixes the destination to `https://api.crawlora.net/api/v1` and allowlists the two route paths, those controls do not prevent an aut ...[truncated 2034 chars]
Remediation
<![CDATA[ ## Remediation Suggestions Enforce a route-to-method policy that permits only the methods declared in `reference/endpoints.md`. For this Skill, both routes should accept only GET. Recommended hardening steps: 1. Remove support for `POST`, `-X`, `-d`, and arbitrary request bodies from this helper. 2. Reject any explicit method other than GET. 3. Retain the fixed HTTPS base URL and exact route allowlist. 4. Add regression tests confirming that POST, PUT, PATCH, DELETE, and malformed method values are rejected before curl is executed. 5. Keep the existing API-key safeguards, private temporary configuration, and `@` rejection. A minimal policy could be implemented as follows: ```bash method="GET" while [ $# -gt 0 ]; do case "$1" in -X|-d) echo "custom methods and request bodies are not supported by the amazon-jobs-research skill" >&2 exit 2 ;; *) args+=("$1") shift ;; esac done case "$path" in /amazon-jobs/job|/amazon-jobs/search) ;; *) echo "path is not in the amazon-jobs-research skill catalog" >&2 exit 2 ;; esac ``` The request should then always use the GET branch, ensuring the helper cannot issue authenticated operations beyond the documented Skill functionality. ]]>
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 (8)

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 scope or allowed-tools restrictions. That omission can let an agent invoke shell capabilities more broadly than necessary, increasing the chance of unintended command execution or expansion beyond the intended API-only workflow.

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.

Static analysis

No suspicious patterns detected.