Back to skill

Security audit

图表工具服务

Security checks across malware telemetry and agentic risk

Overview

The skill is advertised as a chart tool, but its artifacts include unrelated XBY/Gaokao credential handling and silent API-key persistence that users would not reasonably expect.

Review carefully before installing. This skill may ask for or use an API key unrelated to chart generation and store it in a local .env file. Only proceed if you understand the XBY/Gaokao service dependency, are comfortable with local secret persistence, and can review or isolate the environment and credentials used.

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

Lp3

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding
The skill describes capabilities that include environment access, file read/write, and network use, but it declares no corresponding permissions or trust boundaries. This creates a transparency and review gap: an operator may approve a seemingly simple chart tool without realizing it can persist secrets, read local state, and make outbound requests.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The workflow is inconsistent with the stated chart-only purpose and instructs the agent to solicit, store, and use an API key tied to an unrelated service/domain. Such scope mismatch is a strong indicator of deceptive behavior or credential harvesting, because users invoking a chart skill would not reasonably expect unrelated secret collection and persistence.

Intent-Code Divergence

High
Confidence
95% confidence
Finding
The example tool call references a school-search function that does not match the declared chart interface, demonstrating that the skill instructions are internally contradictory and likely copied from a different capability. In security terms, this kind of mismatch can misroute user requests, trigger unintended tool execution, or conceal broader behavior than the advertised chart-only scope.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
This configuration module materially diverges from the stated chart-service purpose by handling unrelated 'XBY' / '小笨羊高考' credentials and endpoints. That mismatch is dangerous because it can silently route users' secrets to an unexpected external service and indicates possible code reuse or hidden functionality inconsistent with the advertised skill.

Context-Inappropriate Capability

Medium
Confidence
92% confidence
Finding
The skill persists an API key to a local .env file even though that behavior is not justified by the declared chart-tool functionality. Persisting secrets to disk increases the chance of credential leakage through source control, local file disclosure, backups, or multi-user environments.

Intent-Code Divergence

Medium
Confidence
90% confidence
Finding
The docstring identifies the module as a different skill ('小笨羊高考'), which contradicts the manifest for a chart tool. Identity mismatches are a supply-chain red flag because they suggest copied or repurposed code with undisclosed behaviors, making it harder to trust where configuration and secrets are going.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The code writes the supplied API key to .env without any warning, confirmation, or disclosure that the secret will be persisted. Users may believe they are providing a session-only key, while the skill stores it on disk where it may be recoverable by other processes or later accidentally committed.

Credential Access

High
Category
Privilege Escalation
Content
model_config = SettingsConfigDict(
        env_prefix="XBY_GAOKAO_",
        env_file=".env",
        env_file_encoding="utf-8",
        extra="ignore",
    )
Confidence
86% confidence
Finding
.env"

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
94% 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
94% confidence
Finding
.env"

Credential Access

High
Category
Privilege Escalation
Content
if line.startswith("XBY_APIKEY="):
                    self.api_key = line.split("=", 1)[1].strip()
                    break
        # 如果环境变量有值,覆盖 .env 的值
        env_val = os.getenv("XBY_APIKEY", "")
        if env_val:
            self.api_key = env_val
Confidence
83% 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
93% 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
92% 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
92% 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
93% 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
97% 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
84% confidence
Finding
python-dotenv==1.0.1

VirusTotal

55/55 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.