Back to skill

Security audit

Booking.com reviews

Security checks for vulnerabilities and agentic risk

Overview

This is a disclosed StayingAPI integration for reading travel listing reviews, but users should handle the API key carefully and note that the documentation is broader than Booking.com reviews.

Install only if you intend to use StayingAPI for travel review data. Prefer a sandbox key for evaluation, store any live key in a secret manager or protected env file outside source control, and be aware the documentation mentions broader StayingAPI platform and endpoint capabilities than Booking.com reviews alone.

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

API Key May Be Persisted in Insecure Plaintext Configuration

Content
View full analysis

Vulnerability Details

File Location: references/auth-setup.md, lines 7–10 and 27–31
Vulnerability Type: Plaintext sensitive credential storage
Risk Level: Medium

Vulnerable Code

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
text

### Technical Analysis

The setup guide instructs the agent to persist `STAYINGAPI_KEY` in a shell profile or agent-managed configuration file. It does not require an encrypted secret store, owner-only file permissions, exclusion from version control, protection from command tracing, or log redaction.

Shell profiles and general-purpose environment files commonly store values as plaintext and may be copied into backups, synchronized between systems, included in diagnostic archives, or accidentally committed to a repository. Environment variables can also be exposed to child processes and process-inspection facilities depending on the operating system and runtime configuration.

The example `export` command only sets the variable for the current shell and its descendants. Persistence would require placing it in a startup or runtime configuration file, but the guide leaves the choice and security properties of that file unspecified. This ambiguity increases the likelihood of insecure credential handling.

### Attack Path

1. A user obtains a live StayingAPI key and follows the setup instructions.
2. The user or agent writes the key into a plaintext shell profile, shared runtime configuration, or version-controlled environment file.
3. A local user, compromised process, backup reader, repository collaborator, o
...[truncated 963 chars]
Remediation
View remediation

Remediation Suggestions

  1. Prefer the agent runtime's encrypted secret manager, operating-system keychain, or a dedicated secrets-management service instead of shell profiles.
  2. If file-based storage is unavoidable, use a dedicated file outside the project directory and set owner-only permissions, such as mode 0600 on Unix-like systems.
  3. Explicitly prohibit storing the key in source-controlled files, shared shell profiles, command history, transcripts, logs, or diagnostic output.
  4. Add the relevant secret and environment files to .gitignore, while noting that ignore rules do not protect files already committed.
  5. Disable shell tracing before handling the credential and ensure verification commands do not print or log the key.
  6. Limit credential exposure to only the processes that require it rather than exporting it globally to every future session.
  7. Document key rotation and immediate revocation procedures for suspected exposure.
  8. Clarify that the displayed export command is session-scoped unless loaded from a protected configuration mechanism.
  9. Recommend using sandbox keys for development and evaluation, reserving live keys for environments with appropriate secret controls.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill is presented as a Booking.com-only reviews reader, but the body documents broader multi-platform review access and cross-platform capabilities. This scope mismatch can mislead the invoking agent into granting or using the skill beyond the user’s expected intent, increasing the chance of unintended data access or capability expansion.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

A reviews-focused skill includes documentation for unrelated functions such as search, availability, pricing, listing lookup, and job polling. Even if not directly exposed as named tools here, this expands the operational surface area and can prompt an agent to perform actions outside the principle of least privilege or user expectation.

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 · SKILL.md (reported line 46)May include surrounding context.

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.

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 · SKILL.md (reported line 117)May include surrounding context.

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.

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 · references/auth-setup.md (reported line 34)May include surrounding context.

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.

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 · references/auth-setup.md (reported line 37)May include surrounding context.

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.

Static analysis

No suspicious patterns detected.