Back to skill

Security audit

travel-hotel-research

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent travel research integration, but its curl helper has a credential-handling hardening gap that could expose the Crawlora API key in a locally influenced environment.

Install only if you are comfortable sending travel searches, dates, locations, listing IDs, and similar request details to Crawlora. Use a limited Crawlora key, avoid running it in shared or untrusted shell environments, and consider patching the helper to invoke curl with startup config disabled before relying on it.

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:149
Finding
Curl Startup Configuration Can Undermine Fixed-Destination Credential Protection<![CDATA[ ## Vulnerability Details **File Location**: `scripts/crawlora.sh`, lines 149–167 **Vulnerability Type**: Curl startup configuration injection affecting API credential confidentiality **Risk Level**: Medium ### Vulnerable Code ```bash auth=(--config "$curl_config") if [ "$method" = "GET" ]; then # -G + --data-urlencode URL-encodes each value (so spaces etc. are safe). qs=() for kv in ${rest[@]+"${rest[@]}"}; do [ -n "$kv" ] || continue # curl treats both @file and name@file forms as local-file input for # --data-urlencode. Reject @ outright so query arguments cannot disclose # local files to the Crawlora API. case "$kv" in *@*) echo "@ is not allowed in query arguments" >&2; exit 2 ;; esac qs+=(--data-urlencode "$kv") done curl -fsS -G "${auth[@]}" ${qs[@]+"${qs[@]}"} "${base}${path}" 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 attempts to protect `CRAWLORA_API_KEY` by storing the authentication header in a mode-`0600` temporary curl configuration file and using a fixed HTTPS API base URL. However, neither curl invocation begins with `-q` or `--disable`. Curl may automatically load a user startup configuration such as `.curlrc` before processing ordinary command-line options. If an attacker can influence that configuration file or curl's configuration lookup environment, the attacker may inject options that change transfer behavior or add an additional URL. The authentication header loaded through `--config "$curl_config"` may then be applied to an unintended transfer. This does not constitute a direct remote exploit by itself. Exploitation require ...[truncated 1987 chars]
Remediation
<![CDATA[ ## Remediation Suggestions Disable automatic curl startup configuration loading by placing `-q` as the first argument of every curl invocation: ```bash curl -q -fsS -G "${auth[@]}" ${qs[@]+"${qs[@]}"} "${base}${path}" ``` ```bash printf '%s' "$body" | curl -q -fsS -X "$method" "${auth[@]}" \ -H "Content-Type: application/json" --data-binary @- "${base}${path}" ``` Additional hardening should include: 1. Preserve the fixed HTTPS API base URL and route allowlist. 2. Continue storing the API key in a mode-`0600` temporary configuration file and deleting it on exit. 3. Consider explicitly controlling proxy behavior in environments where proxy variables or proxy configuration may be attacker-influenced. 4. Add automated tests that run the helper with a malicious `.curlrc` and verify that no startup directives are honored. 5. Document that search terms, dates, locations, and other request data are transmitted to Crawlora as part of the service's expected operation. ]]>
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
89% confidence
Finding
The skill invokes a shell helper (`scripts/crawlora.sh`) but does not declare any tool restrictions such as `permissions` or `allowed-tools`. That creates unnecessary execution latitude: if an agent can use shell broadly, user-controlled parameters like destination names or IDs may flow into command execution paths with less governance than intended.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The reference explicitly instructs the skill to send user-supplied travel queries, dates, IDs, and other request parameters to a third-party service at api.crawlora.net, but it provides no user-facing notice, consent flow, or data-minimization guidance. In a travel-research context, these fields can reveal sensitive itinerary and location information, so undisclosed external sharing creates a real privacy risk even if it is expected for functionality.

External Transmission

Medium
Category
Data Exfiltration
Content
Endpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).

All paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.

**71 endpoints across 10 platform group(s).**
Confidence
94% confidence
Finding
This file documents use of an external API endpoint and an API key header, confirming that user-provided search terms and identifiers leave the local agent boundary. External transmission is not inherently malicious, but in this skill it becomes security-relevant because the skill aggregates searches across many third-party travel and event providers without any accompanying warning, trust boundary explanation, or privacy controls.

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.

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.