Back to skill

Security audit

Vrbo — complete toolkit

Security checks for vulnerabilities and agentic risk

Overview

This is a disclosed StayingAPI integration skill for lodging search and pricing, with the main caution that its setup guide encourages persistent storage of an API key.

Use a sandbox key for testing. Store live STAYINGAPI_KEY in a protected secret store or narrowly scoped runtime environment when possible, avoid committing it to files, and rotate it if it may have been exposed. Expect the skill to contact StayingAPI and to support non-Vrbo platforms despite the Vrbo-focused name.

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

Note
Location
references/auth-setup.md:5
Finding
Persistent Plaintext Storage of StayingAPI Credentials## Vulnerability Details **File Location**: `references/auth-setup.md`, lines 5-8 and 28-30 **Vulnerability Type**: Persistent plaintext secret exposure **Risk Level**: Low **Relevant Code Snippet**: ```markdown This guide gets you a StayingAPI key and persists it so it survives across sessions. ## 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`. ``` ```bash export STAYINGAPI_KEY="stay_live_…" # or stay_test_… for the sandbox ``` ### Technical Analysis The authentication guide directs users to persist the API credential in a shell profile or configuration/environment file and demonstrates exporting the credential as an environment variable. Shell profiles and ordinary environment files commonly store values in plaintext. The guide does not require restrictive file permissions, recommend an operating-system keychain or secret manager, or limit credential injection to the process that needs it. When placed in a global shell profile, `STAYINGAPI_KEY` may be inherited by every descendant process launched from future shell sessions. Local programs, plugins, build scripts, diagnostic tools, crash handlers, or compromised processes operating under the same user account could inspect the inherited environment. If the profile or environment file has overly broad permissions, another local account may also be able to read the credential directly. ### Attack Path 1. The user follows the guide and adds `export STAYINGAPI_KEY="stay_live_…"` to a persistent shell profile or plaintext environment file. 2. The credential is automatically loaded into future sessions and inherited by child processes, or remains directly readable from the storage file. 3. A malicious or compromised process running in the u ...[truncated 1140 chars]
Remediation
## Remediation Suggestions 1. Prefer an operating-system keychain, dedicated secret manager, or the Agent runtime's protected credential store instead of a shell profile. 2. Inject `STAYINGAPI_KEY` only into the process that requires it rather than exporting it globally to all future sessions and child processes. 3. If file-based storage is unavoidable, use a dedicated file outside the repository, restrict it to the owning user with permissions such as `0600`, and ensure it is excluded from source control, logs, backups, and diagnostic bundles where appropriate. 4. Avoid displaying the credential in shell history, command traces, logs, error messages, or process arguments. 5. Document how users can revoke and rotate a potentially exposed key through the StayingAPI dashboard. 6. Clearly distinguish sandbox credentials from live credentials and recommend sandbox keys for development and testing. 7. Add guidance for periodically reviewing and rotating live credentials and for immediately revoking them after suspected disclosure.
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)

Description-Behavior Mismatch

Medium
Confidence
98% confidence
Finding
The manifest name and description frame this as a 'Complete Vrbo toolkit', yet the file documents first-class support for Airbnb, Booking, and Google across search, availability, price, listing, reviews, and cross-OTA price comparison. That is a broader cross-platform travel aggregation capability than a Vrbo-specific toolkit implies.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The heading and summary describe an everything skill for Vrbo, but the search endpoint is documented to query 'one or more platforms' and merge normalized results, and later sections emphasize cross-platform support. This is a semantic mismatch between the claimed product identity and the actual documented capability surface.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The document explicitly instructs the user to persist `STAYINGAPI_KEY` across future sessions without any warning about secure storage, scope limitation, or the risk of long-lived credential exposure. In an agent/runtime context, persisted environment variables may become accessible to other tools, logs, subprocesses, or future sessions, increasing the chance of unintended disclosure or misuse.

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.

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.