Back to skill

Security audit

URL to Markdown - Web Page Extract API

Security checks for vulnerabilities and agentic risk

Overview

This skill coherently documents a Scavio URL-extraction workflow, but users should avoid sending private or token-bearing links to the service.

Install/use this skill only if you are comfortable sending target URLs and fetched page contents to Scavio. Do not use it on password-reset links, signed downloads, private document links, URLs with tokens or personal data in query parameters, or authenticated/internal pages unless you explicitly intend that disclosure. Prefer the direct HTTPS examples or an isolated environment if you do not need the SDKs.

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

Warning
Location
SKILL.md:42
Finding

Potential Disclosure of Sensitive URL Data to a Third-Party Extraction Service

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
SKILL.md:186
Finding

Unverifiable Third-Party SDK Installation Instructions

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (7)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill does not clearly warn users that submitted URLs are fetched server-side by an external provider, which can leak confidential links, signed URLs, document locations, or embedded secrets in query strings. In an agent setting, lack of disclosure increases the risk of silent third-party data transmission.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The trigger guidance is broad enough that an agent may invoke this skill whenever a user pastes a link or asks about page contents, without first confirming that sending the URL to a third-party service is intended. That can cause unintended disclosure of sensitive URLs, internal document links, or private query parameters to Scavio.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This code sends user-supplied URLs to an external API, which is a real data egress path. Even though external fetching is the core purpose of the skill, it becomes dangerous if agents pass along sensitive URLs or content without explicit user awareness and consent.

Content

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

md
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

# 1. The common case: a page as clean Markdown, 1 credit
page = requests.post(f"{BASE}/api/v1/extract", headers=HEADERS,
    json={"url": "https://example.com/pricing"}).json()

print(page["data"]["content"][:500], page["data"]["content_length"])

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This example again demonstrates transmission of a target URL to Scavio, here for embedding/text extraction use cases that may encourage bulk ingestion of external content. The security issue is the same: unreviewed URLs may disclose sensitive resources or proprietary content to a third party.

Content

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

md
print(page["data"]["content"][:500], page["data"]["content_length"])

# 2. Plain text for an embedding pipeline, still 1 credit
plain = requests.post(f"{BASE}/api/v1/extract", headers=HEADERS,
    json={"url": "https://example.com/blog/post", "format": "text"}).json()

# 3. A client-rendered page: advanced renders JavaScript and STILL costs 1 credit

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

The advanced mode still transmits the user-provided URL externally and may fetch more complex pages, which can include authenticated app frontends or sensitive documentation endpoints. In an agent workflow, that increases the chance of sending unintended targets to a third party if invocation is too automatic.

Content

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

md
json={"url": "https://example.com/blog/post", "format": "text"}).json()

# 3. A client-rendered page: advanced renders JavaScript and STILL costs 1 credit
spa = requests.post(f"{BASE}/api/v1/extract", headers=HEADERS,
    json={"url": "https://example.com/app/docs", "mode": "advanced"}).json()

# 4. Raw HTML to parse yourself

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

Requesting raw HTML from an external service can expose the full page source of the target URL to that service, including embedded metadata, scripts, and possibly sensitive in-page information. Compared with cleaned markdown/text extraction, raw HTML increases the volume and sensitivity of transmitted content.

Content

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

json={"url": "https://example.com/app/docs", "mode": "advanced"}).json()

4. Raw HTML to parse yourself

raw = requests.post(f"{BASE}/api/v1/extract", headers=HEADERS, json={"url": "https://example.com", "format": "html"}).json()

text

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

The retry/escalation function automates repeated external requests for the same user-supplied URL, increasing the likelihood of transmitting sensitive links without deliberate review. While failures are not billed, automatic escalation expands third-party exposure and may make overbroad invocation more harmful.

Content

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

md
def read(url, format="markdown"):
    """normal (1cr) -> advanced (1cr) -> ultra (2cr). Only the successful call is billed."""
    for mode in ("normal", "advanced", "ultra"):
        r = requests.post(f"{BASE}/api/v1/extract", headers=HEADERS,
                          json={"url": url, "format": format, "mode": mode})
        if r.status_code == 200:
            data = r.json()["data"]

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
SKILL.md:40