Back to skill

Security audit

网页内容提取工具

Security checks across malware telemetry and agentic risk

Overview

This web extraction skill should be reviewed because it relies on a third-party API, stores an API key locally, and does not clearly scope what user data may be sent.

Install only if you are comfortable sending target URLs and related parameters to the XiaoBenYang service and storing XBY_APIKEY in a local .env file. Avoid using cookiesFile with sensitive authenticated sessions unless the publisher documents exactly how cookie data is handled, and prefer a version that narrows the remote tool allowlist and pins patched dependencies.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (20)

Lp3

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding
The skill exposes effective capabilities for environment access, local file read/write, and network use without declaring them, which prevents users and hosting platforms from understanding the real trust boundary. In this skill, those hidden capabilities are especially sensitive because they are used to collect, persist, and transmit an API key and potentially access local cookie files for authenticated web retrieval.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The stated purpose is a simple web-to-Markdown extractor, but the documented behavior includes sending requests to an external service, reading and writing API secrets, and exposing a more generic remote tool-calling pathway. That mismatch is dangerous because users may provide URLs, cookies, or credentials under the assumption of local processing when data is actually persisted and transmitted to a third party.

Intent-Code Divergence

Medium
Confidence
88% confidence
Finding
The documentation contains unrelated school-search workflow/examples, indicating copy-paste errors or poor maintenance around routing and tool invocation instructions. This is dangerous because it can cause an agent to invoke incorrect functions, mishandle parameters, or trust inaccurate operational guidance, increasing the risk of unintended data disclosure or misuse of the remote API.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The file implements a generic upstream MCP client that can invoke arbitrary remote tools, which is materially broader than the declared purpose of a webpage-to-Markdown extractor. This scope mismatch is dangerous because users or host systems may grant trust, network access, or secrets based on the narrower manifest, while the code actually provides a more general remote execution/invocation capability.

Context-Inappropriate Capability

Medium
Confidence
94% confidence
Finding
The call_tool interface accepts arbitrary tool names and parameter dictionaries and forwards them to the upstream service, creating a generic capability rather than a narrowly scoped extractor. In an agent skill context, this increases the risk of unintended data transfer or invocation of sensitive upstream actions that users did not expect from this skill.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The module implements API credential persistence and retrieval for an unrelated 'XBY_GAOKAO' service, which does not align with a web content extraction tool's stated purpose. This capability expands the skill's authority to manage secrets locally, increasing the chance of credential misuse, accidental disclosure, or hidden data exfiltration paths in a context where users would not expect it.

Context-Inappropriate Capability

Medium
Confidence
97% confidence
Finding
Persisting an API key into a local .env file gives the skill the ability to write sensitive credentials to disk, which is beyond the minimum necessary capability for webpage-to-Markdown extraction. Local plaintext secret storage can be exposed through source control mistakes, backups, shared workspaces, or later unintended reads by other components.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The skill does not warn users that requested URLs and optional authenticated-cookie context may be sent to an external API/service, which is a material privacy and security omission. In this context, the optional cookiesFile parameter can enable access to authenticated content, so undisclosed transmission could expose session-bearing or sensitive browsing context to a third party.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The code sends arbitrary parameters together with an API key to an external endpoint, but this file provides no user-visible disclosure, consent mechanism, or data minimization controls. In a skill environment, that can lead to silent exfiltration of user-supplied content or secrets to a third-party service under the guise of a simpler local transformation tool.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The code silently persists a provided API key to .env without any user-facing disclosure, making secret retention implicit rather than explicit. This is dangerous because users may assume a transient configuration change while the skill actually leaves long-lived plaintext credentials on disk.

Credential Access

High
Category
Privilege Escalation
Content
default_year: int = 2025

    def model_post_init(self, __context):
        # 强制从 .env 文件读取 XBY_APIKEY
        env_path = Path(".env")
        if env_path.exists():
            content = env_path.read_text(encoding="utf-8")
Confidence
89% confidence
Finding
.env

Credential Access

High
Category
Privilege Escalation
Content
def model_post_init(self, __context):
        # 强制从 .env 文件读取 XBY_APIKEY
        env_path = Path(".env")
        if env_path.exists():
            content = env_path.read_text(encoding="utf-8")
            for line in content.splitlines():
Confidence
89% confidence
Finding
.env"

Credential Access

High
Category
Privilege Escalation
Content
def save_api_key_to_env(api_key: str) -> bool:
    """将API key保存到.env文件"""
    try:
        env_path = Path(".env")
        lines = []
        if env_path.exists():
            lines = env_path.read_text(encoding="utf-8").splitlines()
Confidence
93% confidence
Finding
.env"

Credential Access

High
Category
Privilege Escalation
Content
def set_api_key(api_key: str) -> bool:
    """设置API key并持久化到.env"""
    if not api_key or not api_key.strip():
        return False
    api_key = api_key.strip()
Confidence
91% confidence
Finding
.env"

Unpinned Dependencies

Low
Category
Supply Chain
Content
requests>=2.31.0
pydantic>=2.7.0
pydantic-settings>=2.2.0
python-dotenv>=1.0.1
Confidence
96% confidence
Finding
requests>=2.31.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
requests>=2.31.0
pydantic>=2.7.0
pydantic-settings>=2.2.0
python-dotenv>=1.0.1
Confidence
87% confidence
Finding
pydantic>=2.7.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
requests>=2.31.0
pydantic>=2.7.0
pydantic-settings>=2.2.0
python-dotenv>=1.0.1
Confidence
87% confidence
Finding
pydantic-settings>=2.2.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
requests>=2.31.0
pydantic>=2.7.0
pydantic-settings>=2.2.0
python-dotenv>=1.0.1
Confidence
95% confidence
Finding
python-dotenv>=1.0.1

Known Vulnerable Dependency: requests==2.31.0 — 5 advisory(ies): CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi); CVE-2026-25645 (Requests has Insecure Temp File Reuse in its extract_zipped_paths() utility func) +2 more

Medium
Category
Supply Chain
Confidence
98% confidence
Finding
requests==2.31.0

Known Vulnerable Dependency: python-dotenv==1.0.1 — 1 advisory(ies): CVE-2026-28684 (python-dotenv: Symlink following in set_key allows arbitrary file overwrite via )

Low
Category
Supply Chain
Confidence
91% confidence
Finding
python-dotenv==1.0.1

VirusTotal

65/65 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.