Back to skill

Security audit

hotbutter voice chat

Security checks for vulnerabilities and agentic risk

Overview

The skill clearly discloses its hosted voice relay design, but its relay client can let relay-supplied messages invoke the local OpenClaw agent without local confirmation or session validation.

Review this carefully before installing. It is a hosted voice bridge, not a private/local-only tool: spoken transcripts and agent responses pass through the relay. Only use it with OpenClaw permissions you are comfortable exposing to relay-delivered prompts, prefer a relay you control, avoid agents that can reveal secrets or mutate important data, and verify the download/dependencies rather than relying on the streamed install command.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
lib/relay-client.js:43
Finding

Unauthenticated Relay Messages Can Invoke the Local OpenClaw Agent

Content
View full analysis
{ console.log(`[voice-bridge] User said: "${text}"`); relay.sendTyping(true); try { const response = await bridge.sendMessage(sessionId, text); console.log(`[voice-bridge] Agent response: "${response}"`); relay.sendMessage(response); relay.sendTyping(false); } catch (err) { console.error(`[voice-bridge] Error sending to agent:`, err.message); relay.sendMessage('Sorry, I encountered an error processing your message.'); relay.sendTyping(false); } }); ``` ### Technical Analysis The relay client records the session ID received in a `relay:paired` message, but an incoming `relay:message` is not checked against that recorded value. The code also does not require pairing to have completed before forwarding a message. Consequently, any `relay:message` supplied by the connected relay is treated as an authorized user request. Its attacker-controlled `sessionId` and `text` values are passed to `AgentBridge.sendMessage`, which invokes: ```text openclaw agent --session-id -m ``` The use of `execFile` prevents direct shell metacharacter injection, but it does not address the authorization flaw. The prompt still reaches the local OpenClaw agent and ...[truncated 1678 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
index.html:43
Finding

Unverified Remote Archive Installation and Unpinned Dependency Resolution

Content
View full analysis
text
curl -sL https://hotbutter.ai/skill/download | tar -xzf -
cd skill-hotbutter && npm install
``` Rendered installation command: ```sh curl -sL https://hotbutter.ai/skill/download | tar -xzf - cd skill-hotbutter && npm install ``` ```json // package.json:20-22 "dependencies": { "ws": "^8.18.0" } ``` No package lockfile is present in the audited project structure. ### Technical Analysis The documented installation command streams a mutable remote response directly into `tar` without first checking an expected digest or a digital signature. HTTPS protects data in transit under normal conditions, but it does not establish that the downloaded archive is the specific artifact reviewed by the user. A compromised distribution server, account, build pipeline, or trusted TLS endpoint could provide different files at the same URL. After extraction, the instructions run `npm install`. The `ws` dependency uses a compatible-version range, and the project does not include a lockfile. Installation can therefore resolve a dependency version different from the reviewed version. Although no malicious dependency was identified in the audited package manifest, this process reduces reproducibility and increases exposure to future supply-chain compromise. ### Attack Path 1. An attacker compromises the download endpoint, its deployment pipeline, or another trusted part of the artifact distribution chain. 2. The attacker replaces the archive returned by `/skill/download` while retaining the same URL. 3. A user follows the documented command, which extracts the response without validating a checksum or signature. 4. The modified project files are installed and later executed when the user starts `voice-bridge`. 5. A ...[truncated 940 chars]
Remediation
View remediation
skill-hotbutter-0.1.0.tar.gz' | sha256sum --check - tar -xzf skill-hotbutter-0.1.0.tar.gz ``` 4. Prefer cryptographic release signatures or supply-chain attestations so users can verify both integrity and publisher identity. 5. Commit a reviewed `package-lock.json` containing exact versions and integrity hashes. 6. Replace `npm install` with `npm ci` in installation and deployment documentation. 7. Pin dependencies to reviewed versions and use an intentional update process with automated vulnerability and provenance checks. 8. Configure the package manager to use a trusted registry and review lifecycle scripts before installation. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (7)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The code logs and forwards user speech text through a remote relay/bridge workflow but does not present a clear, explicit privacy notice at the point of use that transcripts may be transmitted to external services. In a voice interface, spoken content frequently includes sensitive personal or business data, so silent transmission to a remote service creates a real privacy and consent risk even if it is part of the intended functionality.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This code opens a WebSocket connection to an external relay and immediately sends agentId and agentName during registration. It also later transmits session message content, but the file contains no confirmation prompt, print/log disclosure, or explanatory comment/docstring warning that user or system data is sent off-host.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The sendMessage method transmits arbitrary text to the remote relay associated with the current session. There is no prompt, warning, or explanatory comment in the file to inform users that message content is being sent to an external service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The first-run setup collects an email address and writes it to ~/.hotbutter without clearly warning the user that this value will be stored locally and persisted across runs. While the data element is limited, undisclosed persistence of personal information is still a privacy weakness and can surprise users on shared systems or environments with weak home-directory protections.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The document declares lang="en", which imposes a specific language/locale setting in natural-language metadata. Under the policy, locale constraints should either be user-selectable or clearly justified as region-specific, and no such opt-in or justification appears here.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 21)May include surrounding context.

json
}
  },
  "dependencies": {
    "ws": "^8.18.0"
  }
}

Unverifiable Dependency: ws has 7 known advisory(ies) (CVE-2016-10518 (Remote Memory Disclosure in ws); CVE-2024-37890 (ws affected by a DoS when handling a request with many HTTP headers); CVE-2026-45736 (ws: Uninitialized memory disclosure) +4 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.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
lib/agent-bridge.js:29