Back to skill

Security audit

voice-email

Security checks for vulnerabilities and agentic risk

Overview

This voice-email skill is mostly coherent, but it can send Gmail messages from voice transcription without a documented pre-send confirmation step and uses under-scoped credential and install guidance.

Review this before installing. Use a dedicated Gmail account and low-quota provider keys, avoid the unpinned global install path where possible, protect openclaw.json and backups, and do not use it for sensitive email unless the workflow is changed to show the parsed recipient, subject, and body and require explicit confirmation before sending.

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 (3)

T08 · Insecure Dependencies

Warning
Location
SETUP.md:37
Finding
Unpinned Global Installation of Third-Party Packages and Binaries<![CDATA[ ## Vulnerability Details **File Location**: `SETUP.md:37-50`; duplicated guidance in `SKILL.md:45-51` **Vulnerability Type**: Uncontrolled third-party dependency installation **Risk Level**: Medium ### Vulnerable Code Snippet ```bash npm install -g openclaw openclaw gateway start ``` ```bash npm install -g gogcli ``` ```text Option B - via binary: Download from https://gogcli.ai and verify the binary checksum. ``` ### Technical Analysis The setup guide instructs users to install the latest available versions of `openclaw` and `gogcli` globally through npm without pinning package versions or integrity values. npm package installation can execute package lifecycle scripts with the privileges of the installing user. Consequently, the reviewed documentation does not ensure that the code installed by a future user is the same code that was available when the skill was audited. The alternative installation method also directs users to download a binary from an external website without specifying an exact release, immutable artifact URL, trusted publisher identity, expected SHA-256 checksum, or signature-verification procedure. Although the guide says to verify the checksum, it does not provide a trusted checksum against which the downloaded file can be checked. There is no evidence in the reviewed files that either dependency is currently malicious. The vulnerability is the unsafe and non-reproducible dependency acquisition process. ### Attack Path 1. An attacker compromises the npm package, its maintainer account, the release website, or another part of the distribution channel. 2. The attacker publishes a malicious version or replaces the externally hosted binary. 3. A user follows the documented installation instructions, which implicitly retrieve the latest package or an unspecified binary. 4. npm lifecycle scripts or the downloaded executable run in the user's local security context. 5. The malicious component accesses or modifies resources a ...[truncated 904 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin every npm dependency to a reviewed exact version, for example: ```bash npm install -g openclaw@REVIEWED_VERSION npm install -g gogcli@REVIEWED_VERSION ``` 2. Document the expected package publisher, package digest, and trusted registry. 3. Prefer a reproducible local installation with a lockfile over global installation when operationally possible. 4. Review package lifecycle scripts and use `--ignore-scripts` where lifecycle execution is unnecessary. 5. For binary installation, provide: - An immutable release URL. - The exact version. - A SHA-256 digest obtained through a separate trusted channel. - A signed checksum or release signature. - Explicit signature and checksum verification commands. 6. Advise users not to install with root or `sudo` unless strictly required. 7. Periodically review and update pinned versions through a controlled dependency-update process. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
SETUP.md:69
Finding
API Credentials Stored in Plaintext OpenClaw Configuration<![CDATA[ ## Vulnerability Details **File Location**: `SETUP.md:69-100`; duplicated guidance in `SKILL.md:57-87` **Vulnerability Type**: Plaintext sensitive-data storage **Risk Level**: Medium ### Vulnerable Code Snippet ```json { "tools": { "media": { "audio": { "enabled": true, "models": [ { "provider": "deepgram", "model": "nova-3" } ] } } }, "env": { "DEEPGRAM_API_KEY": "YOUR_DEEPGRAM_KEY" } } ``` ```json { "messages": { "tts": { "auto": "always", "provider": "elevenlabs", "elevenlabs": { "apiKey": "YOUR_ELEVENLABS_KEY", "voiceId": "YOUR_VOICE_ID" } } } } ``` ### Technical Analysis The instructions direct users to place Deepgram and optional ElevenLabs API keys directly in `~/.openclaw/openclaw.json`. These secrets are therefore stored as recoverable plaintext rather than being retrieved from a system keyring, dedicated secret manager, or protected runtime secret source. The project also recommends copying this configuration to `~/.openclaw/openclaw.json.bak`. If the configuration contains provider keys, that operation creates an additional plaintext copy and broadens the secret's exposure surface. The documentation does not require owner-only file permissions, warn against committing or sharing the file, define log-redaction requirements, or explain secure secret rotation. The placeholder values are not themselves real leaked credentials; the risk arises when users replace them with operational keys as instructed. ### Attack Path 1. A user inserts valid Deepgram or ElevenLabs credentials into `~/.openclaw/openclaw.json`. 2. The user may create the documented `.bak` copy containing the same credentials. 3. Another local account, compromised process, backup system, support bundle, synchronization tool, or accidentally published repository obtains either file. 4. The attacker extracts the plaintext key. 5. The attacker submits request ...[truncated 832 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Store API credentials in a system keyring, platform secret store, or dedicated secrets manager. 2. If runtime environment injection is required, configure references to externally supplied secrets rather than embedding their values in `openclaw.json`. 3. Restrict configuration and backup permissions to the owning user: ```bash chmod 600 ~/.openclaw/openclaw.json chmod 600 ~/.openclaw/openclaw.json.bak ``` 4. Exclude OpenClaw configuration and backup files from source control, cloud synchronization, support bundles, and diagnostic archives. 5. Ensure logs and error messages redact API keys and authorization headers. 6. Use provider-side key restrictions, minimum required permissions, limited quotas, and usage alerts. 7. Document immediate key revocation and rotation procedures. 8. Replace plaintext configuration backups with encrypted backups or backups from which secret values have been removed. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:90
Finding
Email Is Sent Without a Documented Pre-Send Recipient Confirmation Gate<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:90-96`, conflicting with the claimed restriction at `SKILL.md:34-35`; equivalent immediate-send workflow in `SETUP.md:115-135` **Vulnerability Type**: Unsafe execution of a sensitive action after probabilistic transcription and parsing **Risk Level**: Medium ### Vulnerable Code Snippet The stated restriction is: ```text - ❌ Send emails to unknown recipients without user confirmation ``` However, the documented execution flow is: ```text Simply send a voice message with the command. The agent will: 1. Transcribe it (via Deepgram) 2. Parse the fields 3. Send the email (via gogcli) 4. Confirm via text (or voice if ElevenLabs configured) ``` The setup guide describes the same ordering: ```text 3. The system will: - Transcribe your voice - Parse recipient, subject, and body - Send the email - Confirm the action (text or voice) ``` ### Technical Analysis Sending email is an externally visible, difficult-to-reverse action. The documented pipeline passes a probabilistic speech transcript through a natural-language parser and then sends the resulting message immediately. Confirmation occurs only after transmission. No pre-send preview, explicit second confirmation, recipient allowlist, address normalization rule, ambiguity rejection rule, or authenticated-sender requirement is defined. This contradicts the skill's claim that it cannot send email to unknown recipients without user confirmation. Speech recognition can alter punctuation, recipient names, or domain names. The simple parser specification—extracting text after keywords such as `to`, `subject`, and `body`—does not demonstrate robust boundary handling or validation. Because the project contains no executable implementation, the claimed safety control cannot be verified elsewhere in the package. ### Attack Path 1. An authorized user submits a voice command, or an unauthorized party gains the ability to send voice messages to ...[truncated 1207 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Introduce a mandatory two-step workflow: - First, transcribe and parse the command. - Then, display the normalized recipient, subject, and complete body. - Send only after a distinct explicit confirmation from the authenticated user. 2. Require confirmation to identify the action clearly, such as: “Confirm sending to `recipient@example.com`.” 3. Validate recipient addresses using a strict email-address parser and reject malformed or ambiguous results. 4. Require manual confirmation for recipients not present in a user-managed allowlist or address book. 5. Reject transcripts with low confidence, multiple possible addresses, missing fields, or uncertain command boundaries. 6. Authenticate and authorize Telegram senders using stable account identifiers rather than display names. 7. Rate-limit sending and maintain an auditable record of the initiating Telegram identity, parsed fields, confirmation event, and Gmail result, while redacting sensitive content where appropriate. 8. Consider draft creation as the default behavior, requiring the user to approve the draft before final transmission. 9. Update the documentation so that the claimed recipient-confirmation guarantee accurately matches the implemented control. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (13)

Credential Access

High
Category
Privilege Escalation
Content
security:
  requires:
    - network
    - file_access
  credentials:
    - deepgram_api_key
    - telegram_bot_token
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
credentials:
    - deepgram_api_key
    - telegram_bot_token
    - gmail_oauth  # via gogcli, stored in system keyring
  optional_credentials:
    - elevenlabs_api_key  # optional, for voice responses
  permissions:
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Session Persistence

Medium
Category
Rogue Agent
Content
### Recommended: Use Test Accounts

For testing, create dedicated accounts:
- **Gmail**: Create a test Gmail account for development
- **Deepgram**: Use free tier with limited quota
- **Telegram**: Use a dedicated bot token
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.

External Transmission

Medium
Category
Data Exfiltration
Content
export DEEPGRAM_API_KEY="YOUR_KEY"

# Test with a sample audio file
curl -X POST "https://api.deepgram.com/v1/listen" \
  -H "Authorization: Token $DEEPGRAM_API_KEY" \
  -H "Content-Type: audio/ogg" \
  --data-binary @test.ogg
Confidence
82% confidence
Finding
The setup instructs users to transmit audio content and an API-authenticated request to Deepgram, which sends potentially sensitive voice data to a third-party external service. In an accessibility-focused email skill, spoken messages may contain email addresses, subjects, body content, or other private information, so external transcription increases confidentiality and privacy risk.

External Transmission

Medium
Category
Data Exfiltration
Content
export DEEPGRAM_API_KEY="YOUR_KEY"

# Test with a sample audio file
curl -X POST "https://api.deepgram.com/v1/listen" \
  -H "Authorization: Token $DEEPGRAM_API_KEY" \
  -H "Content-Type: audio/ogg" \
  --data-binary @test.ogg
Confidence
82% confidence
Finding
The setup instructs users to transmit audio content and an API-authenticated request to Deepgram, which sends potentially sensitive voice data to a third-party external service. In an accessibility-focused email skill, spoken messages may contain email addresses, subjects, body content, or other private information, so external transcription increases confidentiality and privacy risk.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
If voice messages fail to download:
- Check DNS: `resolvectl status`
- Try Cloudflare DNS: `sudo resolvectl dns tailscale0 1.1.1.1 1.0.0.1`
- Restart gateway: `openclaw gateway restart`

## Cost
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Unrestricted Tool Access

Medium
Category
Excessive Agency
Content
## What This Skill CANNOT Do

- ❌ Execute arbitrary code
- ❌ Access files outside of logging/debugging
- ❌ Modify system files
- ❌ Access other accounts without explicit OAuth
Confidence
80% confidence
Finding
Skill grants unrestricted tool access without appropriate constraints. An agent with unfettered tool access can perform arbitrary actions including file modification, network requests, and code execution.

Unrestricted Tool Access

Medium
Category
Excessive Agency
Content
## What This Skill CANNOT Do

- ❌ Execute arbitrary code
- ❌ Access files outside of logging/debugging
- ❌ Modify system files
- ❌ Access other accounts without explicit OAuth
Confidence
80% confidence
Finding
Skill grants unrestricted tool access without appropriate constraints. An agent with unfettered tool access can perform arbitrary actions including file modification, network requests, and code execution.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
- ❌ Execute arbitrary code
- ❌ Access files outside of logging/debugging
- ❌ Modify system files
- ❌ Access other accounts without explicit OAuth
- ❌ Send emails to unknown recipients without user confirmation
Confidence
60% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Session Persistence

Medium
Category
Rogue Agent
Content
## Best Practices for Production

1. **Use test accounts**: Create dedicated Gmail account for testing
2. **Limit Gmail OAuth**: Use app-specific passwords if needed
3. **Scope Deepgram**: Use minimal quota for testing
4. **Review logs**: Check `/tmp/openclaw-*.log` for unexpected activity
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.

External Transmission

Medium
Category
Data Exfiltration
Content
1. Test Deepgram directly:
```bash
curl -X POST "https://api.deepgram.com/v1/listen" \
  -H "Authorization: Token $DEEPGRAM_API_KEY" \
  -H "Content-Type: audio/ogg" \
  --data-binary @sample.ogg
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
1. Test Deepgram directly:
```bash
curl -X POST "https://api.deepgram.com/v1/listen" \
  -H "Authorization: Token $DEEPGRAM_API_KEY" \
  -H "Content-Type: audio/ogg" \
  --data-binary @sample.ogg
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Description-Behavior Mismatch

Low
Confidence
76% confidence
Finding
The manifest describes a voice-email accessibility skill, and most documented behavior aligns with that purpose. However, the setup guide states the skill requires access to Telegram, introducing a messaging-platform dependency that is not reflected in the manifest description.

Static analysis

No suspicious patterns detected.