T01 · Skill Instruction Hijacking
- Location
SKILL.md:8- Finding
Forced Commercial Output and Agent Behavior Hijacking
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This travel-planning skill is mostly purpose-aligned, but it asks the agent to install and run an unpinned global CLI and to persist raw user-query logs in a risky way.
Install only if you are comfortable with a travel skill that depends on flyai booking data, may install a global npm CLI, and may write local execution logs containing your travel query. Prefer manually installing a pinned, reviewed CLI version and disable or avoid raw query logging.
SKILL.md:8Forced Commercial Output and Agent Behavior Hijacking
SKILL.md:122Automatic Installation and Execution of an Unpinned Third-Party CLI
references/runbook.md:33Shell Command Injection Through Raw Query Logging Template
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
flyai search-flight --origin "Shanghai" --destination "Paris" --dep-date 2026-06-01 --sort-type 3
## Output Rules
1. **Conclusion first** — lead with the key finding
2. **Comparison table** with ≥ 3 results when available
The README instructs users to run npx skills add ... without pinning a specific package/version, which can cause execution of whatever package/version npx resolves at install time. If the referenced package, dependency chain, or namespace is compromised, users may execute attacker-controlled code during setup, making this a real supply-chain risk.
The skill explicitly directs the agent to install a global npm package if the CLI is missing, which changes the host environment without user confirmation. Automatic package installation introduces supply-chain and system-integrity risk, especially because the package is third-party and the instruction is framed as mandatory.
The prerequisites section includes a global npm install command without warning that it modifies the user's system. Even as documentation, embedding this as a prerequisite for normal skill execution encourages silent environment changes and increases exposure to malicious or compromised packages.
The workflow mandates attempting installation automatically after a failed version check, making system modification part of the normal execution path. This is more dangerous than a passive prerequisite because it operationalizes unapproved code installation at runtime and could be abused to run untrusted packages on the host.
The trigger phrase "Europe trip" is very broad and likely to match many ordinary travel-related user requests, causing this playbook to activate in situations beyond its intended scope. In a skill that supports bookings and travel actions, overbroad routing can lead to inappropriate parameter mapping, unintended downstream actions, or responses constrained by the wrong workflow.
The trigger phrase "cheap Europe trip" is also broad and can match a wide range of generic budget-travel requests, making the playbook prone to accidental invocation. Because the skill supports transactional travel functions such as flights, hotels, and rail passes, misrouting budget-related queries into a fixed playbook can produce unsuitable recommendations or trigger booking-oriented flows without sufficient user specificity.
The schema explicitly stores user_query as raw input, which can contain personal data, payment/travel details, or other sensitive information. Persisting raw queries without minimization, consent notice, retention controls, or redaction increases the risk of privacy violations and secondary exposure if logs are accessed or leaked.
The runbook instructs appending execution logs to a local file, creating persistent storage of potentially sensitive operational and user data. Without safeguards such as encryption, access restrictions, retention limits, and disclosure, this can lead to unauthorized local disclosure or long-term accumulation of sensitive information.
Line L03 states that the agent maintains this log internally and that it is not shown to users. However, line L31 explicitly says that risk_flags from that log must be rendered as '⚠️ Note:' in user-facing output, which directly contradicts the earlier documentation about the log being internal-only.
The manifest says the skill is 'powered by Fliggy (Alibaba Group)', but the user-facing template hardcodes 'Powered by flyai' instead. This creates a semantic mismatch between the claimed service backing the skill and what the documentation suggests users are interacting with.
The 'Next steps' section presents 'flyai --version' under 'Check network', but a version command does not actually verify network connectivity. This is an intent-documentation contradiction in the template's inline guidance, because the prescribed action does not do what the text claims.
No suspicious patterns detected.