T08 · Insecure Dependencies
- Location
SKILL.md:263- Finding
Unpinned Dependencies Installed into the System Python Environment
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is purpose-aligned for voice generation, but it gives the agent broad account, voice-cloning, credential, and calling authority with weak scoping and plaintext persistence.
Review carefully before installing. Use only dedicated ElevenLabs/Twilio accounts, scoped tokens, and a dedicated browser profile; avoid putting account passwords or broad auth tokens in .env; require explicit consent for voice cloning and comply with call-recording, telemarketing, and outreach laws before enabling calls.
SKILL.md:263Unpinned Dependencies Installed into the System Python Environment
SKILL.md:143ElevenLabs API Credentials Are Persisted Redundantly in Plaintext Files
voice_generator.py:141Predictable Shared Temporary Files Permit Symlink and Concurrency Attacks
SKILL.md:103Autonomous Setup Reuses an Authenticated Google Browser Session and Creates Credentials
The README instructs users to place sensitive credentials in a .env file for automated use, while the broader skill is designed to self-configure external services and make calls. Although using .env is common, in this context it increases the risk of credential exposure, overbroad reuse by the agent, or accidental leakage through logs, workspace access, or downstream automation.
Minimum (TTS only):
→ Google connected in virtual-desktop, OR email/password in .env
→ 3 MP3 voice samples in /workspace/voice/samples/
For calls (add):
The code's real primary function is narrower than the description: it generates TTS audio using an existing ElevenLabs API key and voice ID, reports status, and summarizes/list call-related JSON records. There is no code for cloning voices, creating/managing an ElevenLabs conversational agent, integrating with Twilio APIs, placing or answering calls, or navigating a website/virtual desktop to self-configure credentials. The call-related functionality is limited to reading pending/history files from disk, not executing telephony actions. Thus the description materially overstates the implemented capabilities and setup behavior.
The skill promotes voice cloning, automated calling, transcript collection, and reporting without a prominent upfront warning about consent, legal compliance, and biometric/privacy sensitivity. In this context, missing warnings materially increase the chance of unsafe or unauthorized impersonation and recording workflows.
The skill explicitly automates credential retrieval and writes all credentials to .env automatically. That encourages collection, persistence, and reuse of secrets in a broadly accessible format, which is dangerous in any agent environment.
Navigates elevenlabs.io autonomously via virtual-desktop
Logs in via Google OAuth or email/password
Creates API key, clones voice, configures agent
Writes all credentials to .env automatically
LAYER 2 — TEXT TO SPEECH
Converts any text to MP3 using Wesley's cloned voice
The skill instructs reading ElevenLabs email/password from .env for automated login. Using stored account passwords for browser automation increases blast radius if the environment or logs are exposed.
5. Proceed to API key creation
OPTION B — Email / Password
Condition: ELEVENLABS_EMAIL and ELEVENLABS_PASSWORD in .env
Process:
1. virtual-desktop opens https://elevenlabs.io/app/sign-in
The skill depends on reading Twilio credentials from .env to configure telephony features. These credentials can enable call placement, messaging, and account changes, so storing and consuming them this way creates substantial account-compromise risk.
Only runs if TWILIO_ACCOUNT_SID is in .env
Navigation path:
Dashboard → "Agents" → "Create Agent"
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
curl -s https://api.elevenlabs.io/v1/user -H "xi-api-key: $ELEVENLABS_API_KEY" | python3 -m json.tool
# Expected: JSON with subscription info
# If 401 error: API key is wrong or expired
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
print(f"✅ Voice ID saved to config.json")
#### Step 3 — Clone via curl (alternative)
```bash
# Clone with multiple files
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
# { "voice_id": "abc123...", "name": "Wesley" }
# Extract and save the voice_id
VOICE_ID=$(curl -s -X POST https://api.elevenlabs.io/v1/voices/add -H "xi-api-key: $ELEVENLABS_API_KEY" -F "name=Wesley" -F "files=@/workspace/voice/samples/sample_01.mp3" -F "files=@/workspace/voice/samples/sample_02.mp3" -F "files=@/workspace/voice/samples/sample_03.mp3" | python3 -c "import sys,json; print(json.load(sys.stdin)['voice_id'])")
echo "Voice ID: $VOICE_ID"
This instruction appends data into a global .env file, normalizing direct secret/state persistence outside the skill boundary. Such patterns commonly lead to secret leakage, accidental reuse, and privilege spread across tasks.
echo "Voice ID: $VOICE_ID"
echo "ELEVENLABS_VOICE_ID=$VOICE_ID" >> /docker/openclaw-yyvg/.env echo "✅ ELEVENLABS_VOICE_ID written to .env"
The skill directs writing sensitive identifiers into a global .env file outside the declared workspace, which bypasses the skill's stated boundary and persists secrets in a broader shared location. This can expose credentials to unrelated processes, users, or later tasks.
Appending ELEVENLABS_VOICE_ID to /docker/openclaw-yyvg/.env violates the declared permission model and normalizes writing agent-derived state into a global environment file. While a voice ID is less sensitive than an API key, the out-of-scope write still breaks containment and can facilitate later misuse.
Even though the specific value here is a voice ID, the pattern is still credential/state persistence in a global environment file. It creates an unsafe precedent and broadens access to data generated by the skill.
echo "Voice ID: $VOICE_ID"
echo "ELEVENLABS_VOICE_ID=$VOICE_ID" >> /docker/openclaw-yyvg/.env echo "✅ ELEVENLABS_VOICE_ID written to .env"
The repeated instruction confirming write to .env reinforces unsafe secret-handling behavior and indicates persistence of operational data in a shared global location. This compounds risk of later disclosure or misuse.
echo "ELEVENLABS_VOICE_ID=$VOICE_ID" >> /docker/openclaw-yyvg/.env echo "✅ ELEVENLABS_VOICE_ID written to .env"
#### Step 4 — List all voices (verify clone appears)
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
# Via curl
curl -s https://api.elevenlabs.io/v1/voices -H "xi-api-key: $ELEVENLABS_API_KEY" | python3 -c "
import sys, json
data = json.load(sys.stdin)
The documented step to 'Get API Key from dashboard' instructs the agent to retrieve a credential directly from a provider UI. This is credential harvesting behavior, and in the context of autonomous browser control it is particularly dangerous because it bypasses normal user-mediated secret handling.
→ If login fails: log to ERRORS.md, notify principal
#### Step 2 — Get API Key from dashboard
Navigation path (2026 UI):
This step instructs capturing a newly created API key from the dashboard and writing it to /docker/openclaw-yyvg/.env. Harvesting and persisting one-time-visible secrets into a global file is a serious credential-handling weakness.
→ Or: find input with type="password" that appears after creation 8. Save immediately: → Write to /workspace/voice/config.json → Write to /docker/openclaw-yyvg/.env as ELEVENLABS_API_KEY=sk_...
Direct URL shortcut: https://elevenlabs.io/app/settings/api-keys
Documented behavior writes ELEVENLABS_API_KEY to /docker/openclaw-yyvg/.env, which is outside declared write permissions. That is a boundary violation and creates secret persistence in a sensitive global location.
Saving identifiers to both config.json and .env broadens storage locations unnecessarily. Duplicating operational state across files increases exposure and complicates revocation and auditing.
→ Click the three-dot menu "⋯" on the voice card → Click "Copy Voice ID" → Or find in URL: elevenlabs.io/app/voice-lab/[VOICE_ID] 12. Save to config.json + .env
Direct URL shortcut: https://elevenlabs.io/app/voice-lab
The skill documents a direct DELETE operation on externally hosted voice resources with a variable identifier and no confirmation or ownership checks. In an agent setting, destructive API actions without validation can delete the wrong asset or be abused through parameter manipulation.
→ Background noise in samples
→ Multiple speakers in same file
Solution:
→ Delete the bad clone: DELETE /v1/voices/{voice_id}
curl -X DELETE https://api.elevenlabs.io/v1/voices/$VOICE_ID -H "xi-api-key: $ELEVENLABS_API_KEY"
→ Record new samples (quieter environment, longer duration)
→ Re-run cloning process
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
→ Multiple speakers in same file
Solution:
→ Delete the bad clone: DELETE /v1/voices/{voice_id}
curl -X DELETE https://api.elevenlabs.io/v1/voices/$VOICE_ID -H "xi-api-key: $ELEVENLABS_API_KEY"
→ Record new samples (quieter environment, longer duration)
→ Re-run cloning process
Telling the operator to update config.json and .env with regenerated API keys extends the same insecure credential lifecycle pattern. Reissued keys remain vulnerable if stored in plaintext local files.
PROBLEM: "Invalid API key" (401)
Solution: Regenerate key in dashboard
Direct URL: https://elevenlabs.io/app/settings/api-keys
Update config.json and .env with new key
PROBLEM: ffmpeg not found for audio concatenation
Solution:
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
GET /v1/voices → list all voices
POST /v1/voices/add → create IVC clone (multipart form)
GET /v1/voices/{id} → get voice details
DELETE /v1/voices/{id} → delete a voice
POST /v1/text-to-speech/{id} → generate audio (JSON body)
GET /v1/models → list available models
The setup guidance normalizes storing ElevenLabs email/password in .env as a standard option. That encourages weak secret hygiene for primary account credentials instead of safer delegated access methods.
MINIMUM (TTS only — no calls):
Option A: Google account connected in virtual-desktop browser
Option B: ELEVENLABS_EMAIL + ELEVENLABS_PASSWORD in .env
+ 3 MP3 voice samples in /workspace/voice/samples/
FOR CALLS (add Twilio):
The instruction to add Twilio credentials to .env for calls encourages storing highly sensitive telephony credentials in plaintext configuration. If exposed, attackers could place calls/messages, access logs, or reconfigure account assets.
→ Save as MP3 (any quality works for IVC)
→ Upload to /workspace/voice/samples/
3. (Optional) Add Twilio credentials to .env for calls
4. Run voice-agent — it configures itself automatically
Detected: suspicious.prompt_injection_instructions