Back to skill

Security audit

ScrapingBee Fetch

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent ScrapingBee web-fetching skill with expected third-party API use, but users should avoid sending sensitive URLs and should be aware of unpinned Python dependencies.

Install only if you are comfortable sending requested URLs, rendering parameters, your ScrapingBee API key, and returned page content through ScrapingBee. Do not use it for private intranet pages, authenticated pages, or URLs containing tokens unless that data transfer is approved. For stronger security, pin dependencies or run it in a controlled environment.

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

T08 · Insecure Dependencies

Warning
Location
fetch.py:2
Finding

Unpinned Runtime Dependencies Permit Supply-Chain Code Execution

Content
View full analysis
=3.10" # dependencies = [ # "requests", # "python-dotenv" # ] # /// ``` `SKILL.md:23`: ```bash uv run fetch.py --url "https://example.com" ``` `README.md:40-43`: ```bash uv run fetch.py --url "https://example.com" ``` ### Technical Analysis The inline dependency declaration specifies `requests` and `python-dotenv` without exact versions or integrity hashes. The documented `uv run` command can therefore resolve and install whichever compatible package versions are available from the configured package index at execution time. Consequently, the repository does not fully determine the code that will execute. If a dependency release, transitive dependency, maintainer account, or configured package index is compromised, attacker-controlled code may be installed. Both declared packages are imported by `fetch.py`, so malicious module initialization code could execute within the invoking user's process. This is a supply-chain weakness rather than evidence that the currently named packages are malicious. ### Attack Path 1. An attacker compromises a declared dependency, one of its transitive dependencies, a package-maintainer account, or the package source used by the victim. 2. The attacker publishes or serves a malicious version that satisfies the unconstrained dependency declaration. 3. A user follows the documented command: ```bash uv run fetch.py --url "https://example.com" ``` 4. `uv` resolves and installs the attacker-controlled package because no reviewed version or integrity hash is enforced. 5. `fetch.py` imports the affected package: ```python import requests from dotenv import load_dotenv ``` 6. Mali ...[truncated 1012 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (6)

Tainted flow: 'params' from os.environ.get (line 42, credential/environment) → requests.get (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · fetch.py (reported line 59)May include surrounding context.

python
params["custom_google"] = "true"
        
    try:
        response = requests.get("https://app.scrapingbee.com/api/v1/", params=params, timeout=60)
        
        if response.status_code != 200:
            print(f"Error: {response.status_code} - {response.text}", file=sys.stderr)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The documented behavior materially differs from the implementation and omits important capabilities such as proxy/geolocation options and other request controls. Security reviewers and users rely on the description to understand what a skill will do; when behavior exceeds or differs from that description, risky actions can be hidden behind a benign-sounding interface.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · fetch.py (reported line 17)May include surrounding context.

python
import os
from dotenv import load_dotenv

# Load environment variables from .env file if present
load_dotenv()

# Get the API key from environment variables

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README describes use of the ScrapingBee API but does not clearly warn users that any URL they request, along with the fetched page content and related metadata, is transmitted to a third-party service for rendering and extraction. This can cause unintentional disclosure of sensitive internal URLs, tokens embedded in URLs, private web content, or regulated data if a user assumes the fetch happens locally.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding

The skill uses sensitive capabilities (environment access for an API key and outbound network access) but does not declare any explicit tool scope or permissions. That weakens reviewability and sandbox enforcement, making it easier for an agent or user to invoke networked behavior and secret usage without clear upfront consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill sends user-supplied URLs and resulting page content to a third-party service, but the documentation does not warn users about that external data transfer. This creates privacy and compliance risk because users may unknowingly submit internal URLs, credentials-in-URL, regulated content, or other sensitive material to an external processor.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.