Back to skill

Security audit

Voice Assistant

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent voice assistant, but it exposes an unauthenticated network service that can use the operator's speech-provider keys and OpenClaw gateway.

Review this carefully before installing. Use it only on a trusted machine or network, bind the server to localhost, add authentication and Origin checks before exposing it, avoid using a highly privileged OpenClaw gateway, and assume microphone audio, transcripts, and generated text may be sent to Deepgram or ElevenLabs and written to logs.

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

T09 · Insecure Skill Coding Practices

Warning
Location
static/index.html:253
Finding

DOM-based cross-site scripting through unsanitized transcript rendering

Content
View full analysis
${role === "user" ? "You" : "Agent"}:${text}`; el.appendChild(line); el.scrollTop = el.scrollHeight; } ``` ### Technical Analysis The `text` value is concatenated directly into `innerHTML`. It originates from WebSocket transcript messages containing either speech-to-text output or the OpenClaw gateway's generated response. Neither the server nor the browser sanitizes it before HTML parsing. An HTML payload containing an executable event handler, such as an image with an `onerror` attribute, will therefore be interpreted as markup instead of displayed as text. The system prompt's request that the model avoid formatting is not a security boundary and does not prevent a model, external tool result, or manipulated response from returning HTML. The `role` field is also interpolated into an HTML attribute. Although the current server supplies fixed roles, the client should not assume WebSocket message contents are intrinsically safe. ### Attack Path 1. A user or malicious data source causes the OpenClaw agent to return attacker-controlled HTML, for example by requesting that it repeat a crafted string exactly. 2. The server forwards the response in a transcript WebSocket message: `{"type":"transcript","role":"assistant","text":""}`. 3. `addTranscript()` inserts the value through `innerHTML`. 4. The browser parses the injected element and executes its event handler in the voice assistant's origin. 5. The injected JavaScript can read displayed conversation content, alter the interface, make same-origin req ...[truncated 741 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/server.py:574
Finding

Unauthenticated network-exposed voice and agent WebSocket

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/server.py:105
Finding

Sensitive conversation content written to plaintext application logs

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
pyproject.toml:9
Finding

Non-reproducible dependency resolution due to unbounded minimum-version constraints and absent lockfile

Content
View full analysis
=0.115.0", "uvicorn[standard]>=0.34.0", "websockets>=14.0", "httpx>=0.28.0", "python-dotenv>=1.0.0", ] ``` No dependency lockfile is present in the audited project. ### Technical Analysis Every runtime dependency has only a minimum version and no upper bound or exact resolved version. Consequently, two installations of the same skill can receive different direct and transitive dependency versions. A newly released, compromised, incompatible, or vulnerable version can be selected automatically without a corresponding change to the reviewed project. No evidence was found that the named packages are typosquatted or intentionally malicious. The confirmed issue is the lack of reproducible dependency resolution, not the presence of a known malicious package. The risk is amplified by `uvicorn[standard]`, which resolves additional optional dependencies transitively. Because the project has no committed lockfile, reviewers cannot determine the exact package set that will be installed at execution time. ### Attack Path 1. The project is audited while one set of dependency versions is current. 2. A later installation runs `uv` dependency resolution without a lockfile. 3. The package index provides newer direct or transitive versions allowed by the broad constraints. 4. Those versions are installed without being represented in the audited source tree. 5. If one of the selected releases is compromised or contains a security regression, its code executes in the server process with the skill's privileges. ### Impact Assessment A compromised runtime dependency would execute with the same operating-system privileges as the voice assistant server. It could potentially access: - Deepgram and ElevenLabs API keys loaded into ...[truncated 357 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (22)

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 37)May include surrounding context.

bash
cd {baseDir}
cp .env.example .env
# Fill in your API keys and gateway URL
uv run scripts/server.py
# Open http://localhost:7860 and click the mic

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 113)May include surrounding context.

bash
cd {baseDir}
cp .env.example .env
# Fill in your API keys and gateway URL
uv run scripts/server.py
# Open http://localhost:7860 and click the mic

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 114)May include surrounding context.

bash
cd {baseDir}
cp .env.example .env
# Fill in your API keys and gateway URL
uv run scripts/server.py
# Open http://localhost:7860 and click the mic

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 121)May include surrounding context.

bash
cd {baseDir}
cp .env.example .env
# Fill in your API keys and gateway URL
uv run scripts/server.py
# Open http://localhost:7860 and click the mic

Possible Typosquatting: 'uvicorn' resembles popular package 'gunicorn'

High
Category
Supply Chain
Confidence
70% confidence
Finding

Package name closely resembles a popular package, suggesting possible typosquatting. Attackers publish malicious packages with similar names to trick developers into installing them.

Content

No source excerpt is available for this finding.

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 · scripts/server.py (reported line 37)May include surrounding context.

python
# Configuration
# ---------------------------------------------------------------------------

load_dotenv(Path(__file__).parent.parent / ".env")

GATEWAY_URL = os.getenv("OPENCLAW_GATEWAY_URL", "http://localhost:4141/v1")
GATEWAY_MODEL = os.getenv("OPENCLAW_MODEL", "claude-sonnet-4-5-20250929")

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill clearly requires network access and handling of environment-provided secrets, but it does not declare any explicit tool scope or permissions boundary. That makes the operational trust model ambiguous and increases the risk that an agent may invoke the skill with broader capabilities than a user expects.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill sends microphone audio, transcripts, and synthesized speech through third-party STT/TTS providers, but the documentation does not prominently warn users that sensitive voice content may leave their machine and be processed externally. In a voice assistant context, this can expose personal, confidential, or regulated information without informed consent.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

