Back to skill

Security audit

Vrbo search

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a legitimate travel-search integration, but it tells the agent to persist an API key across future sessions without clear secret-storage safeguards.

Review the credential setup before installing. Prefer the MCP/OAuth flow or a sandbox/session-only key for evaluation, and avoid putting a live STAYINGAPI_KEY in a broad shell profile unless permissions and access are tightly controlled. If you only want Vrbo results, make sure the agent sends platforms=vrbo.

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
references/auth-setup.md:7
Finding
Underspecified Persistent Storage of API Credentials## Vulnerability Details **File Location**: `references/auth-setup.md`, lines 7–10 and 28–33 **Vulnerability Type**: Persistent plaintext credential exposure **Risk Level**: Medium ### Vulnerable Code Snippet ```markdown ## Step 0 — how to store an env var on this system Figure out the correct way to persist an environment variable on this machine so it is available in every future session (a shell profile, or a config/env file managed by your agent runtime). The variable name is `STAYINGAPI_KEY`. ``` ```markdown ## Step 2 — store it ```bash export STAYINGAPI_KEY="stay_live_…" # or stay_test_… for the sandbox ``` ``` ### Technical Analysis The setup guide explicitly directs the Agent to make `STAYINGAPI_KEY` available in every future session and permits storage in a shell profile or Agent-managed environment file. It does not require an operating-system secret manager, owner-only file permissions, encryption, restricted process scope, log redaction, or user approval before persistent storage. The displayed `export` command is session-local when executed alone. The security issue arises from combining it with the preceding instruction to determine and implement a persistent storage mechanism. An Agent may consequently place a live, potentially billable API key in a plaintext shell initialization file or broadly accessible runtime configuration. This unnecessarily increases both the credential lifetime and the number of processes or future Agent sessions that may inherit or access it. The behavior is not evidence of malicious persistence because it stores a legitimate service credential rather than a backdoor; however, the security controls around that persistence are insufficiently specified. ### Attack Path 1. A user supplies a live `STAYINGAPI_KEY` while configuring the Skill. 2. The Agent follows Step 0 and writes the key into a shell profile or runtime environment file so that it survives future sessions. ...[truncated 1341 chars]
Remediation
## Remediation Suggestions 1. Default to session-only credential injection rather than persistent storage. 2. Obtain explicit user consent before storing a key across sessions. 3. Prefer the documented OAuth 2.1 with PKCE MCP workflow or an operating-system/runtime secret manager. 4. If file-based storage is unavoidable: - Use a dedicated credential file rather than a shared shell profile. - Restrict ownership to the intended user. - Enforce owner-only permissions, such as mode `0600` on applicable systems. - Prevent the file from being committed to source control or included in ordinary backups and diagnostic bundles. - Avoid exposing the key to unrelated child processes. 5. Do not print, echo, or log the credential during setup or verification. 6. Document key revocation and rotation procedures. 7. Recommend sandbox keys for evaluation and live keys only when live data is necessary. 8. Add guidance to rotate the credential immediately if it is written to an insecure location or disclosed.
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 (6)

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
The manifest description says this skill is for finding Vrbo listings, but the file's tool documentation describes a generic `/v1/search` endpoint that searches 'across one or more platforms' and can return unified results from Airbnb, Booking.com, Vrbo, and Google Hotels. Although it notes that Vrbo filtering can be achieved with `platforms=vrbo`, the actual documented capability is broader than the manifest's Vrbo-specific scope.

External Transmission

Medium
Category
Data Exfiltration
Content
- **Authorization:** `Bearer $STAYINGAPI_KEY`
- **User-Agent:** your agent's name (e.g. `ClaudeCode/1.0`).

Base URL: `https://api.stayingapi.com/v1`.

## Tools
Confidence
95% confidence
Finding
The skill instructs the agent to send an Authorization bearer token and user-supplied search details to an external internet service. This creates a real external data transmission path involving credentials and potentially sensitive travel itinerary data; the risk is contextual but genuine because the agent will disclose information outside the local environment.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The manifest describes a skill for searching Vrbo stays, but the documentation advertises support for additional endpoints and capabilities including availability, price, price-compare, listing details, and reviews across platforms. These are materially broader travel-data operations than a search-only skill and are not justified by the narrow manifest description.

External Transmission

Medium
Category
Data Exfiltration
Content
## Step 3 — verify

```bash
curl -s "https://api.stayingapi.com/v1/account" -H "Authorization: Bearer $STAYINGAPI_KEY" | head
```

A `200` with your account envelope means the key works. A missing/invalid key returns `401 authentication_error` (never billed). Full contract: <https://api.stayingapi.com/openapi.json>.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
## Step 3 — verify

```bash
curl -s "https://api.stayingapi.com/v1/account" -H "Authorization: Bearer $STAYINGAPI_KEY" | head
```

A `200` with your account envelope means the key works. A missing/invalid key returns `401 authentication_error` (never billed). Full contract: <https://api.stayingapi.com/openapi.json>.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
## Step 3 — verify

```bash
curl -s "https://api.stayingapi.com/v1/account" -H "Authorization: Bearer $STAYINGAPI_KEY" | head
```

A `200` with your account envelope means the key works. A missing/invalid key returns `401 authentication_error` (never billed). Full contract: <https://api.stayingapi.com/openapi.json>.
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Static analysis

No suspicious patterns detected.