Back to skill

Security audit

Create your persanal travel-map

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent travel-map skill with expected web, image, local file, and install behavior, but users should notice its privacy and dependency-installation implications.

Install only if you are comfortable with the skill using web/search/map/image services for destination and POI details, and avoid giving private addresses or sensitive travel plans unless you intend to share them with those services. Review install.sh before running it, use --dry-run first, and consider installing Pillow yourself in a dedicated virtual environment with a pinned version.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T08 · Insecure Dependencies

Warning
Location
scripts/install_deps.py:18
Finding

Automatic Installation of an Unpinned Third-Party Dependency

Content
View full analysis

Vulnerability Details

File Location: scripts/install_deps.py:18-31
Vulnerability Type: Unpinned dependency installation from a mutable package index
Risk Level: Medium

Complete Code Snippet

python
# Try installation methods in order of preference
install_methods = [
    [sys.executable, "-m", "pip", "install", "--user", "Pillow"],
    [sys.executable, "-m", "pip", "install", "Pillow"],
    [sys.executable, "-m", "pip3", "install", "Pillow"],
]

for i, cmd in enumerate(install_methods):
    try:
        print(f"  Attempt {i+1}/{len(install_methods)}: {' '.join(cmd)}")
        result = subprocess.run(
            cmd,
            capture_output=True,
            text=True,
            timeout=120,
        )

The installer is invoked as a mandatory prerequisite by SKILL.md:67-70:

bash
python3 SKILL_DIR/scripts/install_deps.py

Technical Analysis

The dependency installer passes the package name Pillow to pip without a fixed version, cryptographic hash, lock file, or explicitly trusted package index. Consequently, the exact artifact installed depends on mutable package-index state at execution time rather than on an artifact reviewed with this skill.

Although subprocess.run uses an argument list and does not enable a shell, which prevents shell-command injection through this static command, it does not mitigate software supply-chain risk. A compromised upstream release, package-index account, index mirror, or package-resolution configuration could cause unreviewed code to be downloaded and installed.

The first attempt uses --user, modifying the invoking user's Python environment. The fallback attempts target the active interpreter environment. Installation is not isolated in a dedicated virtual environment.

Attack Path

  1. An attacker compromises an upstream dependency release, its publishing account, the configured package index or mirror, or the local pip index configuration.
  2. A user or agent activates ...[truncated 1052 chars]
Remediation
View remediation

Remediation Suggestions

  1. Pin Pillow to a specifically reviewed version rather than resolving the latest available release.
  2. Store the dependency in a locked requirements file with cryptographic hashes, for example:
    text
    Pillow==REVIEWED_VERSION \
        --hash=sha256:REVIEWED_DISTRIBUTION_HASH
    
  3. Install with hash enforcement:
    bash
    python3 -m pip install --require-hashes -r requirements.txt
    
  4. Use a dedicated virtual environment instead of modifying the user's or active interpreter's package environment.
  5. Specify an approved HTTPS package index and prevent untrusted extra indexes or mirrors from influencing resolution.
  6. Review dependency updates before changing the pinned version or hashes.
  7. Ask for explicit user approval before downloading or installing packages, and clearly disclose the target environment.
  8. Where practical, distribute a verified wheel or use an organization-controlled artifact repository.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (19)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description presents an end-user content-generation capability: creating anime-style illustrated travel maps. However, the actual code chunk only implements installation logic for deploying the skill to various platforms (Claude, Cursor, Copilot, Windsurf, etc.). This is a materially different primary purpose from map generation and includes filesystem-modifying behavior not disclosed in the description. While installer code can be a supporting part of a package, this supplied code chunk itself does not reflect the declared runtime behavior of generating maps. Therefore this code chunk does not accurately represent the declared purpose.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is about image/map generation for travel itineraries, including anime-style map rendering and geographic visualization. The actual code does none of that: it contains no map generation, no image creation, no coordinate handling, no travel itinerary logic, and no artistic rendering. Instead, its primary purpose is static security analysis of a filesystem directory. This is a materially different purpose and includes undeclared capabilities related to local file inspection and security auditing, so the description does not accurately represent the code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The code only performs offline image stylization on a supplied map screenshot. It applies posterization, color shifts, palette remapping, blur/sharpen, edge overlay, desaturation, and vignette effects. There is no logic for ingesting trip itineraries, coordinates, POIs, routes, or map data, and no generation of illustrated travel-guide elements described in the skill description. While the anime/Ghibli styling aspect partially matches, the primary declared purpose—creating itinerary maps with route and POI placement—is materially unsupported by the code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

