Back to skill

Security audit

Phone Voice Integration

Security checks for vulnerabilities and agentic risk

Overview

This phone assistant guide is coherent in broad purpose, but it needs Review because it exposes broad personal memory, call history, and optional calendar data through a public voice bridge without clear caller-level controls or retention limits.

Review the actual bridge implementation before installing. Use this only if you are comfortable sending call content and selected local context to external voice and LLM providers, and first add strong authentication, caller-specific data scopes, minimal memory retrieval, transcript retention limits, log protection, and clear handling for secrets and spoken PINs.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
SKILL.md:50
Finding
Overprivileged Automatic Injection of Sensitive Memory and Call Data<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 50-64 and 182-196 **Vulnerability Type**: Excessive access to persistent user context and disclosure to an external LLM **Risk Level**: High ### Vulnerable Documentation ```markdown Not needed for this skill — the bridge bypasses OpenClaw and calls Claude directly. This gives you more control over memory injection and cost tracking. ### 2. Create the Bridge Server The bridge is a FastAPI server that: - Accepts OpenAI-compatible `/v1/chat/completions` requests from ElevenLabs - Injects memory context (MEMORY.md, USER.md, live data) - Calls Anthropic Claude API - Streams responses back in OpenAI format - Logs costs and transcripts **Key files:** - `server.py` — FastAPI app with /v1/chat/completions endpoint - `fred_prompt.py` — System prompt builder (loads memory files) - `.env` — Secrets (API keys, tokens, whitelist) - `contacts.json` — Caller whitelist for screening ``` ```markdown ## Memory Injection The bridge auto-loads context before each call: **Files read:** - `MEMORY.md` — Long-term facts about user, projects, preferences - `USER.md` — User profile (name, location, timezone) - Recent call transcripts (cross-call memory) **Live data injection:** - Current time/date - Weather (optional, via API) - Calendar events (optional, via gog CLI) All injected into the system prompt before Claude sees the conversation. ``` ### Technical Analysis The documented bridge bypasses OpenClaw and automatically loads broad persistent context before each call. That context includes long-term memory, the user profile, previous call transcripts, and potentially calendar information. It is then inserted into the system prompt and transmitted to Anthropic through the custom bridge. This design violates least-privilege and data-minimization principles. A routine phone conversation does not inherently require access to every fact in `MEMORY.md`, the complete user profile, or unrelated prior transcri ...[truncated 2505 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Remove unconditional memory loading** - Do not inject complete memory files or transcript history into every call. - Default to an empty or minimal context for new and unknown callers. 2. **Authenticate before retrieving sensitive context** - Require a strong authentication step before reading private data. - Do not rely exclusively on caller ID or a reusable spoken PIN. - Use short-lived challenges, account-linked verification, and replay protection for sensitive operations. 3. **Apply caller-specific authorization** - Associate each verified caller with explicit data scopes. - Distinguish general conversation, profile access, transcript access, calendar access, and action-taking permissions. - Deny access unless a scope is explicitly granted. 4. **Use task-specific retrieval** - Retrieve only the minimum fields needed for the caller's current request. - Use structured records with access-control metadata rather than inserting complete Markdown files. - Do not provide prior transcripts unless the caller is authorized for the particular conversation. 5. **Filter and redact sensitive information** - Exclude credentials, tokens, private keys, financial details, medical information, and unrelated third-party data. - Apply deterministic redaction before content is sent to ElevenLabs or Anthropic. - Prevent secrets in `.env` or adjacent files from ever entering prompts or logs. 6. **Separate untrusted input from privileged context** - Treat caller speech, transcript content, and stored call summaries as untrusted. - Prevent stored or spoken instructions from overriding authorization rules. - Enforce access decisions in application code rather than relying on model prompts. 7. **Protect transcripts and logs** - Encrypt stored transcripts and cost records. - Establish retention and deletion policies. - Restrict file permissions and avoid logging authorization tokens ...[truncated 407 chars]
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (9)

Credential Access

High
Category
Privilege Escalation
Content
### Voice PIN Challenge
For unknown callers or high-security actions:
```python
VOICE_PIN = "banana"  # Set in .env
```

Caller must say the PIN to proceed.
Confidence
96% confidence
Finding
The documented voice PIN example uses a static shared secret intended to be spoken aloud over a phone call, which is weak authentication and highly exposed to interception, replay, shoulder surfing, transcript retention, and social engineering. In this skill's context, the PIN is specifically used for unknown callers or high-security actions, making compromise more damaging because it could gate access to sensitive memory or privileged actions.

Description-Behavior Mismatch

Medium
Confidence
98% confidence
Finding
The documentation materially misrepresents the trust boundary: it says the skill connects ElevenLabs to OpenClaw, but the implementation instead bypasses OpenClaw and sends conversations to Anthropic directly. That discrepancy can cause operators to expose memory, caller data, and tool-related context to a different external processor than expected, undermining informed consent and safe deployment decisions.

Intent-Code Divergence

Medium
Confidence
95% confidence
Finding
The setup instructions explicitly say OpenClaw chat completions are not needed because the bridge bypasses OpenClaw, contradicting the skill's purpose and concealing the actual architecture. This increases the chance an admin deploys the integration with incorrect assumptions about policy enforcement, logging, and tool controls.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# Step 1: Store your bridge auth token as a secret
curl -X POST https://api.elevenlabs.io/v1/convai/secrets \
  -H "xi-api-key: YOUR_ELEVENLABS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
60% 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
```bash
# Step 1: Store your bridge auth token as a secret
curl -X POST https://api.elevenlabs.io/v1/convai/secrets \
  -H "xi-api-key: YOUR_ELEVENLABS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
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
```bash
# Step 1: Store your bridge auth token as a secret
curl -X POST https://api.elevenlabs.io/v1/convai/secrets \
  -H "xi-api-key: YOUR_ELEVENLABS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The skill states that MEMORY.md, USER.md, recent transcripts, and optional live data are injected into prompts sent to Claude, but it does not provide a clear user-facing privacy warning or consent model. This can disclose sensitive personal data, historical conversations, calendar details, or weather/location context to external services and to any caller who can elicit model responses from that context.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The documentation describes transcript and cost logging, including caller numbers, timestamps, duration, and conversation-derived summaries, without clearly warning that this data is retained on disk. Retained call metadata and transcripts create privacy and breach risk, especially for voice interactions that may contain sensitive personal or authentication information.

Natural-Language Policy Violations

Low
Confidence
97% confidence
Finding
The sample configuration sets the agent language to "en", which imposes a specific language by default. The file does not indicate that users can choose another language or that English is required for a justified regional/compliance reason.

Static analysis

No suspicious patterns detected.