Back to skill

Security audit

OpenCLAW Tour Planner

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to be a legitimate travel planner, but it needs review because it stores destination lookups locally despite saying user queries and data are not stored.

Review this skill before installing if destination privacy matters. It sends destination data to public APIs and keeps a local SQLite cache that can reveal searched destinations, including exact addresses if users provide them. Update or pin dependencies, add runtime input limits, and correct the privacy documentation before broad or shared deployment.

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 (2)

T09 · Insecure Skill Coding Practices

Warning
Location
src/index.ts:116
Finding

Plaintext Retention of User Destination Queries Contrary to Security Disclosure

Content
View full analysis
{ const cacheKey = `geo:${query.toLowerCase().trim()}`; const cached = cache.get(cacheKey); if (cached) return cached; const results = await nominatim.search(query, 1); if (!results.length) { throw new Error(`Could not find "${query}". Try a more specific name, e.g. "Tokyo, Japan".`); } const dest = results[0]; cache.set(cacheKey, dest, TTL.GEOCODING); return dest; } ``` ```typescript // src/utils/cache.ts:7-10 export const TTL = { GEOCODING: 30 * 24 * 60 * 60 * 1000, // 30 days WIKIVOYAGE: 7 * 24 * 60 * 60 * 1000, // 7 days WEATHER: 60 * 60 * 1000, // 1 hour SHORT: 5 * 60 * 1000, // 5 minutes } as const; ``` ```typescript // src/utils/cache.ts:65-75 set(key: string, data: T, ttlMs: number): void { const now = Date.now(); this.db .prepare(` INSERT OR REPLACE INTO cache (key, data, expires_at, created_at) VALUES (?, ?, ?, ?) `) .run(key, JSON.stringify(data), now + ttlMs, now); } ``` ### Technical Analysis The original normalized destination query is embedded directly in the SQLite cache key. It is therefore stored in plaintext for the 30-day geocoding cache lifetime. Although ordinary queries may contain only city names, the public API accepts arbitrary strings. A caller may submit a home address, workplace, medical facility, religious location, or another sensitive destination. TypeScript types do not prevent such values at runtime. This behavior also conflicts with `SECURITY.md`, which states that the Skill does not store user queries or personal data. The database stores both the ...[truncated 1494 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
src/planners/itinerary.ts:60
Finding

Unbounded Trip Duration Can Cause CPU and Memory Exhaustion

Content
View full analysis
baseThemes[i] ?? `Day ${i + 1}`); } ``` ### Technical Analysis `PlanRequest.durationDays` is declared as a TypeScript `number`, but TypeScript interfaces are erased at runtime. The public `planTrip()` function does not verify that the value is a finite integer within a safe operational range. The value is passed to `Array.from({ length: days })` and then controls an itinerary-building loop. An excessively large duration can allocate a very large array and cause a correspondingly large number of loop iterations and output objects. Depending on the supplied value and JavaScript conversion behavior, malformed values can also produce exceptions or inconsistent calculations. Related numeric inputs, including traveler counts, likewise lack runtime bounds, but `durationDays` presents the clearest direct ava ...[truncated 1314 chars]
Remediation
View remediation
30 ) { throw new RangeError('durationDays must be an integer between 1 and 30.'); } ``` 3. Enforce maximum lengths for destination strings, interests, and special requirements. 4. Validate traveler counts as bounded, non-negative integers and impose a reasonable total-traveler limit. 5. Validate `startDate` strictly rather than relying on JavaScript date coercion. 6. Apply validation before geocoding or weather retrieval so invalid requests do not consume external API capacity. 7. Add tests covering huge values, negative values, fractional values, `NaN`, `Infinity`, invalid dates, and oversized strings. 8. If the Skill is exposed through a service, also enforce request timeouts, concurrency limits, and output-size limits at the integration boundary. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (36)

Known Vulnerable Dependency: handlebars==4.7.8 — 8 advisory(ies): CVE-2026-33916 (Handlebars.js has Prototype Pollution Leading to XSS through Partial Template In); CVE-2026-33937 (Handlebars.js has JavaScript Injection via AST Type Confusion); CVE-2026-33938 (Handlebars.js has JavaScript Injection via AST Type Confusion by tampering @part) +5 more

Critical
Category
Supply Chain
Confidence
90% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The description presents the skill as a simple travel-planning integration, but the documented configuration and project structure indicate local filesystem access, SQLite cache creation, and a user-controlled cache path. This mismatch is dangerous because users may authorize the skill expecting only network lookups, while it can also write persistent local data and potentially touch unintended paths if path handling is unsafe.

Content

No source excerpt is available for this finding.

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · index.html (reported line 9)May include surrounding context.

html
<title>OpenCLAW Tour Planner — AI Travel Planning Skill for Agents</title>
    <meta name="description" content="Add complete travel planning to any AI agent in under 5 minutes. Itineraries, weather, attractions — your users ask in plain language, OpenCLAW handles the rest. Free & open source.">

    <!-- Open Graph -->
    <meta property="og:title" content="OpenCLAW Tour Planner — AI Travel Planning Skill">
    <meta property="og:description" content="Add complete travel planning to any AI agent in under 5 minutes. Free, open source, no API key required for core features.">
    <meta property="og:url" content="https://openclaw.tours/">

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · index.html (reported line 710)May include surrounding context.

html
<div class="cta-microcopy">clawhub install Asif2BD/openclaw-tour-planner &nbsp;·&nbsp; MIT License &nbsp;·&nbsp; Setup in &lt;5 min</div>
        </div>

        <!-- Social proof strip -->
        <div class="social-strip">
            <div class="social-stat">
                <span>🌍</span>

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · index.html (reported line 766)May include surrounding context.

