Back to skill

Security audit

Show Booking

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its stated real-estate booking purpose, but it handles client data and generated calendar invites in ways that deserve review before installation.

Review this skill before installing if you will use it with real client data. Only run live outbound calls after explicit approval, keep generated JSON and audit logs in a controlled location, and avoid importing or forwarding generated .ics files from untrusted listing or notes content until the calendar escaping issue is fixed.

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
scripts/create_invite_ics.py:31
Finding
Unescaped User-Controlled Data Permits iCalendar Content Injection## Vulnerability Details **File Location**: `scripts/create_invite_ics.py`, lines 31–53 **Vulnerability Type**: iCalendar content injection caused by missing RFC 5545 escaping **Risk Level**: Medium ### Vulnerable Code ```python def build_ics(event: dict) -> str: start = to_dt(event["start_time"]) end = to_dt(event.get("end_time")) if event.get("end_time") else start + timedelta(minutes=30) uid = f"{uuid4()}@show-booking" created = datetime.now(timezone.utc) summary = f"Showing: {event['address']}" desc = event.get("notes", "Real estate showing booked by AI calling workflow.") location = event["address"] return "\n".join( [ "BEGIN:VCALENDAR", "VERSION:2.0", "PRODID:-//show-booking//EN", "BEGIN:VEVENT", f"UID:{uid}", f"DTSTAMP:{format_ics_time(created)}", f"DTSTART:{format_ics_time(start)}", f"DTEND:{format_ics_time(end)}", f"SUMMARY:{summary}", f"DESCRIPTION:{desc}", f"LOCATION:{location}", "END:VEVENT", "END:VCALENDAR", "", ] ) ``` ### Technical Analysis The `address` and `notes` fields originate from the input JSON and are interpolated directly into iCalendar content. The implementation does not validate line breaks or escape RFC 5545 text delimiters such as backslashes, commas, and semicolons. An attacker who can influence a confirmed-showing record can include carriage-return or newline characters in these fields. These characters terminate the intended property and introduce additional iCalendar properties or components. Depending on the behavior of the receiving calendar application, injected content could include misleading organizer or attendee information, alarms, descriptions, links, or additional event metadata. ### Attack Path 1. An attacker supplies or influences a confirmed-showing JSON record. 2. The attacker inserts newli ...[truncated 997 chars]
Remediation
## Remediation Suggestions 1. Apply RFC 5545 text escaping before inserting external values into the generated document: - Escape backslashes as `\\`. - Escape commas as `\,`. - Escape semicolons as `\;`. - Encode line breaks as literal `\n` sequences rather than allowing raw CR or LF characters. 2. Explicitly reject carriage-return and newline characters in fields that should remain single-line, particularly `address`. 3. Validate the input JSON against a strict schema, including required field types, lengths, and accepted timestamp formats. 4. Use a maintained iCalendar-generation library that correctly handles text escaping and line folding instead of constructing the document through string interpolation. 5. Add tests using malicious values containing `\r`, `\n`, commas, semicolons, and backslashes, and verify that no additional ICS property can be created. 6. Consider limiting the length of `address` and `notes` to reduce abuse and malformed calendar output.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (5)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The supplied code implements only the intake-parsing portion of the declared workflow. It reads text from a file or CLI argument, extracts simple fields using regex, and outputs normalized JSON. While listing-data extraction is mentioned in the description, the broader declared purpose is an automation skill that books showing tours, coordinates calls, creates calendar invites, and returns confirmations. None of those downstream actions are present in this code chunk. Therefore the code's actual behavior is materially narrower than the declared description.

Lp3

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The skill instructs the agent to read input files and write multiple outputs under /tmp, but it does not declare any explicit tool or permission scope. That creates an authorization gap where the agent may access filesystem capabilities without clear user-visible constraints, increasing the chance of unintended data exposure or misuse of client and listing information.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The workflow directs transmission of client identity, listing metadata, preferred windows, and callback instructions to an outbound calling sub-agent, but it does not require a clear user-facing warning or affirmative consent before sharing that data. In a real-estate context this can expose personal and transactional information to another agent or external system without adequate notice, creating privacy, compliance, and trust risks.

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
This file contains natural-language behavior that forces a specific locale-related default when no timezone is supplied. Because the skill does not offer a user choice or document that it is intentionally region-specific, this can violate language/locale policy expectations.

Missing User Warnings

Low
Confidence
85% confidence
Finding
This code file performs a file write of normalized JSON derived from intake text, which may contain personal data such as client names and phone numbers. Although the CLI argument names imply output behavior, there is no explicit warning, confirmation, or user-facing disclosure that sensitive intake data will be persisted to the specified path.

Static analysis

No suspicious patterns detected.