Back to skill

Security audit

铁路12306火车票

Security checks across malware telemetry and agentic risk

Overview

This train-ticket skill sends travel data to external proxies and includes broader travel tools that are not disclosed in its public skill description.

Review carefully before installing. Use it only if you are comfortable sending travel and location details to the listed proxy services, and prefer a version that removes the hardcoded token, narrows the script to the declared train-ticket function, and clearly discloses all external data sharing.

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

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

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

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

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

Lp3

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding
The skill declares no permissions while its own documentation states it reads environment variables and sends user queries over the network to multiple external services. This creates a transparency and governance gap: users and the platform may not understand that origin, destination, and travel dates are transmitted off-platform, which can undermine consent, review, and policy enforcement.

Description-Behavior Mismatch

High
Confidence
95% confidence
Finding
The code implements a broad travel assistant despite the manifest presenting it as a train-ticket query skill, creating a capability/description mismatch. This is dangerous because users, reviewers, and policy gates may authorize a narrow data-access scope while the code actually processes and transmits much broader categories of travel and location data.

Description-Behavior Mismatch

High
Confidence
96% confidence
Finding
The registered tool set exposes planning, flights, hotels, POI, food, and transport capabilities that materially exceed a train-query skill's stated scope. In an agent ecosystem, this increases risk of unauthorized data collection and invocation of functions that users did not knowingly enable.

Context-Inappropriate Capability

Medium
Confidence
87% confidence
Finding
Itinerary planning is outside the stated train-ticket purpose and expands the amount of user trip context sent to external services. While not inherently malicious, it widens data exposure and undermines least-privilege expectations for this skill.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
Flight search is unrelated to a train-query skill and introduces additional external query handling beyond the declared scope. This broadening matters because users may provide more personal itinerary information than they would for a narrowly scoped train function, increasing privacy and authorization risk.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
Hotel, attraction, and Marriott features are unnecessary for a train-ticket querying skill and substantially expand the personal/travel data processed and transmitted. The mismatch makes the skill more dangerous because broad travel profiling can occur under a narrower trust label.

Context-Inappropriate Capability

Medium
Confidence
92% confidence
Finding
Food discovery and intra-city transport features process precise location and routing data, which is especially sensitive and far beyond a train-ticket query use case. The added deep-link generation and location lookups increase privacy exposure and the chance of users unknowingly sharing detailed movement patterns.

Vague Triggers

Medium
Confidence
78% confidence
Finding
The trigger list contains generic phrases such as '12306', '火车票', and '车票查询' that are common in ordinary conversation and can cause the skill to activate unexpectedly. Overbroad invocation increases the chance that users' travel queries are sent to third-party services without clear intent, producing privacy leakage and confusing agent behavior.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
Although the document includes a data-flow section, it does not give an explicit user-facing warning that query details are sent to third-party processors such as Tencent Cloud SCF and FliggyAI. Users may reasonably assume they are only interacting with 12306, so the omission weakens informed consent and can expose sensitive itinerary data to additional external parties.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The skill forwards user travel queries and location-related inputs to external proxy services without explicit user-facing notice or consent. This is dangerous because itinerary, destination, and routing data can reveal sensitive personal patterns, and the use of proxies adds an extra intermediary beyond the expected provider.

Env Variable Harvesting

High
Category
Data Exfiltration
Content
# ============================================================
FLIGGY_PROXY = os.environ.get("FLIGGY_PROXY", "https://1439498936-6sysdjjt99.ap-guangzhou.tencentscf.com")
GAODE_PROXY = os.environ.get("GAODE_PROXY", "https://1439498936-bl10af74fl.ap-guangzhou.tencentscf.com")
PROXY_TOKEN = os.environ.get("PROXY_TOKEN", "tp_8k2mX9vQ4z")
TIMEOUT = 30

# ============================================================
Confidence
97% confidence
Finding
os.environ.get("PROXY_TOKEN

VirusTotal

64/64 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.