Back to skill

Security audit

deep-scout

Security checks for vulnerabilities and agentic risk

Overview

This research skill largely matches its advertised purpose, but it needs review because it can fetch unrestricted URLs and leaves sensitive query state on disk without enforcing private permissions.

Install only if you are comfortable with a research skill sending queries and fetched page content through search, fetch, browser, Firecrawl, and LLM tooling. Avoid sensitive internal URLs or confidential research topics unless your runtime enforces safe network egress, and review/delete ~/.openclaw/state/deep-scout/state.json after use on shared machines.

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 (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/firecrawl-wrap.sh:21
Finding

Unrestricted HTTP(S) Targets Permit Server-Side Request Forgery

Content
View full analysis
&2 exit 1 fi # Run Firecrawl only when a bounded timeout command is available. TIMEOUT_BIN="$(command -v timeout 2>/dev/null || command -v gtimeout 2>/dev/null || true)" if [[ -z "$TIMEOUT_BIN" ]]; then echo "FIRECRAWL_UNAVAILABLE" exit 0 fi result=$("$TIMEOUT_BIN" 30 firecrawl scrape -- "$URL" --format markdown 2>/dev/null || echo "") ``` The related agent instructions apply similarly unrestricted URLs to all fetch tiers: ```text **Tier 1 — web_fetch (fast):** Call web_fetch(url) If content length >= 200 chars → accept, trim to max_chars_per_source **Tier 2 — Firecrawl (deep/JS):** If Tier 1 fails or returns < 200 chars: Run: bash "{baseDir}/scripts/firecrawl-wrap.sh" If output != "FIRECRAWL_UNAVAILABLE" and != "FIRECRAWL_EMPTY" → accept **Tier 3 — Browser (last resort):** If Tier 2 fails: Call browser(action="open", url=url) Call browser(action="snapshot") ``` ### Technical Analysis The Firecrawl wrapper validates only whether a URL begins with `http://` or `https://`. It does not parse and validate the destination hostname or resolved address. Consequently, it does not reject: - IPv4 or IPv6 loopback addresses. - RFC 1918 private network addresses. - Link-local addresses. - Cloud metadata service addresses. - Reserved, multicast, or otherwise non-public destinations. - Public hostnames that resolve to non-public addresses. - Redirects from an initially public URL to a prohibited destination. The same untrusted URL is used by `web_fetch`, Firecrawl, and browser-based fallbac ...[truncated 1658 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/run.sh:45
Finding

Research Queries Are Persisted Without Restrictive File Permissions

Content
View full analysis
"$STATE_FILE" <
Remediation
View remediation
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 (9)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description describes an end-to-end deep intelligence pipeline that transforms a query into a structured research report with citations. The supplied code does not implement such a pipeline. It only performs one bounded fetch/scrape step for a provided URL using Firecrawl, with basic validation and fallback behavior when dependencies are unavailable. This is a materially narrower and different primary purpose than the declared multi-stage search/filter/fetch/synthesize system.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill describes use of network access, environment variables, file reads, and file writes, but it does not declare an explicit tool scope such as permissions or allowed-tools. That creates an avoidable trust gap: the runtime may grant broader capabilities than users expect, and the skill can process local and remote data without clear upfront limitation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill sends user queries, search results, fetched page content, browser snapshots, and possibly URLs to multiple third-party services and tools, including web search, Firecrawl, browser automation, and LLM calls, without an explicit privacy warning. Users may unknowingly submit sensitive research topics, proprietary URLs, or extracted page content to external processors.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The config sets language: "en" as a fixed locale, which is a natural-language policy concern when no user opt-in or alternative language handling is documented in the file. This can impose a language constraint on all uses of the skill regardless of user preference.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The script writes persistent state to ${HOME}/.openclaw/state/deep-scout by default, which is outside the skill directory and occurs without an explicit user-facing notice or consent. Because the state includes the user query, pipeline configuration, URLs, fetched content, and final report material, sensitive research data may be stored in a broader, longer-lived location than the user expects, increasing confidentiality and privacy risk in shared or multi-tenant environments.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

The options table sets --language default to en, which can impose an English-language default on search and synthesis behavior. The file does not explicitly frame this as a user-selectable preference or provide opt-in language guidance beyond the raw flag.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The skill documents writing the final report to an arbitrary user-specified file but does not warn about overwriting local files or restricting output paths. In an agent context, this can lead to accidental modification of important files if the path is mis-specified or manipulated through natural-language tasking.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The pipeline metadata explicitly sets the language to "en", which indicates a fixed locale choice in the skill output/configuration. The file does not provide any user opt-in, alternative language option, or documented justification for restricting output to English.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The prompt sets Output language: {{language}} and later instructs the model to Write in {{language}}, which imposes a locale/language constraint in natural language. The file does not indicate that this language is user-selected, optional, or justified as a region-specific requirement, so it may violate the language/locale policy criterion.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.