Back to skill

Security audit

football-pilgrimage

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent football travel guide, but it tells agents to build and run shell-style travel and ticket commands from user and web-sourced values without validation.

Review before installing. This skill should be used only in an environment that treats flyai calls as structured tool invocations or validates all command arguments before execution. Users should also expect web/API lookups and possible third-party booking links for tickets, flights, and hotels; do not enter sensitive travel or payment details unless the destination and provider are clear.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:115
Finding

Command Injection Through Unvalidated Shell Command Interpolation

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 115–116 and 125–126
Vulnerability Type: Shell command injection
Risk Level: Medium

Vulnerable Code

text
flyai search-tickets --event "{team_name} vs {opponent}" --date "{match_date}" --city "{city}"
flyai search-tickets --attraction "{stadium_name} tour" --date "{date}" --city "{city}"
text
flyai search-flight --origin "{departure_city}" --destination "{city}" --dep-date "{date}"
flyai search-hotels --city "{city}" --check-in "{date}" --nights {duration}

Technical Analysis

The Skill instructs the Agent to interpolate user-controlled and remotely sourced values directly into shell-style flyai commands. Relevant values include:

  • departure_city, which is supplied directly by the user.
  • team_name, initially derived from user input.
  • opponent, city, and stadium_name, which may originate from external API or Web Search content.
  • date, match_date, and duration, which are not subject to documented strict format or range validation before command construction.

Wrapping placeholders in double quotes is not sufficient shell protection. If the resulting command is passed to a shell, double quotes still permit command substitution such as $(command) and backtick expressions. A malicious value could also contain a closing quote followed by shell operators, allowing the attacker to alter the command structure.

The Skill does not require a structured process API, positional argument array, shell escaping routine, character allowlist, or final-command validation. Consequently, an implementation following these instructions literally may expose arbitrary command execution.

Attack Path

  1. An attacker invokes a travel-planning workflow and supplies a crafted field, such as a departure city containing a shell expression:

    text
    $(malicious_command)
    

    Alternatively, the attacker could use quote termination and shell operators if the execu ...[truncated 1770 chars]

Remediation
View remediation

Remediation Suggestions

  1. Avoid shell-based execution. Invoke flyai through a structured process API that accepts an executable and argument array, for example:

    text
    executable: flyai
    arguments:
      - search-flight
      - --origin
      - validated_departure_city
      - --destination
      - validated_destination
      - --dep-date
      - validated_date
    

    Do not use sh -c, bash -c, string concatenation, or equivalent shell evaluation.

  2. Validate every interpolated field.

    • Require dates to match a strict YYYY-MM-DD parser and reject invalid calendar dates.
    • Parse duration and nights as bounded positive integers rather than strings.
    • Restrict team, opponent, stadium, and city names to a reasonable length and expected Unicode letters, numbers, spaces, apostrophes, periods, and hyphens.
    • Reject control characters, line breaks, NUL bytes, and unexpected shell metacharacters.
  3. Treat remote data as untrusted. Apply the same validation to ESPN and Web Search values as to direct user input. Do not assume API-derived names are safe command arguments.

  4. Use robust escaping only as defense in depth. If shell execution is unavoidable, use a proven platform-specific escaping library for each argument. Manual quoting and simple character replacement are insufficient.

  5. Require confirmation of sanitized values. Before ticket or travel searches, display the normalized event, city, date, and duration as data—not as a shell command—and obtain user confirmation where appropriate.

  6. Run with least privilege. Execute travel-search tooling in a sandbox with minimal filesystem access, no unnecessary credentials, restricted environment variables, and constrained outbound network access.

  7. Add adversarial tests. Test all command parameters with payloads containing command substitution, quotes, semicolons, pipes, redirection operators, backticks, newlines, and Unicode control characters. Verify they ...[truncated 60 chars]

Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (7)

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill gives conflicting instructions for 'On This Day' retrieval: one section requires only a single web search for the trip, while another says to search every day of the trip. This inconsistency can cause the agent to violate its own anti-fabrication safeguards, perform unbounded or inconsistent searches, or generate unsupported historical claims depending on which instruction it follows.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest describes ticket search for match tickets and attraction tickets, but this file states the skill uses flyai for "Flights and hotels." That is a materially different travel-booking/planning capability than ticket lookup and broadens the skill beyond the described football pilgrimage and ticket-search scope.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The command coverage table documents a get_travel_plan capability backed by flyai. The manifest does not mention travel itinerary planning, flights, or hotels; it only mentions pilgrimage guides plus match and attraction ticket search.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The ticket-search workflow instructs unconditional flyai searches for match and attraction tickets as part of the parallel steps. But the Data Sources section says flyai provides flights, hotels, and match tickets when departure city is provided or the user asks for pricing, creating a conflicting statement about whether ticket lookup is always part of the skill or only conditional.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

This file presents flights and hotels as part of the skill’s content model, but the manifest frames the skill around football pilgrimage guidance, live match detection, and ticket search. Adding a travel-and-stay planning phase changes the advertised product scope in a way not reflected in the manifest.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
94% confidence
Finding

Line L082 explicitly says to "always use the English name, not the localized name." This is a natural-language locale policy constraint presented as a blanket requirement, with no user opt-in or explanation that the limitation is imposed by the upstream ESPN API.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The schema exposes external booking jump URLs for flights and hotels without any indication that following them may navigate users off-platform or share data with third-party booking providers. In a travel-oriented skill that also performs ticket and itinerary discovery, this omission can mislead users about trust boundaries and create privacy or phishing risk if downstream links are not clearly labeled or validated.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.