Back to skill

Security audit

110 Deep Research Pro

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent web research helper, but it uses an unsafe, unrestricted shell-based page fetch pattern that users should review before installing.

Install only if you are comfortable with the agent making external web requests and writing local research reports. Run it in an environment where arbitrary page fetches cannot reach internal services or sensitive metadata endpoints, and prefer adding URL validation or a safer fetch helper before use.

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
SKILL.md:58
Finding
Unsafe URL Interpolation Enables Command Injection and Internal Resource Access<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:58-65` **Vulnerability Type**: Unsafe shell interpolation and unrestricted URL fetching **Risk Level**: Medium ### Vulnerable Code ```bash curl -sL "<url>" | python3 -c " import sys, re html = sys.stdin.read() # Strip tags, get text text = re.sub('<[^>]+>', ' ', html) text = re.sub(r'\s+', ' ', text).strip() print(text[:5000]) " ``` ### Technical Analysis The workflow instructs the agent to substitute a URL obtained from research results into a shell command. No validation, escaping mechanism, protocol allowlist, destination filtering, or argument-safe process invocation is specified. If the agent performs literal textual substitution, a URL containing shell metacharacters or quotation marks could escape the quoted argument and introduce additional shell commands. Execution would occur with the privileges of the account running the agent. The command also uses `curl -L`, which follows redirects without requiring each destination to be revalidated. An attacker-controlled public URL could redirect the request to localhost, a private network address, a link-local service, or a cloud metadata endpoint. Retrieved content would then enter the agent's context and could be exposed through the generated report. The command does **not** directly pipe downloaded code to Bash. Its response body is passed to a fixed Python text extraction program, so the pre-scan's characterization as direct remote payload execution is not supported. The risk instead arises from unsafe command construction and unrestricted outbound retrieval. ### Attack Path 1. An attacker supplies a crafted research URL or causes it to appear in search results. 2. The agent selects that URL for the documented deep-read operation. 3. The agent inserts the URL into the shell command without robust argument handling. 4. Either: - shell syntax embedded in the substituted value escapes the quoted argument and executes commands under the ...[truncated 1109 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not construct a shell command through textual URL interpolation. Pass the URL as a separate process argument using an execution API that does not invoke a shell. 2. If a shell is unavoidable, supply the URL through a positional parameter and apply robust shell quoting rather than inserting it into command text. 3. Permit only `https` and, if strictly necessary, `http`. Reject local-file, data, FTP, and other schemes. 4. Reject URLs containing credentials and block loopback, private, link-local, multicast, unspecified, and reserved IPv4 and IPv6 destinations. 5. Resolve the hostname before connecting and validate all resolved addresses. Reperform validation after DNS resolution changes. 6. Disable redirects or validate the scheme, hostname, and resolved destination of every redirect before following it. 7. Apply connection and total timeouts, response-size limits, content-type checks, and download limits. 8. Run network retrieval in a restricted environment without access to sensitive internal networks, metadata services, credentials, or unnecessary filesystem locations. 9. Treat retrieved pages as untrusted data and prevent their text from being interpreted as agent instructions. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (7)

External Script Fetching

High
Category
Supply Chain
Content
For the most promising URLs, fetch full content:

```bash
curl -sL "<url>" | python3 -c "
import sys, re
html = sys.stdin.read()
# Strip tags, get text
Confidence
93% confidence
Finding
The skill instructs fetching arbitrary URLs with curl and piping untrusted remote content directly into an inline Python processing step. Although the Python snippet only strips HTML tags, this pattern enables server-side request behavior against attacker-controlled URLs, increasing exposure to SSRF-like access to internal resources, retrieval of sensitive local-network content, and unsafe processing of untrusted data without validation or network restrictions.

Vague Triggers

Medium
Confidence
96% confidence
Finding
The instruction says 'When the user asks for research on any topic,' which is a very broad activation condition for a markdown skill description. It does not define boundaries, exclusions, or negative examples, so ordinary requests that merely mention research could unintentionally match this skill.

Context-Inappropriate Capability

Medium
Confidence
87% confidence
Finding
The manifest describes a multi-source research agent that searches, synthesizes, and delivers reports. The documented ability to spawn additional sessions/sub-agents is not an obvious requirement of that purpose and introduces orchestration capability beyond straightforward research execution.

Skill Enumeration

Medium
Category
Agent Snooping
Content
```
sessions_spawn(
  task: "Run deep research on [TOPIC]. Follow the deep-research-pro SKILL.md workflow.
  Read /home/clawdbot/clawd/skills/deep-research-pro/SKILL.md first.
  Goal: [user's goal]
  Specific angles: [any specifics]
  Save report to ~/clawd/research/[slug]/report.md
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Missing User Warnings

Low
Confidence
90% confidence
Finding
The skill description states it performs full-page content fetching, which implies outbound network requests to third-party sites, but the README does not include any warning about contacting external services. For markdown files, behaviors affecting privacy or system/network activity should be disclosed so users understand that their research queries and requested URLs will be sent externally.

Missing User Warnings

Low
Confidence
88% confidence
Finding
The markdown explicitly advertises 'Save to file' as a feature, but does not warn users that running the tool with output options will write data to the local filesystem. Because this README is the primary usage surface for the skill, it should disclose file-modifying behavior so users understand the impact before invoking it.

Description-Behavior Mismatch

Low
Confidence
76% confidence
Finding
The description presents the skill as a research agent that needs no API keys, which is true literally, but the documentation also frames it as 'self-contained' while requiring an external ddg-search skill/script and curl-based web access. This creates a mild description-to-behavior mismatch because the capability depends on external tooling and network access not evident from the concise manifest description.

Static analysis

No suspicious patterns detected.