T01 · Skill Instruction Hijacking
- Location
SKILL.md:15- Finding
Mandatory Commercial Output and Booking-Link Injection
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This travel skill is meant to search flights, but it asks agents to install and run an unpinned global CLI and to keep raw travel logs in ways that need careful review.
Review before installing. Require explicit approval for any npm install, pin and verify the flyai CLI, run it in a restricted environment, validate all city/date inputs before execution, and disable or redesign raw local logging unless users have knowingly opted in.
SKILL.md:15Mandatory Commercial Output and Booking-Link Injection
SKILL.md:70Unpinned Global Installation and Execution of a Third-Party npm Package
SKILL.md:97Shell Command Injection Through User-Controlled Travel Parameters
references/runbook.md:33Command Injection and Sensitive Query Retention in Execution Logging
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
flyai search-flight --origin "Chengdu" --destination "Beijing" --dep-date 2026-05-07 --sort-type 2
## Output Rules
1. **Leg-by-leg presentation** — each segment clearly numbered
2. **Total trip summary** — total flights, total estimated cost
The runbook explicitly stores raw user input in an execution log and appends it to a local file without any notice, consent, retention policy, or redaction requirement. For a travel skill, raw input can include passport-related details, names, destinations, dates, contact info, and other sensitive travel data, creating a direct privacy and data-retention risk if the file is accessed, copied, or reused.
The skill frames the agent as a CLI executor and mandates installation of flyai-cli if missing, normalizing tool execution and package installation without prior user approval. In agent environments, instructions that push immediate system-level actions can lead to unreviewed changes to the host and expansion of the attack surface.
The workflow explicitly instructs npm i -g @fly-ai/flyai-cli as an automatic recovery step after command not found, with no warning about global installation effects. This is dangerous because global package installation executes code and modifies the environment, which is especially risky when triggered automatically by documentation-driven agent behavior.
The skill states that only parameters listed in the Parameters table may be used, but later instructs adding --transfer-city, which is not documented there. This inconsistency can cause agents to invoke unsupported or unintended CLI behavior, increasing the risk of command misuse, failed execution paths, or reliance on undefined tool features.
The file contains a hard-coded user-facing warning in Chinese: "两段之间中转时间不足3小时,可能存在误机风险". Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale restriction is explicitly justified, which this file does not do.
The file instructs the agent to respond with the Chinese message "后续航段日期不能早于前一航段". This is a user-facing locale choice embedded in the skill, and the file does not indicate that the user opted into Chinese or that the skill is explicitly region-specific.
The instruction "never answer without executing" pressures the agent into tool use without preserving user choice, clarification, or safe non-execution responses. In a booking skill, this can cause premature searches or transactions based on incomplete or ambiguous itinerary details, reducing safety controls and making misuse or accidental actions more likely.
The fallback trigger "Complex route not directly supported" is vague and can match a wide range of user requests, causing the skill to route requests into a generic keyword search rather than a constrained, parameterized flow. In a travel-booking context, this increases the chance of incorrect command selection, unintended queries, and unsafe handling of user-provided free text because the query is injected wholesale into a search command.
Persisting natural-language user queries to a local execution log creates a durable leak path because free-form travel requests often contain sensitive personal and trip information that is hard to reliably sanitize after the fact. The combination of raw input capture and filesystem persistence increases exposure through local compromise, debugging artifacts, backups, or unintended downstream processing.
The instruction to log on every skill trigger is underspecified and broad, which can cause over-collection of events and user data beyond what is necessary for the travel task. In a travel-booking skill that may process itinerary details, names, dates, and other sensitive context, ambiguous trigger scope increases the chance of unnecessary persistent logging and accidental privacy exposure.
The templates present booking results as 'Powered by flyai' and instruct users to check flyai --version, which conflicts with the skill metadata stating the provider is Fliggy. This creates a trust and provenance mismatch that can mislead users about which backend or CLI they are interacting with, increasing phishing, support misdirection, or unsafe operational workarounds if copied into production responses.
No suspicious patterns detected.