Back to skill

Security audit

Scouts Ai Skill

Security checks for vulnerabilities and agentic risk

Overview

This skill coherently teaches an agent to run public web searches through SCOUTS-AI, with disclosed network use and reasonable privacy cautions.

Install only if you are comfortable with agents sending search terms to scouts-ai.com. Do not use it for confidential prompts, secrets, internal URLs, private code names, credentials, or personal data; hosts should ideally restrict exec so curl can only reach the documented HTTPS endpoint.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (13)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description says the skill searches the public web through the SCOUTS-AI external /api/search endpoint. The supplied code does not access that endpoint or the public internet at all. Instead, it creates temporary files, launches a localhost Python HTTP server, issues a curl request to a local static JSON file, verifies response handling, and cleans up resources. That is a smoke/integration test for request mechanics, not the advertised search capability. While curl usage is related, the primary purpose and accessed resources materially differ from the description.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This is a clear description-behavior mismatch. The declared purpose is an operational search skill that should query https://scouts-ai.com/api/search for fresh web results. The actual code chunk is a validation script for the skill package itself. It inspects frontmatter in SKILL.md, checks bash snippets for required safety patterns, verifies license/readme contents, and invokes a local smoke test. While it references the search endpoint in regex checks, it does not itself perform searches or access the public web. Its primary purpose is repository validation/QA, not internet search.

Content

No source excerpt is available for this finding.

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · scripts/smoke.sh (reported line 29)May include surrounding context.

sh
>"$server_log" 2>&1 </dev/null &
server_pid=$!
disown "$server_pid" 2>/dev/null || true
trap 'kill "$server_pid" 2>/dev/null || true; rm -rf "$scratch"' EXIT

# Wait for server to accept connections (max ~2s).
for _ in $(seq 1 20); do

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · scripts/smoke.sh (reported line 39)May include surrounding context.

sh
>"$server_log" 2>&1 </dev/null &
server_pid=$!
disown "$server_pid" 2>/dev/null || true
trap 'kill "$server_pid" 2>/dev/null || true; rm -rf "$scratch"' EXIT

# Wait for server to accept connections (max ~2s).
for _ in $(seq 1 20); do

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill instructs use of the host's exec/shell capability and also relies on reading local temp files, but it does not declare an explicit tool scope such as allowed-tools or permissions. That creates avoidable overreach risk because a host may expose broader shell or file capabilities than the skill actually needs, increasing blast radius if the skill is misused or if later edits add unsafe commands.

Content

No source excerpt is available for this finding.

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

Scanner excerpt · SKILL.md (reported line 43)May include surrounding context.

md
Query parameters:

| Name    | Required | Default       | Description                                                                                       |
| ------- | -------- | ------------- | ------------------------------------------------------------------------------------------------- |
| `q`     | yes      | -             | Search query, 1–512 chars, trimmed and lowercased server-side.                                    |
| `lang`  | no       | omitted       | BCP-47-like language tag (`en`, `en-US`, `de`) for results, or the literal `all` to search across all languages. When omitted, the backend sends no language filter. |

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

The skill explicitly sends user-derived query text to an external third-party service over the network. Although the file warns not to send secrets or private data, this is still a real external transmission path, and in an agent context users or upstream prompts may inadvertently include sensitive internal terms, hostnames, code identifiers, or PII in q.

Content

Scanner excerpt · SKILL.md (reported line 86)May include surrounding context.

md
## How to call

Use `curl` via `exec`. Let curl URL-encode the query with `--data-urlencode`;
do not shell-escape it manually. Always capture the HTTP status and response
headers so you can honour rate limits and surface upstream errors. Use a
per-call temp dir with restricted permissions and clean it up when the call

Session Persistence

Medium
Category
Rogue Agent
Confidence
65% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/smoke.sh (reported line 25)May include surrounding context.

sh
)"

server_log="$scratch/server.log"
nohup python3 -m http.server "$port" --bind 127.0.0.1 --directory "$scratch" \
  >"$server_log" 2>&1 </dev/null &
server_pid=$!
disown "$server_pid" 2>/dev/null || true

Session Persistence

Medium
Category
Rogue Agent
Confidence
65% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/smoke.sh (reported line 28)May include surrounding context.

sh
nohup python3 -m http.server "$port" --bind 127.0.0.1 --directory "$scratch" \
  >"$server_log" 2>&1 </dev/null &
server_pid=$!
disown "$server_pid" 2>/dev/null || true
trap 'kill "$server_pid" 2>/dev/null || true; rm -rf "$scratch"' EXIT

# Wait for server to accept connections (max ~2s).

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/smoke.sh (reported line 41)May include surrounding context.

sh
tmpdir=$(mktemp -d -t scouts-ai.XXXXXX)
trap 'rm -rf "$tmpdir"; kill "$server_pid" 2>/dev/null || true; rm -rf "$scratch"' EXIT

status=$(curl -sS --get "http://127.0.0.1:$port/search.json" \
  -D "$tmpdir/headers.txt" \
  -w '%{http_code}\n' \
  -o "$tmpdir/body.json")

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/validate.sh (reported line 40)May include surrounding context.

sh
"mktemp -d":              r"\bmktemp\s+-d\b",
    "umask 077":              r"\bumask\s+077\b",
    "trap cleanup":           r"\btrap\b.*\brm\b",
    "curl -D headers":        r"\bcurl\b.*-D\b",
    "curl -w http_code":      r"-w\s+.*%\{http_code\}(?!\w)",
    "no fixed /tmp paths":    r"/tmp/[A-Za-z0-9_\-]+\.(txt|json|log|body)\b",
}

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The README instructs the agent to send search queries to a third-party public web service but does not explicitly warn that user-provided content may be transmitted off-host. That creates a real privacy and data-handling risk if sensitive prompts, internal URLs, or proprietary text are used as search terms, even though the endpoint itself is the intended function of the skill.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

Lines L02-L03 describe the validation as local-only with no external network calls. However, at L66-L67 the script executes scripts/smoke.sh, and given this skill's purpose and the comment 'Smoke test the curl wrapper pattern offline', the file's own documentation creates ambiguity about whether network activity can occur; the earlier blanket claim is stronger than what this file itself guarantees.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.