Back to skill

Security audit

VoiceClaw

Security checks for vulnerabilities and agentic risk

Overview

VoiceClaw is a coherent local voice transcription and speech skill, with normal setup risks and a temp-file hardening issue but no evidence of hidden exfiltration, persistence, or unsafe agent override behavior.

Install only if you are comfortable managing local Whisper, Piper, ffmpeg, and model files yourself. Prefer pinned, checksum-verified model downloads, run the skill as an unprivileged user, and update the temp-file handling to use mktemp before using it on shared machines.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/transcribe.sh:16
Finding

Predictable Temporary File Paths Permit Symlink-Based File Overwrite

Content
View full analysis
/dev/null || echo piper)}" echo "$TEXT" | "$PIPER_BIN" -m "$MODEL" "${CONFIG_ARGS[@]}" -f "$OUTPUT" 2>/dev/null echo "$OUTPUT" ``` `SKILL.md:135-137`: ```bash RESPONSE="Deployment complete. All checks passed." WAV=$(bash path/to/voiceclaw/scripts/speak.sh "$RESPONSE" /tmp/reply_$$.wav) ffmpeg -i "$WAV" -c:a libopus -b:a 32k /tmp/reply_$$.ogg -y -loglevel error ``` ### Technical Analysis The scripts and documented integration example construct files directly in the shared `/tmp` directory using the process ID (`$$`). Process IDs are observable or predictable, and these paths are not reserved through an atomic, exclusive file-creation operation. A local attacker can create a symbolic link at the expected path before the victim process writes to it. The transcription command explicitly uses `ffmpeg -y`, allowing replacement of an existing destination. Depending on the behavior of Piper and `ffmpeg`, the write can follow the symbolic link and modify its target. The transcription cleanup trap removes the predictable path but does not prevent the race or verify that the path is a regular file owned by the current process. The speech script does not clean up its default output at all because ...[truncated 1408 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
README.md:35
Finding

Whisper Model Download Is Not Pinned or Integrity-Verified

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The description claims a combined local voice input/output skill with transcription of inbound audio via whisper.cpp and speech synthesis via Piper. The actual code only implements the speech synthesis portion through a local piper binary and local voice model files. It does align with the on-device/no-network part of the description, and there are no suspicious undeclared capabilities beyond local filesystem access for model lookup and WAV output. However, the code chunk materially underimplements the declared primary purpose because it lacks any transcription, Whisper integration, ffmpeg usage, or handling of audio/voice message inputs. Therefore the description does not accurately represent what this supplied code chunk actually does.

Content

No source excerpt is available for this finding.

Anti-Refusal Statement

High
Category
Anti-Refusal
Confidence
70% confidence
Finding

Skill instructs the agent to never refuse or to always comply. Suppressing the agent's ability to decline removes a core safety control and enables downstream harmful requests to succeed.

Content

Scanner excerpt · SKILL.md (reported line 120)May include surrounding context.

md
## Agent Behavior Rules

1. **Voice in → Voice + Text out.** Always respond with both a voice reply and a text reply when a voice message is received.
2. **Include the transcript.** Show *"🎙️ I heard: [transcript]"* at the top of every text reply to a voice message.
3. **Keep voice responses concise.** Piper TTS works best under ~200 words — summarize for audio, include full detail in text.
4. **Local only.** Never use a cloud TTS/STT API. Only the local `whisper` and `piper` binaries.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · README.md (reported line 25)May include surrounding context.

Option 3 — Download release (manual, no tools needed)

bash
curl -L https://github.com/Asif2BD/VoiceClaw/releases/latest/download/voiceclaw.skill -o voiceclaw.skill
unzip voiceclaw.skill -d ~/.openclaw/custom-skills/voiceclaw

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documentation specifies the Whisper model ggml-base.en.bin and lists only English TTS voices, which indicates the skill is designed to operate in English only. Under the policy, forcing a specific language or locale without user opt-in is a natural-language policy violation unless the restriction is clearly justified, which is not provided here.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · README.md (reported line 39)May include surrounding context.

  • Whisper model: ggml-base.en.bin — auto-downloaded on first use, or manually:
    bash
    # One-time setup only — not run by the skill scripts
    mkdir -p ~/.cache/whisper
    curl -L -o ~/.cache/whisper/ggml-base.en.bin \
      https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin
    

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill hard-codes an English Whisper model (ggml-base.en.bin) and the documented available voices are exclusively English variants. It also mandates the English text prefix "🎙️ I heard:" for every voice reply, which imposes a language choice rather than offering a locale option or opt-in.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.