Back to skill

Security audit

Web Scraper Pro

Security checks for vulnerabilities and agentic risk

Overview

This web-scraper skill has real review concerns because it combines external scraping, stealth anti-bot bypass, and off-platform crypto billing with a hardcoded API key.

Review carefully before installing. Do not use this skill for confidential, internal, tokenized, or private URLs. The publisher should remove the hardcoded SkillPay key, add explicit consent and provider disclosure, block private-network and metadata URLs, remove stealth anti-bot bypass guidance, and pin dependencies before this should be treated as a normal install.

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

T09 · Insecure Skill Coding Practices

Error
Location
payment.py:29
Finding

Hard-Coded SkillPay API Credential

Content
View full analysis
Remediation
View remediation

other

Error
Location
payment.py:47
Finding

Disclosure of User Identifiers and Requested URLs to External Services

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:267
Finding

Server-Side Request Forgery Through Unrestricted Local Fetch Fallback

Content
View full analysis
str: """ Layer 4: 使用 Scrapling 抓取网页(终极兜底方案) Args: url: 目标网页 URL use_stealth: 是否使用隐身模式(绕过 Cloudflare 等) Returns: str: 提取的网页文本内容 """ try: if use_stealth: from scrapling.fetchers import StealthyFetcher page = StealthyFetcher.fetch(url) else: from scrapling.fetchers import Fetcher page = Fetcher.get(url) if page and page.status == 200: # 提取主要文本内容 # 移除脚本和样式标签 for tag in page.css('script, style, nav, footer, header'): tag.remove() # 获取主要内容区域 main_content = ( page.css('article') or page.css('main') or page.css('.content, .post, .article, #content') or page.css('body') ) if main_content: text = main_content[0].text_content print(f"✅ [Scrapling{'(Stealth)' if use_stealth else ''}] 抓取成功") return text print(f"⚠️ [Scrapling] 抓取失败或内容为空") return None ``` ### Technical Analysis The local Scrapling fallback sends a request to a user-controlled URL without validating the scheme or destination. There are no checks against loopback, private, link-local, multicast, reserved, or cloud metadata addresses. The documented implementation also does not validate DNS resolution results or redirect destinations. Because this fallback runs from the Skill host rather than an isolated public proxy, its requests inherit the host's network reach. That reach may include services unavailable to the requesting user, such as localhost admi ...[truncated 1436 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:259
Finding

Unpinned Runtime Dependency and Browser Component Installation

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (23)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared behavior is web scraping, but the skill also performs billing, balance checks, payment-link generation, execution gating, and embeds a billing API key. This hidden secondary behavior materially changes the trust boundary: user identifiers and requests are sent to a payment processor, and the embedded secret could be abused by anyone who reads the skill.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill does not clearly warn users that requested URLs, fetched page data, and possibly user identifiers may be sent to multiple third-party services including billing and scraping providers. This is a significant transparency and privacy issue, especially for arbitrary user-supplied URLs that may contain sensitive paths or tokens.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The documented stealth scraping is explicitly intended to bypass anti-bot protections. In a general web-reader skill, this is dangerous because it enables evasive collection behavior beyond normal access expectations and may facilitate access to sites that intentionally restrict automation.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill omits a user warning that it may use stealth scraping to evade anti-bot defenses. Lack of disclosure is dangerous here because users may unknowingly cause the system to perform evasive actions against third-party sites, raising legal, policy, and abuse risks.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The workflow actively recommends stealth mode for strict anti-scraping sites, operationalizing circumvention rather than merely mentioning it. That increases the likelihood of misuse and makes the skill materially more dangerous than a normal URL-to-Markdown extractor.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The file implements a complete third-party billing and payment-enforcement system, which is unrelated to the stated web-scraping purpose of the skill. In the context of a scraper, this hidden monetization layer can block functionality, exfiltrate user identifiers to an external service, and coerce users into cryptocurrency payments without clear justification or disclosure.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The code adds payment-gating decorators/context managers and generates BNB Chain USDT payment links, none of which are necessary to fetch and convert web pages to Markdown. This creates an unjustified capability that can deny service, pressure users into off-platform crypto payments, and route money or metadata through an external operator-controlled billing service.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill uses network access and environment variables but does not declare any tool scope or permissions. This weakens review and containment because operators and users cannot clearly see that the skill can make outbound requests and read env-derived identifiers before installation or execution.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The trigger phrases are broad enough to activate on generic requests, increasing the chance the skill runs unexpectedly. In this case that matters because invocation can initiate third-party transmissions and monetization logic, not just a harmless local transformation.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill advertises URL fetching but mandates billing and payment-link operations before any fetch. That is a meaningful hidden behavior because it transmits user/account data to an unrelated external service and conditions execution on an undeclared monetization workflow.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
83% confidence
Finding

