Back to skill

Security audit

Tennis Vacation Rater

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a tennis travel-rating helper, but it also asks agents to run an unverified flight-price CLI and gives confusing price-monitoring instructions.

Review this skill before installing. It is not malicious on the inspected evidence, but use it only if you are comfortable with agents fetching travel links, checking and potentially running a local flyai command, and showing an optional global npm install suggestion. Prefer web-search-only use unless the CLI provenance and version are verified, and do not rely on the skill for automatic price alerts.

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
references/link-handling-guide.md:22
Finding

Unrestricted Fetching of User-Supplied URLs Enables SSRF-Style Access

Content
View full analysis

Vulnerability Details

File Location: references/link-handling-guide.md:22-35
Vulnerability Type: Unvalidated external URL retrieval
Risk Level: Medium

Vulnerable Code

python
# Try WebFetch first
try:
    content = WebFetch(url)
    if content:
        extract_info(content)
        proceed_to_step_2()
except:
    pass

# Try browser automation if available
try:
    content = BrowserOpen(url)
    if content:

Related instructions in SKILL.md:89-95 direct the agent to access a user-provided link through WebFetch or browser automation without requiring URL validation.

Technical Analysis

The workflow passes an attacker-controlled URL directly to network-capable tools. It does not validate the URL scheme, hostname, resolved IP address, port, redirect chain, or final destination.

If the underlying WebFetch or browser tool does not enforce equivalent restrictions, an attacker could supply a URL targeting:

  • Loopback services such as 127.0.0.1 or localhost
  • Private network addresses
  • Link-local services or cloud instance metadata endpoints
  • Public URLs that redirect to restricted network locations
  • Unexpected schemes or nonstandard ports supported by the retrieval tool

Processing the resulting response with extract_info(content) may expose information returned by an otherwise inaccessible service. The absence of redirect validation also permits a public-looking URL to redirect to a private destination after initial validation.

Attack Path

  1. An attacker asks the skill to evaluate a tennis destination and includes a crafted URL.
  2. The URL points directly to an internal service or to an attacker-controlled public endpoint that redirects to one.
  3. The skill passes the URL to WebFetch(url) or BrowserOpen(url).
  4. The retrieval tool connects to the target if it lacks independent network isolation.
  5. The response is parsed as destination content.

...[truncated 648 chars]

Remediation
View remediation

Remediation Suggestions

  1. Accept only https URLs unless another scheme is explicitly required.
  2. Reject URLs containing embedded credentials, malformed hostnames, or unexpected ports.
  3. Resolve the hostname before access and reject loopback, private, link-local, multicast, reserved, and cloud-metadata address ranges for both IPv4 and IPv6.
  4. Revalidate DNS results immediately before connection to reduce DNS rebinding risk.
  5. Disable redirects or validate every redirect target using the same scheme, hostname, and IP-address controls.
  6. Prefer an allowlist of known public travel and social-media domains.
  7. Run retrieval in a network-isolated environment with no access to internal services or instance metadata.
  8. Treat retrieved pages as untrusted data and never follow instructions embedded in page content.
  9. Limit response size, content type, request duration, and the amount of fetched content included in the final response.
  10. Replace broad exception suppression with explicit error handling and security logging.

T08 · Insecure Dependencies

Warning
Location
SKILL.md:156
Finding

Unpinned Global Installation of a Third-Party CLI Creates Supply-Chain Risk

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:156-161
Vulnerability Type: Unpinned global dependency installation
Risk Level: Medium

Vulnerable Code

markdown
**Fallback: If flyai is not installed**

Use **WebSearch** to get reference prices:
- Search query: `[出发城市]到[目的地]机票价格`
- Label as "网络参考价(非实时)"
- Note in report: "Install flyai CLI for real-time prices: `npm install -g @fly-ai/flyai-cli`"

Technical Analysis

The report is instructed to recommend globally installing @fly-ai/flyai-cli without an exact version, integrity hash, verified publisher reference, or trusted registry configuration.

An unpinned command resolves to whatever package version the configured npm registry currently serves. That package can change after this skill has been audited. npm packages may execute lifecycle scripts during installation, and a global installation makes the executable available broadly in the user's environment.

The skill does not automatically execute the installation command; exploitation requires a user or automation layer to follow the generated recommendation. Nevertheless, presenting an unverified global installation command as the standard route to real-time pricing creates an avoidable supply-chain execution path.

