Back to skill

Security audit

reddit-research

Security checks across malware telemetry and agentic risk

Overview

The skill is mostly a disclosed Reddit research integration, but its helper script can send the API key to an overridden destination and can call broader Crawlora endpoints than the Reddit-only purpose suggests.

Review this before installing if you plan to run it in shared, CI, or managed agent environments. Only use it where CRAWLORA_API_BASE cannot be overridden by untrusted input, avoid sending sensitive Reddit queries or private business context, and prefer a version that restricts the helper to documented Reddit GET endpoints.

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

Error
Location
scripts/crawlora.sh:18
Finding
API Key Disclosure Through an Unrestricted API Base Override<![CDATA[ ## Vulnerability Details **File Location**: `scripts/crawlora.sh`, lines 18–46 **Vulnerability Type**: Unvalidated destination override causing credential disclosure **Risk Level**: High ### Vulnerable Code ```bash base="${CRAWLORA_API_BASE:-https://api.crawlora.net/api/v1}" 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}") auth=(-H "x-api-key: ${CRAWLORA_API_KEY}") 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" ] && qs+=(--data-urlencode "$kv") done curl -fsS -G "${auth[@]}" "${qs[@]}" "${base}${path}" else [ -n "$body" ] || body="${rest[0]:-{}}" curl -fsS -X "$method" "${auth[@]}" \ -H "Content-Type: application/json" -d "$body" "${base}${path}" fi ``` ### Technical Analysis The script permits the request destination to be replaced through the inherited `CRAWLORA_API_BASE` environment variable. It does not validate the configured scheme, hostname, port, or path before constructing the request. At the same time, the script unconditionally adds the `CRAWLORA_API_KEY` value to the `x-api-key` header. Consequently, every invocation sends the credential to whichever server is selected by `CRAWLORA_API_BASE`, including an attacker-controlled server. This behavior contradicts the documented trust boundary in `SKILL.md`, which states that requests are sent to `https://api.crawlora.net/api/v1`. The vulnerability is exploitable when an attacker can influence the environment used to launch the skill, such as through a compromised wrapper, poisoned shell configuration, CI/CD variable, agent runner configuration, or deployment manifest. The helper als ...[truncated 1570 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Remove the destination override if it is not required.** Use a fixed API base: ```bash readonly base="https://api.crawlora.net/api/v1" ``` 2. **If configurability is required for testing, strictly allowlist destinations.** Reject every origin other than the explicitly approved HTTPS endpoint: ```bash base="${CRAWLORA_API_BASE:-https://api.crawlora.net/api/v1}" case "$base" in "https://api.crawlora.net/api/v1") ;; *) echo "Refusing untrusted CRAWLORA_API_BASE" >&2 exit 2 ;; esac ``` 3. **Use separate test credentials.** Test or staging destinations must never receive production API keys. Require a distinct environment variable and credential with minimal permissions for non-production environments. 4. **Constrain the request surface.** Since this skill documents read-only Reddit research, allow only `GET` requests and validate paths against the documented Reddit endpoint patterns. Reject absolute URLs, URL user information, unexpected schemes, control characters, and path traversal syntax. 5. **Preserve redirect safety.** Do not enable unrestricted redirect following while attaching authentication headers. If redirects become necessary, validate every destination and ensure credentials are never forwarded to a different origin. 6. **Harden launch environments.** Ensure CI/CD jobs, agent runners, wrappers, and deployment manifests cannot inject or override security-sensitive environment variables without authorization. ]]>

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (5)

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill instructs the agent to invoke shell commands (`scripts/crawlora.sh`, `curl`, `jq`) but does not declare any corresponding permissions or capability boundaries. That mismatch is dangerous because it can enable command execution in environments where reviewers or policy engines assume the skill is documentation-only or lower privilege than it actually is.

Tp4

High
Category
MCP Tool Poisoning
Confidence
88% confidence
Finding
A description-behavior mismatch is a real security concern because users and reviewers may trust the skill as Reddit-only research while the underlying capability appears broad enough to call arbitrary Crawlora endpoints and pass through raw requests. That creates a confused-deputy risk where the skill can be repurposed for unrelated data access or external actions beyond the declared scope.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The helper is documented as a generic Crawlora client with examples for Amazon, YouTube, Google, and trends APIs, which materially exceeds the stated Reddit-only purpose of the skill. In an agent setting, this broadens capability scope and can enable unintended data access or policy bypass if the wrapper is reused as a general external-fetch tool.

Description-Behavior Mismatch

Medium
Confidence
98% confidence
Finding
The script accepts an arbitrary path and HTTP method, then concatenates that path directly onto the API base URL, allowing callers to reach any Crawlora endpoint rather than Reddit-only operations. In the context of an agent skill, this is dangerous because the skill can be repurposed into a generic outbound API proxy, bypassing the skill's declared scope and increasing exfiltration and misuse risk.

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.

**12 endpoints across 1 platform group(s).**
Confidence
93% confidence
Finding
This skill is explicitly designed to send user-supplied Reddit queries, usernames, post IDs, domains, and subreddit names to an external third-party service at api.crawlora.net. While expected for the feature, outbound transmission creates a real data exposure boundary: sensitive user inputs could be disclosed to the provider, logged, retained, or processed outside the user's expectations.

VirusTotal

VirusTotal findings are pending for this skill version.

View on VirusTotal

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
SKILL.md:25