The ElevenLabs STT integration sends captured user speech to an external API, which is a real data egress path for potentially sensitive voice content. In a real-time voice assistant, spoken input can contain credentials, personal data, or confidential business information, so external transmission materially increases privacy and compliance exposure.

Content

Scanner excerpt · scripts/server.py (reported line 133)May include surrounding context.

python
class ElevenLabsSTT:
    """STT via ElevenLabs Scribe API (REST-based, non-streaming)."""

    API_URL = "https://api.elevenlabs.io/v1/speech-to-text"

    def __init__(self):
        self._audio_buffer = bytearray()

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This server forwards raw microphone audio, transcripts, and generated text to third-party STT/TTS providers and to the OpenClaw gateway, but this file shows no consent, disclosure, or privacy guardrails before doing so. In a voice assistant context, that creates a real privacy and data-handling risk because users may unknowingly transmit sensitive spoken content to external services.

Content

No source excerpt is available for this finding.

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 · scripts/server.py (reported line 232)May include surrounding context.

python
try:
            async with httpx.AsyncClient(timeout=10.0) as client:
                resp = await client.get(
                    "https://api.elevenlabs.io/v1/voices",
                    headers={"xi-api-key": ELEVENLABS_KEY},
                )
                resp.raise_for_status()

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

The ElevenLabs TTS integration sends model output text to a third-party service for speech synthesis, creating another external data egress point. Because assistant responses may include echoed user data, summaries of sensitive input, or internal information from the gateway, this can leak sensitive content beyond the primary LLM boundary.

Content

Scanner excerpt · scripts/server.py (reported line 253)May include surrounding context.

python
await self._resolve_voice_id()

        url = (
            f"https://api.elevenlabs.io/v1/text-to-speech/{self._voice_id}/stream"
            f"?output_format=pcm_16000"
        )
        try:

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

The Deepgram TTS integration transmits generated text to an external provider, which is a real confidentiality risk if responses contain sensitive or regulated information. In this voice pipeline, every assistant utterance becomes outbound data to another vendor, increasing the overall exposure surface.

Content

Scanner excerpt · scripts/server.py (reported line 289)May include surrounding context.

python
async def synthesize_stream(self, text: str) -> AsyncGenerator[bytes, None]:
        """Stream audio bytes from Deepgram Aura for a given text chunk."""
        url = f"https://api.deepgram.com/v1/speak?model={TTS_VOICE_DG}&encoding=linear16&sample_rate={SAMPLE_RATE}"
        try:
            async with httpx.AsyncClient(timeout=30.0) as client:
                async with client.stream(

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The page captures live microphone audio and immediately streams raw PCM to a backend WebSocket, but the UI only says 'Click the mic to start' and 'Listening...' without clearly warning that speech is being transmitted off-device for remote STT/agent processing. In a voice-assistant skill, users may reasonably understand the mic is active, but they may not understand that audio leaves the browser and is sent to external services, creating a meaningful privacy and consent risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The configuration example sets VOICE_TTS_VOICE_DG=aura-2-theia-en, which hard-codes an English voice variant. The document does not explain that this is only an example default, offer locale choice at this point, or justify an English-only constraint for a region-specific use case.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: fastapi has 3 known advisory(ies) (CVE-2021-32677 (Cross-Site Request Forgery (CSRF) in FastAPI); CVE-2021-32677 (FastAPI is a web framework for building APIs with Python 3.6+ based on standard ); CVE-2024-24762 (FastAPI is a web framework for building APIs with Python 3.8+ based on standard )), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: uvicorn has 4 known advisory(ies) (CVE-2020-7694 (Log injection in uvicorn); CVE-2020-7695 (HTTP response splitting in uvicorn); CVE-2020-7694 (This affects all versions of package uvicorn. The request logger provided by the) +1 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: websockets has 4 known advisory(ies) (CVE-2018-1000518 (websockets is vulnerable to denial of service by memory exhaustion); CVE-2021-33880 (Observable Timing Discrepancy in aaugustin websockets library); CVE-2018-1000518 (aaugustin websockets version 4 contains a CWE-409: Improper Handling of Highly C) +1 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: httpx has 2 known advisory(ies) (CVE-2021-41945 (Improper Input Validation in httpx); CVE-2021-41945 (Encode OSS httpx <=1.0.0.beta0 is affected by improper input validation in `http)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: python-dotenv has 2 known advisory(ies) (CVE-2026-28684 (python-dotenv: Symlink following in set_key allows arbitrary file overwrite via ); CVE-2026-28684 (python-dotenv reads key-value pairs from a .env file and can set them as environ)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: pytest has 2 known advisory(ies) (CVE-2025-71176 (pytest has vulnerable tmpdir handling); CVE-2025-71176 (pytest has vulnerable tmpdir handling)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
72% confidence
Finding

The configured system prompt instructs the assistant to never use markdown, bullet points, or code blocks, imposing a fixed output format regardless of user preference. This is a natural-language constraint embedded in the file and does not provide any opt-in or override path for users who may want structured responses.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.