Back to skill

Security audit

Travel Search Flight Train Scenery - 旅行搜索 航班 火车 景点

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent travel lookup skill that uses disclosed travel providers, with manageable privacy and dependency cautions.

Install only if you are comfortable sending travel search details to ly.com and JisuAPI. Use a limited JisuAPI key if possible, monitor quota/billing, avoid sharing highly sensitive itinerary details, and install dependencies in a virtual environment with reviewed or pinned versions.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
search.py:458
Finding

API Credential Exposed Through URL Query Parameters

Content
View full analysis
Dict[str, object]: start = req.get("start") end = req.get("end") if not start: return {"error": "missing_param", "message": "start is required"} if not end: return {"error": "missing_param", "message": "end is required"} params = {"appkey": appkey, "start": start, "end": end} if req.get("ishigh") is not None and req.get("ishigh") != "": params["ishigh"] = req.get("ishigh") if req.get("date"): params["date"] = req.get("date") r = requests.get(TRAIN_STATION2S_URL, params=params, timeout=12) ``` ```python def _train_line(appkey: str, req: Dict[str, object]) -> Dict[str, object]: trainno = req.get("trainno") if not trainno: return {"error": "missing_param", "message": "trainno is required"} params = {"appkey": appkey, "trainno": trainno} if req.get("date"): params["date"] = req.get("date") r = requests.get(TRAIN_LINE_URL, params=params, timeout=12) ``` ```python def _train_ticket(appkey: str, req: Dict[str, object]) -> Dict[str, object]: start = req.get("start") end = req.get("end") date = req.get("date") if not start: return {"error": "missing_param", "message": "start is required"} if not end: return {"error": "missing_param", "message": "end is required"} if not date: return {"error": "missing_param", "message": "date is required"} params = {"appkey": appkey, "start": start, "end": end, "date": date} r = requests.get(TRAIN_TICKET_URL, params=params, timeout=12) ``` ### Technical Analysis All three train-query functions place `JISU_API_KEY` into the `appkey` query parameter of an HTTP GET request. Although the endpoints use HTTPS and therefore ...[truncated 1830 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
SKILL.md:21
Finding

Unpinned Third-Party Python Dependencies

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (10)

Tp2

High
Category
MCP Tool Poisoning
Confidence
85% confidence
Finding

Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill metadata declares environment-variable requirements and references a Python script that will perform networked queries and likely read local files such as airport mappings, but it does not declare an explicit tool or permission scope. That creates a transparency and governance gap: an orchestrator or reviewer cannot easily tell that the skill may access secrets and send user travel queries to external services, increasing the risk of unintended data exposure or over-broad execution.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The invocation text is broad enough to trigger on generic travel-planning requests, which can cause the agent to route user queries and itinerary details to this skill without sufficiently specific user intent. Because the skill relies on third-party travel/API providers, over-broad triggering increases accidental disclosure of travel-related personal data and may invoke network actions the user did not clearly authorize.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill states that it uses ly.com and JisuAPI data sources, but the usage description does not clearly warn users that their travel queries may be transmitted to third-party providers. Travel requests can contain sensitive itinerary information such as origin, destination, and dates, so the absence of an explicit disclosure undermines informed consent and privacy expectations.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

This constant defines an external endpoint used to transmit user travel search data to a third-party API. While contacting an external travel data provider is part of the feature, it still creates a real data egress path that can expose user itinerary information if not transparently disclosed and governed.

Content

Scanner excerpt · search.py (reported line 24)May include surrounding context.

python
from bs4 import BeautifulSoup

LY_HOME = "https://www.ly.com/"
TRAIN_STATION2S_URL = "https://api.jisuapi.com/train/station2s"
TRAIN_LINE_URL = "https://api.jisuapi.com/train/line"
TRAIN_TICKET_URL = "https://api.jisuapi.com/train/ticket"
DEFAULT_UA = (

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

This endpoint enables outbound transmission of user-provided train identifiers and optional dates to a third-party service. In the context of an agent skill, that is a meaningful privacy boundary crossing and should be treated as a genuine security/privacy concern rather than ignored as mere configuration.

Content

Scanner excerpt · search.py (reported line 25)May include surrounding context.

python
LY_HOME = "https://www.ly.com/"
TRAIN_STATION2S_URL = "https://api.jisuapi.com/train/station2s"
TRAIN_LINE_URL = "https://api.jisuapi.com/train/line"
TRAIN_TICKET_URL = "https://api.jisuapi.com/train/ticket"
DEFAULT_UA = (
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

This endpoint is used to send origin, destination, and travel date data to an external ticket API. Because the skill is specifically designed for travel planning, users are likely to submit sensitive itinerary details, making undisclosed third-party transmission more significant in this context.

Content

Scanner excerpt · search.py (reported line 26)May include surrounding context.

python
LY_HOME = "https://www.ly.com/"
TRAIN_STATION2S_URL = "https://api.jisuapi.com/train/station2s"
TRAIN_LINE_URL = "https://api.jisuapi.com/train/line"
TRAIN_TICKET_URL = "https://api.jisuapi.com/train/ticket"
DEFAULT_UA = (
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
    "(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The train query functions send user-supplied travel details such as origin, destination, date, and train number to a third-party service (api.jisuapi.com). In a user-facing agent skill, transmitting trip data off-platform without explicit disclosure or consent is a real privacy and data-handling issue, especially because users may not realize their itinerary queries are being shared with an external provider.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

This markdown file presents the skill title and usage guidance only in Chinese, which effectively imposes a specific language on users. The policy allows language constraints only when users are given a choice or when the locale limitation is clearly documented and justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

SQP-3 applies to all file types and covers natural-language language/locale policy violations. This markdown file presents all user-facing content exclusively in Chinese, with no indication that users can choose another language or that the locale restriction is documented and justified.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.