html
</div>
    </section>

    <!-- Compatible With -->
    <div class="compat">
        <div class="compat-inner">
            <span class="compat-label">Works with</span>

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · index.html (reported line 877)May include surrounding context.

html
</div>
    </section>

    <!-- Install -->
    <section class="install" id="install">
        <div class="install-content">
            <h2>Up and Running in 3 Steps</h2>

Known Vulnerable Dependency: brace-expansion==1.1.12 — 4 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +1 more

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: js-yaml==3.14.2 — 4 advisory(ies): CVE-2026-84375 (js-yaml: maxTotalMergeKeys does not limit CPU use for empty merge sources); CVE-2026-59869 (js-yaml: YAML merge-key chains can force quadratic CPU consumption); GHSA-5p4m-2wfm-xmqj (JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026) +1 more

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: axios==1.13.6 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
95% confidence
Finding

axios is a direct production dependency of this travel-planning skill, which likely makes outbound HTTP requests to third-party APIs. Because the advisories include SSRF- and request-handling-related issues, a vulnerable HTTP client in a network-facing skill materially increases risk of server-side request forgery, credential leakage, or unsafe proxy handling if user input influences destinations or headers.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: brace-expansion==2.0.2 — 4 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +1 more

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: browserslist==4.28.1 — 2 advisory(ies): CVE-2026-73088 (Browserslist: Uncaught crash / prototype write via untrusted browserslist-stats.); CVE-2026-73089 (Browserslist: Unbounded memory growth (no cache eviction) via distinct query res)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: flatted==3.3.3 — 2 advisory(ies): CVE-2026-32141 (flatted vulnerable to unbounded recursion DoS in parse() revive phase); CVE-2026-33228 (Prototype Pollution via parse() in NodeJS flatted)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: form-data==4.0.5 — 1 advisory(ies): CVE-2026-12143 (form-data: CRLF injection in form-data via unescaped multipart field names and f)

High
Category
Supply Chain
Confidence
80% confidence
Finding

form-data is a transitive runtime dependency of axios, and the reported CRLF injection risk can become exploitable if multipart field names or filenames are derived from untrusted input. In a skill context, this is less central than SSRF, but still relevant if the skill uploads files or forwards user-controlled metadata to external services.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill advertises external API usage and configurable cache behavior, including environment-variable-driven settings, but does not declare any tool scope or permissions. This weakens user and platform visibility into what resources the skill may access, making it easier for an agent runtime to overgrant capabilities or for future code changes to use environment access without explicit review.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill routes user trip queries to multiple third-party services for geocoding, weather, and travel content, but the user-facing description does not warn that destination queries and related travel details leave the local agent context. This creates a privacy and data-handling risk because users may unknowingly disclose sensitive travel plans, locations, or preferences to external services.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · src/apis/weather.ts (reported line 29)May include surrounding context.

ts
* https://api.open-meteo.com
 */
export class WeatherClient {
  private readonly openMeteoBase = 'https://api.open-meteo.com/v1/forecast';
  private readonly visualCrossingBase =
    'https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline';

Known Vulnerable Dependency: @babel/core==7.29.0 — 1 advisory(ies): CVE-2026-49356 (@babel/core: Arbitrary File Read via sourceMappingURL Comment)

Low
Category
Supply Chain
Confidence
60% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: baseline-browser-mapping==2.10.0 — 1 advisory(ies): CVE-2026-45819 (baseline-browser-mapping process termination on invalid input causes denial of s)

Low
Category
Supply Chain
Confidence
60% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: follow-redirects==1.15.11 — 1 advisory(ies): CVE-2026-40895 (follow-redirects leaks Custom Authentication Headers to Cross-Domain Redirect Ta)

Low
Category
Supply Chain
Confidence
77% confidence
Finding

follow-redirects is a transitive runtime dependency of direct dependency axios. In a travel skill that calls external APIs, leaking authentication headers across cross-domain redirects can expose secrets or session tokens if the application follows redirects to attacker-controlled destinations.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

This is a manifest file, so vague-trigger checks apply. The description 'Universal travel planning skill for OpenClaw agents' is broad and does not define when the skill should activate, what requests it should respond to, or any exclusion conditions, which could contribute to unintended invocation.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The manifest frames the skill as a conversational travel planner using free APIs for itinerary, weather, attractions, and budget estimation. Including better-sqlite3 indicates local persistent storage capability, which is not mentioned in the stated behavior and goes beyond the described API-driven core features.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 25)May include surrounding context.

json
"author": "OpenClaw Community",
  "license": "MIT",
  "dependencies": {
    "axios": "^1.6.0",
    "better-sqlite3": "^9.4.0"
  },
  "devDependencies": {

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 26)May include surrounding context.

json
"license": "MIT",
  "dependencies": {
    "axios": "^1.6.0",
    "better-sqlite3": "^9.4.0"
  },
  "devDependencies": {
    "@types/better-sqlite3": "^7.6.8",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 29)May include surrounding context.

json
"better-sqlite3": "^9.4.0"
  },
  "devDependencies": {
    "@types/better-sqlite3": "^7.6.8",
    "@types/jest": "^29.5.0",
    "@types/node": "^20.0.0",
    "@typescript-eslint/eslint-plugin": "^7.0.0",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 30)May include surrounding context.

json
},
  "devDependencies": {
    "@types/better-sqlite3": "^7.6.8",
    "@types/jest": "^29.5.0",
    "@types/node": "^20.0.0",
    "@typescript-eslint/eslint-plugin": "^7.0.0",
    "@typescript-eslint/parser": "^7.0.0",

Static analysis

Detected: suspicious.env_credential_access, suspicious.exposed_secret_literal

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/apis/weather.ts:47

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
SKILL.md:134