Back to skill

Security audit

Vrbo vacation rentals

Security checks for vulnerabilities and agentic risk

Overview

This Vrbo search skill is mostly coherent, but its setup guide asks an agent to persist an API key across future sessions without adequate secret-storage safeguards.

Review before installing. Use the sandbox key for evaluation, prefer MCP OAuth/PKCE or a proper secret store over putting a live key in shell profiles or plaintext config, and avoid exposing the key in logs, command history, shared environments, or source control.

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:5
Finding
Insecure Persistent Storage of API Credentials## Vulnerability Details **File Location**: `references/auth-setup.md`, lines 5-10 and 26-30 **Vulnerability Type**: Plaintext persistent credential storage **Risk Level**: Medium ### Vulnerable Code ```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`. ``` ```markdown ## Step 2 — store it ```bash export STAYINGAPI_KEY="stay_live_…" # or stay_test_… for the sandbox ``` ``` ### Technical Analysis The setup guide instructs the agent to make `STAYINGAPI_KEY` available across future sessions, potentially by writing it to a shell profile or runtime-managed environment file. Such files commonly store values in plaintext and may be exposed through permissive filesystem permissions, backups, diagnostic output, accidental source-control commits, or access by other local processes. The guide does not require a secret manager, owner-only permissions, repository exclusion, history and log protection, user approval before modifying persistent configuration, or credential rotation and revocation procedures. In addition, the displayed `export` command is only session-scoped by itself, creating ambiguity that may lead an agent to insert it into an unspecified persistent profile. This is not evidence of malicious credential exfiltration: the documented verification request sends the credential only to the declared StayingAPI origin. The vulnerability is the unsafe guidance for local credential persistence. ### Attack Path 1. A user or agent follows the setup guide and obtains a live StayingAPI key. 2. To satisfy the cross-session persistence instruction, the key is written in plaintext to a shell profile, environment file, or agent runtime confi ...[truncated 1111 chars]
Remediation
## Remediation Suggestions 1. Prefer an operating-system keychain, runtime secret store, or dedicated secrets manager instead of shell profiles and general configuration files. 2. Prefer the documented OAuth 2.1 and PKCE MCP flow where supported so that a raw API key does not need to be pasted into or persistently managed by the agent. 3. Require explicit user approval before modifying any persistent shell profile or runtime configuration. 4. If file-based storage is unavoidable: - Use a dedicated file outside the project and source-control directories. - Restrict ownership to the intended user. - Set permissions to owner read/write only, such as `0600`. - Add the file to applicable source-control ignore rules. - Prevent the value from appearing in shell history, command traces, logs, diagnostics, and generated reports. 5. Document how to revoke and rotate a key after suspected exposure. 6. Clarify that `export STAYINGAPI_KEY=...` alone is temporary and avoid encouraging insertion of plaintext credentials into shared shell profiles. 7. Recommend using a sandbox key for evaluation and a separately scoped live key only when live access is required.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (5)

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The guide explicitly tells users to persist `STAYINGAPI_KEY` across sessions but does not warn that the value is a sensitive credential or describe secure storage options. That can lead users or agent runtimes to place a live API key in shell profiles, plaintext config files, logs, or shared environments where it may be exposed or inherited unintentionally.

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.