Back to skill

Security audit

Smart Web Fetch Safe

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent web-fetching utility, but its default unrestricted URL fetching can expose internal services or sensitive network-only content from the agent environment.

Review before installing in any environment with access to internal networks, localhost services, cloud metadata, or sensitive intranet pages. Prefer running it in a network-restricted sandbox, configure an explicit allowlist, avoid remote mode for sensitive URLs, and pin dependencies before operational use.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/fetch.py:132
Finding

Unrestricted Server-Side Request Forgery and Redirect-Based Allowlist Bypass

Content
View full analysis
bool: """Check whether the domain is on the allowlist.""" if not ALLOWED_DOMAINS: return True parsed = urlparse(url) allowed = [d.strip() for d in ALLOWED_DOMAINS.split(",")] return parsed.netloc in allowed or any( parsed.netloc.endswith("." + d) for d in allowed ) ``` ```python def fetch_remote(url: str, max_chars: int = DEFAULT_MAX_CHARS) -> dict: """Remote cleaning mode using Jina Reader.""" try: clean_url = url.replace("https://", "").replace("http://", "") jina_url = JINA_READER_URL.format(url=clean_url) response = requests.get(jina_url, timeout=30) response.raise_for_status() ``` ```python def fetch_local(url: str, max_chars: int = DEFAULT_MAX_CHARS) -> dict: """Local parsing mode.""" try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } response = requests.get(url, headers=headers, timeout=30) response.raise_for_status() content = clean_html_local(response.text, max_chars) ``` ```python use_remote = args.remote or (DEFAULT_MODE == "remote" and not args.local) if use_remote: result = fetch_remote(url, args.max_chars) if not result["success"]: print( f"Remote fetch failed: {result['error']}, falling back to local...", file=sys.stderr ) result = fetch_local(url, args.max_chars) else: result = fetch_local(url, args.max_chars) ``` ### Technical Analysis The Skill accepts a caller-provided URL and issues an HTTP request from the Agent environment. When `ALLOWED_DOMAINS ...[truncated 3574 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:74
Finding

Unpinned Third-Party Dependencies Create a Non-Reproducible Installation

Content
View full analysis
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 (5)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill documentation declares executable capabilities that can access environment configuration and perform network requests, but it does not define an explicit tool scope such as permissions or allowed-tools. This creates an authorization gap where an agent or operator may invoke the skill without clear policy constraints, increasing the risk of unintended external access or data exposure, especially because the skill supports optional remote processing through a third-party service.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill is presented as privacy-first and local-first, but it can fetch arbitrary URLs and optionally relay requests through a third-party service. In an agent setting, this mismatch can cause unintended disclosure of user-supplied URLs or internal resource targets and weakens safety expectations around network access.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The remote cleaning path sends the target URL to an external service, which can expose sensitive browsing targets, internal URLs, or user workflow data to a third party. Because the relay happens in code without an explicit consent checkpoint near the network call, users and integrators may not realize data is leaving the local environment.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The file includes user-facing natural-language text in Chinese, such as the module description and multiple operational comments, while the skill does not indicate that it is intentionally limited to Chinese-speaking users or provide an opt-in language choice. This can violate a language/locale policy when a skill implicitly forces a specific language without user selection.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

Allowing all domains when no whitelist is configured defeats the safety posture implied by the module and enables unrestricted outbound fetching. In an agent environment, that can be abused to access attacker-chosen endpoints, including internal or sensitive network locations if network egress exists.

Content

No source excerpt is available for this finding.