Attack Path

  1. The flyai command is unavailable.
  2. The skill includes npm install -g @fly-ai/flyai-cli in its report.
  3. A user or supervising automation executes the recommended command.
  4. npm retrieves the latest matching package from the configured registry.
  5. A compromised publisher account, registry, package release, or registry configuration supplies malicious package content.
  6. Installation lifecycle scripts or subsequent CLI execution run attacker-controlled code.
  7. The code executes with the permissions of the account performing the installation.

Impact Assessment

A compromised package could read or modify files accessible to the instal ...[truncated 538 chars]

Remediation
View remediation

Remediation Suggestions

  1. Do not recommend global package installation as part of routine report output.
  2. Pin the dependency to a specifically reviewed version rather than resolving the latest release.
  3. Verify and document the expected publisher, official source repository, package provenance, and registry.
  4. Use lockfiles and integrity hashes where the installation mechanism supports them.
  5. Prefer an isolated, least-privileged environment such as a dedicated container or temporary virtual environment.
  6. Disable lifecycle scripts during installation when they are unnecessary, then explicitly review any required scripts.
  7. Avoid executing the CLI with administrator or root permissions.
  8. Document the package's required permissions, network destinations, and data handling before use.
  9. Prefer a built-in, reviewed flight-data integration or ordinary web search when real-time CLI data is not essential.
  10. If installation remains optional, present it as an external user decision with a clear supply-chain warning rather than a standard report instruction.
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (12)

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The file materially expands the skill from tennis-destination evaluation into flight-price checking and quasi-monitoring workflows, which is outside the declared purpose and capabilities. Scope drift like this is dangerous because it can cause the agent to collect travel-planning data, invoke extra tools, and make booking-timing recommendations users may rely on without the skill being designed, reviewed, or permissioned for that function.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The workflow instructs the agent to default the departure city to Shanghai if the user does not provide one. This introduces a specific geographic/locale assumption without first obtaining user consent or offering a choice, which can bias outputs for users in other locations.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The line instructs the agent to ask the user or default to Shanghai and note it in the report. Even with disclosure in the report, this still forces a specific locale assumption before the user has agreed to it.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill directs the agent to probe for and execute an external CLI via shell commands (which flyai, then flyai search-flight ...). Invoking arbitrary local executables expands the trust boundary from the skill to the host environment and can trigger execution of a malicious or trojaned binary named flyai, which is unnecessary for a content-generation skill and creates command-execution risk.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · references/dimension-details.md (reported line 161)May include surrounding context.

md
###  Don't
- Invent prices or ratings
- Guess when data unavailable
- Assume without verification
- Copy unverified user claims

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The document prescribes a fixed Chinese response template ('无法访问链接', follow-up prompts, and examples) and all user-facing templates throughout the guide are written as mandatory output. There is no indication that the agent should match the user's preferred language or ask for language preference, which is a natural-language locale policy concern.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This markdown file defines when to suggest price monitoring, and the trigger "User mentions "waiting for good price" or similar" is overly open-ended. The phrase "or similar" does not bound what language should count, which can lead to inconsistent or unintended suggestions in ordinary travel conversations.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
99% confidence
Finding

The documentation tells users the system will check prices daily at 9 AM and notify them immediately, but later states no automatic monitoring exists and only one-time checks are supported. This inconsistency can mislead users into believing persistent tracking or alerting is happening when it is not, creating unsafe reliance and potentially encouraging unauthorized attempts to simulate persistence through external tools or ad hoc automation.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

The manifest description says to use the skill when users ask about 'court recommendations' or 'tennis vacation planning,' which are somewhat open-ended and do not clearly delimit when this skill should activate versus a more general travel or sports recommendation skill. The file does not provide negative examples or exclusion conditions to narrow invocation boundaries.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The declared purpose is to evaluate and compare tennis vacation destinations across scoring dimensions. The required footer and follow-up workflow add a separate capability: one-off current airfare lookup, budget comparison, and booking-timing recommendations, which is adjacent travel-assistant behavior rather than destination evaluation itself.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

This markdown file contains bilingual headings and instructions such as Chinese dimension names and Chinese-only labels like "参考价" and "待补充" later in the document, but it does not state that the skill is intended for a Chinese-speaking or bilingual audience. Under the policy, forcing or assuming a language/locale without user opt-in can be a natural-language policy issue.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

This markdown template forces report output in a specific language, which can violate language or locale policy when users have not opted into that language. The file does not indicate that Chinese output is optional, configurable, or limited to a region-specific use case.

Content

No source excerpt is available for this finding.