Back to skill

Security audit

Airbnb搜索扩展

Security checks across malware telemetry and agentic risk

Overview

The skill appears to provide Airbnb search through a third-party API, but it needs review because it exposes a robots.txt bypass option and stores an API key in a local plaintext .env file while some documentation/code still refers to an unrelated gaokao skill.

Install only if you are comfortable giving a XiaoBenYang API key to this skill and having it saved in a local plaintext .env file. Review or remove the ignoreRobotsText option before use, and treat the gaokao/search_schools references as a sign the package should be cleaned up or clarified by the publisher.

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 declares no permissions while its documented behavior clearly requires environment access, file read/write, and network use. This mismatch undermines transparency and informed consent, making it easier for a skill to access secrets, persist data, and contact external services without users or reviewers understanding the true capability scope.

Intent-Code Divergence

Medium
Confidence
87% confidence
Finding
The workflow references an unrelated function `search_schools` and school-search behavior inside an Airbnb skill, indicating copy-paste drift or mismatched routing instructions. In an agentic skill, inconsistent tool documentation can cause the model to select the wrong tool, mishandle parameters, or expose unintended functionality, especially when combined with API-key collection and networked execution.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The file’s functionality and identifiers clearly target an unrelated '小笨羊高考' service rather than the declared Airbnb search extension. This kind of capability/metadata mismatch is dangerous because it can hide unauthorized credential collection or repurposed network access behind an innocuous skill description, reducing user scrutiny and bypassing trust assumptions.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The module adds persistent API-key storage and process environment injection, which exceeds what users would expect from an Airbnb search/filter extension. Even if intended for convenience, collecting and persisting secrets outside the declared scope increases the attack surface and can enable credential misuse by other code in the same environment.

Intent-Code Divergence

High
Confidence
97% confidence
Finding
The comments and configuration describe this as a gaokao-related skill while the package is presented as an Airbnb extension, directly contradicting the declared purpose. Such conflicting labeling is a strong indicator of deceptive packaging and makes hidden credential-handling behavior more dangerous in this context.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
The tool explicitly exposes an `ignoreRobotsText` parameter, allowing callers to bypass site access restrictions that are unrelated to the stated travel-planning purpose. Even though this wrapper does not implement scraping itself, it enables policy-evading behavior through the downstream API and increases the likelihood of unauthorized or abusive collection of Airbnb data.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
The listing-details function repeats the same robots.txt bypass capability, again exposing a mechanism to ignore access restrictions for fetching Airbnb content. In the context of a consumer travel search/research extension, this capability is unnecessary and makes the skill more suspicious because it facilitates non-compliant data retrieval at scale.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The function writes API credentials to a plaintext .env file without any visible warning, confirmation, or explanation to the user. Storing secrets persistently in local files can expose them to other local users, backups, logs, source-control mistakes, or unrelated tooling that reads project files.

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
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
90% 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
94% 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
90% 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
95% 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
95% 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
95% 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 — 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
91% 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

65/65 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.