Back to skill

Security audit

图表生成工具

Security checks across malware telemetry and agentic risk

Overview

This charting skill needs Review because it appears to send chart data and store API keys for an external service that does not clearly match the advertised local ECharts/MinIO purpose.

Review before installing. Only use this skill if you are comfortable sending chart data to the referenced external service and storing the API key locally in .env. Avoid sensitive business, customer, financial, or proprietary datasets unless the publisher clarifies the endpoint, retention, credential storage, and how to disable or remove persisted keys.

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

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill declares no permissions, yet its documented behavior requires environment access, local file read/write, and outbound network calls. This is dangerous because it hides the true trust boundary from users and reviewers, especially when the skill also stores API credentials and sends data to an external service.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The skill claims to be a local ECharts/analysis/MinIO tool, but the documentation shows it persists API keys locally and relies on an external XiaoBenYang MCP service instead. This mismatch prevents informed consent and can lead users to expose credentials or sensitive chart data under false assumptions about where processing occurs and what features are actually implemented.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The documentation mixes a chart-generation skill with unrelated gaokao package names and school-search function examples, indicating copy-paste drift or deceptive packaging. Such inconsistencies are dangerous because they undermine reviewer trust and make it harder to determine what code paths, APIs, and data handling are really intended.

Intent-Code Divergence

High
Confidence
97% confidence
Finding
The skill states that code only routes chart API calls, but the example invocation and project metadata reference school-search behavior and a gaokao skill package. Contradictory operational guidance increases the risk of unintended tool invocation, confused-deputy behavior, and hidden external interactions not reasonably expected by the user.

Intent-Code Divergence

Medium
Confidence
94% confidence
Finding
The configuration class docstring identifies this as a different skill ('小笨羊高考Skill') than the declared chart-generation tool, which is a supply-chain integrity red flag. Mismatched identity can hide copied or repurposed code paths and makes it harder for reviewers to verify what external service the skill is actually configuring.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The config targets an unrelated external API namespace and service identifiers ('XBY_GAOKAO', fixed base URL, MCP ID) rather than ECharts or MinIO functionality described in the skill metadata. In a chart-generation skill, unexplained outbound service configuration creates a strong risk of covert data exfiltration or unexpected remote dependence.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The wrapper functions transmit user-supplied chart data and configuration to a remote API via call_api(), but the skill metadata only describes local chart generation and MinIO integration, not third-party network transfer. This creates an undisclosed data egress path where potentially sensitive business data embedded in charts could be sent off-host without the user's informed consent.

Context-Inappropriate Capability

Medium
Confidence
96% confidence
Finding
Nearly all chart helper functions package arbitrary user data and forward it to an undeclared external service, extending the same undisclosed egress pattern across the entire tool surface. In this skill context, chart inputs are likely to contain internal analytics, financial, operational, or customer data, so silent remote transmission materially increases confidentiality and compliance risk.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The skill instructs the agent to ask for an API key and persist it via `set_api_key` without an explicit warning that the credential will be stored locally, likely in `.env`. Storing secrets without clear disclosure or consent can expose users to credential leakage through local files, logs, backups, or later reuse by unrelated tasks.

Missing User Warnings

Low
Confidence
79% confidence
Finding
The skill directs the agent to display `result["raw"]` directly to the user, which may include unexpected metadata, identifiers, or sensitive fields returned by the external API. Even if chart data is usually benign, blindly relaying raw responses removes any opportunity to filter secrets, error traces, or unnecessary personal data.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The helper persists a provided API key directly into a local .env file and updates process environment state without any confirmation, warning, or file-permission hardening. This can cause users to unknowingly store secrets in plaintext on disk, where they may be committed, backed up, or read by other local processes.

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
90% 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
88% 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
97% 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
96% 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
96% 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
96% 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
90% confidence
Finding
python-dotenv==1.0.1

VirusTotal

62/62 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.