Back to skill

Security audit

ESP32 Voice Assistant for Openclaw

Security checks for vulnerabilities and agentic risk

Overview

The skill has a coherent voice-assistant purpose, but it asks users to build and run unpinned Docker code from an external GitHub repo while supplying voice data and API keys.

Review the upstream GitHub repository and Docker Compose file before running it, preferably pin to a specific commit you trust, and only provide the API keys and OpenClaw/ESPHome details needed for your chosen providers. Treat spoken audio and transcripts as data that may be sent to the selected STT/TTS providers and your configured OpenClaw endpoint.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (1)

T03 · Remote Payload Retrieval and Execution

Error
Location
SKILL.md:33
Finding

Mutable Remote Repository Is Retrieved and Executed

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 33-50
Vulnerability Type: Remote payload retrieval and execution
Risk Level: High

Vulnerable Code

bash
git clone https://github.com/darrenjrobinson/voice-esp32-openclaw.git
cd voice-esp32-openclaw
cp .env.example .env

The subsequently retrieved project is built and started with:

bash
docker compose --profile bridge up -d --build
docker compose logs -f voice-bridge
# expect: "Connected to <device> (…)" and "device announcement format: flac @ 48000 Hz"

Technical Analysis

The Skill instructs users to clone the mutable default branch of an external GitHub repository and then build and execute its Docker Compose configuration. It does not pin the repository to an audited commit hash or immutable signed release.

Consequently, the code ultimately executed can differ from the code present when the Skill was reviewed. The audited package contains neither the referenced Dockerfile and Compose file nor the bridge implementation and dependency manifests, so their effective behavior and privileges cannot be verified from this artifact.

This exceeds a safely reviewable execution model because control over the upstream default branch effectively provides control over the payload run by users. Although the remote repository is necessary to obtain the declared bridge implementation, retrieving and executing a mutable revision is not the minimum privilege or trust required to provide that functionality.

Attack Path

  1. An attacker compromises the upstream repository, a maintainer account, or another mechanism capable of changing its default branch.
  2. The attacker modifies the Dockerfile, Compose configuration, bridge source, or dependency definitions.
  3. A user follows the Skill instructions and clones the current, attacker-controlled default branch.
  4. The user populates .env with provider API keys, the OpenClaw bearer ...[truncated 1278 chars]
Remediation
View remediation

Remediation Suggestions

  1. Pin the upstream source to a reviewed full commit SHA rather than cloning and executing the mutable default branch.
  2. Prefer bundling the reviewed bridge source, Dockerfile, Compose file, dependency manifests, and lockfiles directly with the Skill.
  3. Publish immutable release artifacts with cryptographic checksums and signed provenance, and require verification before building or running them.
  4. Pin container base images by digest and lock all language dependencies to exact versions with integrity hashes.
  5. Audit the Compose configuration and enforce least privilege: do not mount the Docker socket, avoid privileged containers and host networking, use read-only filesystems where possible, drop Linux capabilities, run as a non-root user, and expose only required ports.
  6. Pass only provider credentials required by the selected STT and TTS configuration. Use Docker secrets or another dedicated secret store instead of broadly exposing credentials through the container environment where practical.
  7. Document the external transmission of voice recordings and transcripts, restrict outbound traffic to the selected providers and OpenClaw endpoint, and use encrypted transport for sensitive communications whenever supported.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (5)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
# Copy to .env and fill in. .env is gitignored.

# STT/TTS provider selection: "xai" | "elevenlabs" | "fishaudio" — independently
# switchable, any combination works (e.g. xai STT + fishaudio TTS for a custom voice).

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · example.env (reported line 1)May include surrounding context.

text
# Copy to .env and fill in. .env is gitignored.

# STT/TTS provider selection: "xai" | "elevenlabs" | "fishaudio" — independently
# switchable, any combination works (e.g. xai STT + fishaudio TTS for a custom voice).

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill captures spoken audio and sends it to external STT/TTS providers and an OpenClaw endpoint, but the description does not clearly warn users that voice content and session identifiers leave the local device. This creates a real privacy and consent issue because users may reasonably assume a local-only assistant from the hardware-focused description.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The environment variable description states XAI_TTS_LANGUAGE has a default of en, which imposes a language default in natural-language configuration without mentioning user opt-in or broader language selection guidance. This can conflict with language/locale policy expectations when a skill implicitly forces one language.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

The natural-language comment and value specify a single spoken language, with XAI_TTS_LANGUAGE=en, but there is no indication here that users can choose another language or opt in to English-only behavior. This can violate language/locale policy when a skill implicitly forces one language for speech interactions.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.