Back to skill

Security audit

跟团游搜索与推荐

Security checks across malware telemetry and agentic risk

Overview

This travel-search skill is coherent and purpose-aligned, but it sends trip search details to external proxy services to retrieve results.

Install only if you are comfortable sending travel search details such as origin, destination, and departure date to the skill publisher's proxy services. Do not expose unrelated secrets through an environment variable named PROXY_TOKEN when running this skill.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (10)

Tainted flow: 'req' from os.environ.get (line 100, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
method="POST",
    )
    try:
        with urllib.request.urlopen(req, timeout=TC_TIMEOUT) as r:
            return json.loads(r.read().decode("utf-8"))
    except urllib.error.HTTPError as e:
        err = ""
Confidence
90% confidence
Finding
with urllib.request.urlopen(req, timeout=TC_TIMEOUT) as r:

Tainted flow: 'req' from os.environ.get (line 100, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
)
    _timeout = timeout or FG_TIMEOUT
    try:
        with urllib.request.urlopen(req, timeout=_timeout) as r:
            return json.loads(r.read().decode("utf-8"))
    except urllib.error.HTTPError as e:
        err = ""
Confidence
90% confidence
Finding
with urllib.request.urlopen(req, timeout=_timeout) as r:

Lp3

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding
Without declared permissions the skill's intent is opaque and cannot be validated.

Context-Inappropriate Capability

Medium
Confidence
86% confidence
Finding
The manifest describes a travel search skill, but the code includes a hardcoded fallback credential in `PROXY_TOKEN` when the environment variable is absent. Embedding credential material is not a user-facing travel-search capability and is unjustified by the skill's stated purpose.

Vague Triggers

Medium
Confidence
93% confidence
Finding
The phrase "想去海边" is presented as a direct way to activate destination recommendations, but it is common everyday travel speech and the document does not define any narrower activation scope, exclusions, or negative examples. This makes the trigger semantics overly broad for a manifest/markdown skill description and could cause unintended invocation when a user is speaking generally about preferences.

Vague Triggers

Medium
Confidence
87% confidence
Finding
The description advertises broad capabilities such as searching tours, recommending scenarios, and querying transport across multiple platforms, but it does not state when the skill should or should not be invoked. In a manifest/markdown context, missing trigger constraints can create ambiguous activation boundaries and overlap with generic travel-related conversation.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The script sends destination, origin, and departure-date parameters to external Tencent SCF proxy endpoints via HTTP POST in both `_call_tongcheng` and `_call_fliggy`. While the functions have internal docstrings, there is no user-facing warning, print/log disclosure, or confirmation that user travel data will be transmitted to third-party services.

Natural-Language Policy Violations

Medium
Confidence
92% confidence
Finding
User-facing strings, usage guidance, date parsing, and examples are all Chinese-specific, including parsing only Chinese date expressions such as “明天” and “后天”. The file does not offer any language/locale opt-in or explain that the skill is intentionally limited to a Chinese-language or China-travel context.

Env Variable Harvesting

High
Category
Data Exfiltration
Content
# ============ 配置 ============
TONGCHENG_PROXY = "https://1439498936-7vqpkiipef.ap-guangzhou.tencentscf.com"
FLIGGY_PROXY = "https://1439498936-6sysdjjt99.ap-guangzhou.tencentscf.com"
PROXY_TOKEN = os.environ.get("PROXY_TOKEN", "tp_8k2mX9vQ4z")
TC_TIMEOUT = 15
FG_TIMEOUT = 30
Confidence
70% confidence
Finding
os.environ.get("PROXY_TOKEN

Unbounded Resource Access

Medium
Category
Excessive Agency
Content
return {"error": "request error: " + str(e)}


def _call_fliggy(rtype, params, timeout=None):
    """调用飞猪SCF代理"""
    body = json.dumps({"type": rtype, "params": params}, ensure_ascii=False, separators=(",", ":")).encode("utf-8")
    req = urllib.request.Request(
Confidence
75% confidence
Finding
timeout=None

VirusTotal

65/65 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.