There is a clear and material mismatch between the declared description and the actual code. The description promises an artistic travel-map generation capability, but the supplied code only validates a skill's file structure and markdown/frontmatter conventions. Its primary purpose is repository/skill linting, not map rendering, itinerary visualization, image generation, or geographic processing. The code accesses local files such as SKILL.md and script files, which is inconsistent with the declared purpose. This is not a minor implementation detail; it is an entirely different function.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · install.sh (reported line 159)May include surrounding context.

sh
cp -R "$SCRIPT_DIR" "$install_path"

    # Remove install.sh from installed copy (not needed there)
    rm -f "$install_path/install.sh"

    log_success "Installed to $install_path"
}

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README encourages very broad natural-language triggering such as 'draw a map' or 'generate an itinerary graphic,' which can collide with ordinary user requests and cause the skill to activate in contexts the user did not explicitly intend. In a skill that handles travel plans, attraction names, and potentially screenshot-based map generation, accidental invocation can expose itinerary/location data to external tooling or cause unreviewed downstream actions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The README describes transforming map screenshots and processing POI coordinates but does not warn users that itinerary details, precise locations, or map imagery may come from or be sent to external services. For a travel-planning skill, this omission increases the risk that sensitive movement patterns, lodging, attractions, or home/office-adjacent locations are handled without informed consent.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill instructs use of shell commands, file creation under /tmp, dependency installation, and copying outputs into the user's working directory, but it declares no explicit tool scope or permissions. That creates an authorization gap where a seemingly simple map-generation skill can perform broader local actions than a user would reasonably expect.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The natural-language triggers are broad enough that ordinary requests about trips or maps could activate a skill that performs web lookups, browser navigation, shell commands, and local file writes. Overbroad activation increases the chance of unexpected tool use and unintended disclosure of travel details when the user did not explicitly request these operations.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill expands from local map generation into live web discovery and browser-driven extraction of coordinates from third-party sites. That causes user itinerary details and destination interests to be transmitted externally, increasing privacy and data-handling risk beyond what a user may infer from the skill name and summary.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The workflow sends POI and city data to external search engines and mapping services and may automate browser visits, but it does not warn users that their itinerary details will leave the local environment. For travel plans, that can expose sensitive location preferences, dates, or patterns to third parties without informed consent.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · install.sh (reported line 146)May include surrounding context.

sh
return 0
    fi

    # Create parent directory if needed
    mkdir -p "$(dirname "$install_path")"

    # Remove existing installation

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The manifest describes a skill for generating illustrated travel itinerary maps, but this file implements installation behavior that creates directories, deletes any existing installation, and copies files into assistant configuration locations. While an installer can be legitimate packaging infrastructure, these write/delete operations are not part of the skill behavior promised by the manifest itself, so the described capability and actual code behavior diverge at the semantic level.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script unconditionally deletes any existing directory at the computed install path with rm -rf, without prompting the user or validating the target beyond string construction. If the target path is unexpected, misdetected, or manually specified in a risky context, this can cause silent loss of existing configuration or locally modified skill content.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The code enumerates and writes into many different AI assistant config locations, enabling cross-platform deployment rather than map generation. That capability is operational tooling, not an obvious requirement of a skill whose stated purpose is creating anime-style travel maps, so it is context-inappropriate relative to the manifest's scope.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/install_deps.py (reported line 27)May include surrounding context.

python
for i, cmd in enumerate(install_methods):
        try:
            print(f"  Attempt {i+1}/{len(install_methods)}: {' '.join(cmd)}")
            result = subprocess.run(
                cmd,
                capture_output=True,
                text=True,

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The manifest describes generating illustrated travel itinerary maps with cartoon POIs placed at real geographic coordinates and connected by a numbered route. This file only applies image stylization filters to an existing map screenshot and does not generate itineraries, place POIs, compute coordinates, or draw routes, so the implemented behavior does not match the claimed skill functionality.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The top-level docstring and CLI description present the tool as transforming a Google Maps screenshot into a Ghibli hand-drawn style map, which can be read as creating the travel map artifact itself. In practice, the code only processes an already-existing screenshot with visual effects and has no logic for itinerary construction, POI placement, or route rendering, creating a documentation-to-code intent gap relative to the skill’s advertised purpose.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The manifest focuses on creating a travel map PNG, but the delivery phase instructs the agent to copy files from /tmp into the current working directory. This is a filesystem side effect beyond the core described act of generating a map image.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dynamic_code_execution

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
scripts/security_scan.py:68