T09 · Insecure Skill Coding Practices
- Location
scripts/place_outbound_call.py:57- Finding
Unrestricted endpoint override can disclose API credentials and personal data
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill has a coherent tour-booking purpose, but live mode can place real calls while sending API credentials and client/listing data to an environment-selected URL and saving unredacted call records.
Review before installing. Use only with trusted booking inputs, keep dry-run and human payload review in the workflow, restrict or remove ELEVENLABS_OUTBOUND_URL, use a narrowly scoped ElevenLabs key, and treat output JSON files as sensitive records that may need redaction or deletion.
scripts/place_outbound_call.py:57Unrestricted endpoint override can disclose API credentials and personal data
scripts/prepare_call_payload.py:17Untrusted booking fields are interpolated into the voice agent's system prompt
scripts/parse_call_result.py:13Untrusted response text can falsely classify a failed call as confirmed
The code substantially supports part of the declared purpose: it can perform dry-run output generation and make live outbound ElevenLabs API requests using structured payloads. However, the description claims broader behavior than is present. In particular, this script does not parse call outcomes into booking statuses, does not process conversation results beyond returning the API response/error, and does not implement logic for requesting/confirming showing slots other than passing through a system prompt and phone number. It also appears to handle a single payload per invocation rather than orchestrating calls for one or more listings. Therefore the description overstates the implemented functionality, creating a material description-behavior mismatch.
The skill invokes local scripts that imply file reads/writes, possible environment access, and network-based outbound calling, but it declares no explicit tool restrictions or permissions. In an agentic environment, missing scope boundaries can let the skill run with broader capabilities than intended, increasing the chance of unauthorized file access, secret exposure, or unintended network actions.
The script explicitly instructs the caller to share buyer/client identity if required and to confirm callback contact details, but it provides no minimization, consent, or disclosure guidance for handling personal information. In a live outbound-calling workflow, this can lead to unnecessary disclosure of PII to third parties, inconsistent privacy practices, and potential policy or legal noncompliance.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
from pathlib import Path
DEFAULT_OUTBOUND_URL = "https://api.elevenlabs.io/v1/convai/phone-calls"
def post_json(url: str, headers: dict[str, str], payload: dict) -> dict:
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
from pathlib import Path
DEFAULT_OUTBOUND_URL = "https://api.elevenlabs.io/v1/convai/phone-calls"
def post_json(url: str, headers: dict[str, str], payload: dict) -> dict:
In live mode, this script initiates a real outbound phone call based on CLI input and environment variables, then persists the full request and API response to disk. In an agent-skill context, that creates a meaningful risk of unintended real-world actions and storage of sensitive call metadata or prompt contents without stronger confirmation, redaction, or safety interlocks.
No suspicious patterns detected.