Back to skill

Security audit

大都会博物馆

Security checks across malware telemetry and agentic risk

Overview

This museum lookup skill routes requests through a third-party XiaoBenYang MCP service and saves an API key locally, which is not well aligned with its open-data description.

Review this carefully before installing. It is not just a direct Met Museum open-data helper: it requires a XiaoBenYang API key, sends requests through that third-party service, and stores the key in a local plaintext .env file. Install only if you trust that service and are comfortable with persistent local credential storage.

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

Lp3

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding
The skill advertises no explicit permissions while its documented behavior implies environment access, local file read/write, and network communication. This is dangerous because users and platforms cannot accurately assess the real trust boundary, especially when the skill also stores credentials and calls an external service.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The skill claims to retrieve open Met Museum data, but the instructions reveal credential collection, local persistence, and use of an unrelated third-party XiaoBenYang proxy. This mismatch can mislead users into supplying secrets to a service they did not intend to trust and obscures where data is actually sent.

Intent-Code Divergence

High
Confidence
95% confidence
Finding
The API-key and project-structure sections describe an unrelated XiaoBenYang/gaokao integration instead of a Met Museum skill, strongly indicating the skill may route requests and secrets to a different service than advertised. In context, this increases the risk of credential harvesting, unexpected data exfiltration, and deceptive third-party dependence.

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
An open-data museum skill should not center its setup on obtaining and storing a third-party API key unless that dependency is clearly necessary and disclosed. This creates a misleading trust model and can pressure users into sharing sensitive credentials for functionality that appears unrelated to the stated purpose.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The skill claims to query Metropolitan Museum open collection data, but the implementation is a generic proxy to an external MCP service that accepts arbitrary tool names and parameters. This creates a strong capability/intent mismatch: a user or platform may grant trust based on the museum description while the code can invoke unrelated third-party functions, enabling unexpected data access or outbound actions.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
The code depends on a generic third-party API key for XiaoBenYang MCP rather than a museum-specific public data source. In the context of a supposedly open-collection lookup skill, this hidden dependency increases the risk of unauthorized third-party access, misuse of privileged credentials, and user deception about where requests are actually being sent.

Intent-Code Divergence

Medium
Confidence
89% confidence
Finding
The code and docstrings explicitly identify the component as a XiaoBenYang MCP client rather than a Metropolitan Museum data client, reinforcing that the implementation does not match the advertised skill. This discrepancy is dangerous because it can conceal broader external-call functionality behind a harmless-looking museum label, undermining review, consent, and least-privilege assumptions.

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
The skill claims to query open museum collection data, but this code adds persistent API credential management unrelated to that stated purpose. Storing and mutating API secrets locally increases the attack surface and creates unnecessary secret-handling risk in a low-privilege content retrieval skill.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The code force-reads a local .env file to extract an API key even though a museum open-data query skill should not generally need direct local credential file access. Unnecessary local file access to secrets broadens the trust boundary and can expose credentials to other components or future code paths.

Intent-Code Divergence

Medium
Confidence
87% confidence
Finding
The docstring identifies this as a different skill than the declared museum skill, which is a strong integrity and provenance mismatch. Such mismatches are suspicious because they suggest code reuse from another project or deceptive packaging, making it harder to trust the real behavior of the skill.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The function persists the API key to a local .env file without any explicit warning, consent flow, or indication of storage scope. Users may believe they are providing a temporary credential, while the code silently creates long-lived local secret storage that could be read later by other processes or users.

Ssd 3

Medium
Confidence
98% confidence
Finding
The skill instructs the agent to ask the user for an API key in conversation and then persist it locally via set_api_key. Collecting secrets through natural-language interaction and writing them to a local .env file increases the risk of accidental disclosure, logging exposure, insecure storage, and reuse by unrelated processes.

Ssd 3

Medium
Confidence
96% confidence
Finding
Reinforcing that the agent must request an API key whenever missing normalizes conversational credential harvesting and increases the chance that users reveal secrets in plain text. In this skill's context, that risk is amplified by the broader documentation mismatch and unexplained third-party integration.

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
93% 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
93% 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
95% 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
94% 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
94% 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
94% 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
94% 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
94% confidence
Finding
python-dotenv>=1.0.1

Known Vulnerable Dependency: requests==2.31.0 — 3 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)

Low
Category
Supply Chain
Confidence
92% 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
81% confidence
Finding
python-dotenv==1.0.1

VirusTotal

VirusTotal findings are pending for this skill version.

View on VirusTotal

Static analysis

No suspicious patterns detected.