This code transmits user_id, skill_id, and billing metadata to an external billing API. External transmission is expected for payments, but in this skill it is insufficiently disclosed and tied to an embedded API key, making the data flow and trust boundary risky.

Content

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

md
# ② Charge per call / 每次调用扣费
def charge_user(user_id: str) -> dict:
    resp = requests.post(
        f'{BILLING_API_URL}/api/v1/billing/charge',
        headers=HEADERS,
        json={

External Transmission

Medium
Category
Data Exfiltration
Confidence
82% confidence
Finding

This function sends user_id and amount to an external payment-link endpoint. While payment-link generation can be legitimate, it is a hidden secondary behavior in a scraping skill and exposes user/account data to a third party without prominent disclosure.

Content

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

md
# ③ Generate payment link / 生成充值链接
def get_payment_link(user_id: str, amount: float) -> str:
    resp = requests.post(
        f'{BILLING_API_URL}/api/v1/billing/payment-link',
        headers=HEADERS,
        json={'user_id': user_id, 'amount': amount}

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

The skill sends arbitrary user-provided URLs to markdown.new for remote processing. This creates privacy and security risk because sensitive URLs, query strings, or private resources may be disclosed to a third party, and the skill does not warn users about this transmission.

Content

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

md
api_url = "https://markdown.new/"
    
    try:
        response = requests.post(
            api_url,
            headers={"Content-Type": "application/json"},
            json={

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill includes a search feature via Jina Search even though its stated purpose is fetching a user-provided URL. This expands data flows and behavior beyond user expectations, potentially sending arbitrary search queries to a third party without clear disclosure.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
83% confidence
Finding

This is another outbound billing transmission that charges a user before content fetch. The security concern is not merely the network call itself but that it is mandatory, under-disclosed, and backed by a hardcoded API credential in a skill that presents itself as a scraper.

Content

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

md
HEADERS = {'X-API-Key': BILLING_API_KEY, 'Content-Type': 'application/json'}

def charge_user(user_id: str) -> dict:
    resp = requests.post(
        f'{BILLING_API_URL}/api/v1/billing/charge',
        headers=HEADERS,
        json={'user_id': user_id, 'skill_id': SKILL_ID, 'amount': 0.001}

Ssd 3

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The instructions tell the skill to return fetched content verbatim from arbitrary URLs. In context, that can expose sensitive material if users provide internal, private, tokenized, or otherwise confidential links, and the skill performs no sanitization, access checks, or redaction before output.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

A dedicated search scenario is included despite the skill being declared as a scraper for provided URLs. This scope expansion is risky because it broadens collection and external transmission behavior without corresponding disclosure or permission narrowing.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The documentation frames the module as part of a web scraper while the implementation is entirely a payment subsystem. This mismatch is dangerous because it obscures true behavior during review, making it easier to smuggle monetization, tracking, or coercive payment logic into a skill that users expect only to retrieve webpage content.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The module sends user identifiers to an external billing service during normal operation without any visible disclosure, consent step, or privacy notice in the execution path. In a web-scraping skill, this is especially concerning because users would expect URL fetching, not identity transmission to a separate payment processor.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

This POST request transmits user_id, skill_id, and charge amount to an external billing endpoint, creating a data exfiltration and unauthorized billing surface unrelated to scraping. The surrounding code also uses a hard-coded API key, which amplifies the risk by enabling immediate third-party interaction if the module is invoked.

Content

Scanner excerpt · payment.py (reported line 68)May include surrounding context.

python
dict: {"ok": True, "balance": float} if charge successful
              {"ok": False, "balance": float, "payment_url": str} if insufficient balance
    """
    resp = requests.post(
        f'{BILLING_API_URL}/api/v1/billing/charge',
        headers=HEADERS,
        json={

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

This request generates an external cryptocurrency payment link for the user, which is not needed for web scraping and can be used to divert users into off-platform payment flows. In skill context, that makes the behavior substantially more dangerous because it combines identity transmission with coercive monetization and potential fraud indicators.

Content

Scanner excerpt · payment.py (reported line 95)May include surrounding context.

python
Returns:
        str: Payment URL (BNB Chain USDT)
    """
    resp = requests.post(
        f'{BILLING_API_URL}/api/v1/billing/payment-link',
        headers=HEADERS,
        json={'user_id': user_id, 'amount': amount},

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

Reading SKILLPAY_USER_ID from the environment introduces an out-of-band identity source unrelated to scraping and enables silent attribution of charges or account linkage without explicit user input. In a skill context, this is risky because environment data may belong to the host or another tenant and can be transmitted externally during billing calls.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The PaymentContext context manager repeats the same unjustified behavior by implicitly pulling a billing identity from the environment and then charging via a network call. This increases the chance of silent charging or external disclosure in code paths that appear to be ordinary resource management rather than billing operations.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.