Back to skill

Security audit

google-maps-research

Security checks for vulnerabilities and agentic risk

Overview

This Google Maps lookup skill is transparent about using Crawlora, but its helper can use your API key on broader API paths and methods than the documented workflow needs.

Install only if you are comfortable giving the skill access to a Crawlora API key and having requests sent to Crawlora. The provider should tighten the helper so each documented endpoint is bound to its exact HTTP method and place_id is limited to one path segment before this is treated as fully scoped.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/crawlora.sh:40
Finding
Overbroad API Route and HTTP Method Authorization## Vulnerability Details **File Location**: `scripts/crawlora.sh`, lines 40–66 **Vulnerability Type**: Improper API route and method authorization **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 google-maps-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 google-maps-research skill" >&2 exit 2 ;; esac case "$path" in /google/map/place/*) ;; /google/map/place/*/photos) ;; /google/map/place/*/reviews) ;; /google/map/search) ;; *) echo "path is not in the google-maps-research skill catalog" >&2 exit 2 ;; esac ``` ### Technical Analysis The helper intends to restrict authenticated requests to four documented Google Maps endpoints. However, the shell pattern `/google/map/place/*` accepts every nonempty suffix beneath `/google/map/place/`. In shell pattern matching, `*` can match slash-separated content, so the pattern accepts undocumented paths such as: ```text /google/map/place/example-id/undocumented/action ``` This broad pattern also appears before the narrower `/photos` and `/reviews` patterns, making those patterns ineffective as authorization boundar ...[truncated 1990 chars]
Remediation
## Remediation Suggestions Bind each permitted route to its exact HTTP method instead of validating methods and paths independently: ```bash case "${method}:${path}" in POST:/google/map/search) ;; GET:/google/map/place/*/photos|GET:/google/map/place/*/reviews) place_id="${path#/google/map/place/}" place_id="${place_id%/photos}" place_id="${place_id%/reviews}" case "$place_id" in ""|*/*) echo "invalid place_id" >&2; exit 2 ;; esac ;; GET:/google/map/place/*) place_id="${path#/google/map/place/}" case "$place_id" in ""|*/*) echo "invalid place_id" >&2; exit 2 ;; esac ;; *) echo "unsupported method or path" >&2 exit 2 ;; esac ``` Apply these additional controls: 1. Require `POST` exclusively for `/google/map/search`. 2. Require `GET` exclusively for place details, photos, and reviews. 3. Validate `place_id` as exactly one path segment and reject embedded `/` characters. 4. Match the `/photos` and `/reviews` forms explicitly rather than relying on a broad parent wildcard. 5. Add negative tests for arbitrary child paths, unsupported methods, empty IDs, embedded slashes, and trailing path components. 6. Where possible, enforce the same endpoint allowlist and method restrictions on the server side because client-side validation alone is not a security boundary.
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
96% confidence
Finding
The skill instructs the agent to execute a bundled shell script, but the manifest declares no explicit tool restrictions such as allowed shell usage. That creates unnecessary capability ambiguity: an agent/runtime may permit shell execution more broadly than intended, increasing the chance of command execution in contexts that have not been tightly scoped or reviewed.

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.