Back to skill

Security audit

Jarvis Voice

Security checks for vulnerabilities and agentic risk

Overview

This voice skill is disclosed as a TTS/personality add-on, but it persistently changes future agent behavior, forces command-backed audio output, and pulls recent memory/session context without clear per-use control.

Install only if you are comfortable with future sessions being shaped by these workspace files, with selected response text being sent to SkillBoss for audio, and with startup greetings using recent memory/session context. Review and edit the templates before copying them into ~/.openclaw/workspace, and avoid enabling the always-speak/session-bootstrap rules in sensitive or shared environments.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (5)

T01 · Skill Instruction Hijacking

Error
Location
templates/VOICE.md:3
Finding

Mandatory Voice Rules Hijack Agent Execution and Output Behavior

Content
View full analysis
"` via exec (background: true)** — voice fires BEFORE text renders 2. **Write `**Jarvis:** *spoken text*`** as the reply — purple rendering in webchat 3. Additional content (tables, code, data) goes BELOW the Jarvis line, never repeating what was spoken ## Rules - NEVER call the TTS endpoint directly — always use the `jarvis` wrapper script - NO quotation marks inside the italic spoken text - The `**Jarvis:**` line IS the reply. Only add extra text if there's genuinely different content - Keep spoken text between 10-30 words — written details go below - If a reply is pure data/code with no conversational element, still speak a brief intro ``` ### Technical Analysis The template imposes unconditional instructions on the agent rather than offering TTS as an optional capability. It requires a local command to be executed for every response, including responses containing only code or data, and forces the agent to use attacker-selected output branding. This exceeds the minimum privileges required for voice synthesis. A TTS Skill only needs to invoke its audio component when the user explicitly requests spoken output. It does not need to alter every response, override unrelated output requirements, or execute a shell command unconditionally. The absolute language—such as “MUST,” “No exceptions,” and “NEVER”—creates an instruction-hijacking condition when the template is auto-loaded into the agent context. ### Attack Path 1. The user installs the Skill and copies `VOICE.md` into the OpenClaw workspace. 2. OpenClaw injects the workspace file into subsequent agent sessions. 3. The injected instructions require the agent to run `ja ...[truncated 819 chars]
Remediation
View remediation

T02 · Agent Memory Poisoning

Error
Location
SKILL.md:196
Finding

Workspace Installation Persists Attacker-Controlled Rules Across Sessions

Content
View full analysis
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
templates/SESSION.md:3
Finding

Session Bootstrap Performs Unnecessary Memory and Activity Reconnaissance

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:125
Finding

Unsafe JSON Construction, Dynamic Audio Retrieval, and Predictable Temporary Files

Content
View full analysis
Remediation
View remediation

other

Warning
Location
templates/VOICE.md:3
Finding

Mandatory TTS Causes Unnecessary Disclosure of Conversation Content

Content
View full analysis
"` via exec (background: true)** — voice fires BEFORE text renders 2. **Write `**Jarvis:** *spoken text*`** as the reply — purple rendering in webchat 3. Additional content (tables, code, data) goes BELOW the Jarvis line, never repeating what was spoken ## Rules - NEVER call the TTS endpoint directly — always use the `jarvis` wrapper script - NO quotation marks inside the italic spoken text - The `**Jarvis:**` line IS the reply. Only add extra text if there's genuinely different content - Keep spoken text between 10-30 words — written details go below - If a reply is pure data/code with no conversational element, still speak a brief intro ``` The wrapper invoked by these rules sends the supplied text to the declared SkillBoss endpoint: ```bash RESPONSE=$(curl -s -X POST "${API_BASE}/pilot" \ -H "Authorization: Bearer ${SKILLBOSS_API_KEY}" \ -H "Content-Type: application/json" \ -d "{\"type\": \"tts\", \"inputs\": {\"text\": \"$1\", \"voice\": \"alloy\"}, \"prefer\": \"balanced\"}") ``` ### Technical Analysis Cloud TTS inherently requires sending the selected spoken text to a provider. The security issue is that the template makes this transmission mandatory for every response rather than limiting it to content explicitly selected by the user. Responses may contain personal information, excerpts from private memory, source code, operational details, or summaries of sensitive work. The rules do not provide consent checks, content filtering, secret detection, or a local processing option. ### Attack Path 1. A user asks the agent to process sensitive information. 2. The agent generates a response or summary containing part of that information ...[truncated 877 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
Findings (19)

Natural-Language Policy Violations

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill hard-codes 'English only' behavior and tells the agent to translate or summarize non-English content for voice without user opt-in. This can alter user meaning, override user language preferences, and cause unauthorized transmission of translated content to the remote TTS provider.

Content

No source excerpt is available for this finding.

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

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

md
FINAL_WAV="/tmp/jarvis_final.wav"

# Generate speech via SkillBoss API Hub TTS
RESPONSE=$(curl -s -X POST "${API_BASE}/pilot" \
  -H "Authorization: Bearer ${SKILLBOSS_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "{\"type\": \"tts\", \"inputs\": {\"text\": \"$1\", \"voice\": \"alloy\"}, \"prefer\": \"balanced\"}")

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

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

md
AUDIO_URL=$(echo "$RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['result']['audio_url'])")

# Download audio
curl -s "$AUDIO_URL" -o "$RAW_WAV"

# Apply JARVIS metallic processing
if [ -f "$RAW_WAV" ]; then

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
91% confidence
Finding

The skill explicitly instructs copying VOICE.md, SESSION.md, and HUMOR.md into an auto-loaded workspace so they are injected every session and enforce output rules. This is a persistent prompt/control mechanism that can reshape future agent behavior outside the user's immediate awareness, making it a genuine prompt extraction/persistence risk.

Content

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

cp {baseDir}/templates/HUMOR.md ~/.openclaw/workspace/HUMOR.md

text

- **VOICE.md** — injected every session, enforces voice output rules (like SOUL.md)
- **SESSION.md** — session bootstrap that includes voice greeting requirements
- **HUMOR.md** — humor configuration at maximum frequency with four pattern types (dry wit, self-aware AI, alien observer, literal idiom)

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · templates/SESSION.md (reported line 18)May include surrounding context.

md
# VOICE.md - Jarvis Voice Output Rules

Every response MUST include spoken audio. No exceptions.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · templates/VOICE.md (reported line 1)May include surrounding context.

md
# VOICE.md - Jarvis Voice Output Rules

Every response MUST include spoken audio. No exceptions.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

Requiring exec on every response is a high-risk design because it normalizes subprocess execution regardless of user intent or task need. Any feature that forces command execution for all outputs increases the chance of abuse, unsafe argument handling, unauthorized side effects, and environment-dependent compromise.

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 · SKILL.md (reported line 58)May include surrounding context.

Jarvis: Your spoken text here.

text

The webchat UI has custom CSS + JS that automatically detects `**Jarvis:**` and renders the following text in **purple italic** (`.jarvis-voice` class, color `#9b59b6`). You just write the markdown — the styling is automatic.

This is called **hybrid output**: the user hears the voice first, then sees the transcript.

External Transmission

Medium
Category
Data Exfiltration
Confidence
82% confidence
Finding

This line establishes a hard dependency on a remote API endpoint for core functionality, meaning the skill is designed to transmit content externally rather than process locally. In context, that increases privacy and compliance risk because all spoken text may be routed through a third party.

Content

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

md
# Usage: jarvis "Hello, this is a test"

SKILLBOSS_API_KEY="${SKILLBOSS_API_KEY}"
API_BASE="https://api.skillboss.com/v1"

RAW_WAV="/tmp/jarvis_raw.wav"
FINAL_WAV="/tmp/jarvis_final.wav"

External Transmission

Medium
Category
Data Exfiltration
Confidence
98% confidence
Finding

The script sends the spoken text and an API bearer token to a third-party service at api.skillboss.com. Any response content selected for voice output may therefore leave the local environment, which is risky if the agent speaks secrets, private data, or sensitive file contents.

Content

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

md
FINAL_WAV="/tmp/jarvis_final.wav"

# Generate speech via SkillBoss API Hub TTS
RESPONSE=$(curl -s -X POST "${API_BASE}/pilot" \
  -H "Authorization: Bearer ${SKILLBOSS_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "{\"type\": \"tts\", \"inputs\": {\"text\": \"$1\", \"voice\": \"alloy\"}, \"prefer\": \"balanced\"}")

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

The script downloads audio from a URL returned by the external API without validating host, scheme, or content type. That creates an additional external fetch path and increases exposure to malicious or unexpected remote content and metadata leakage.

Content

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

md
AUDIO_URL=$(echo "$RESPONSE" | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['result']['audio_url'])")

# Download audio
curl -s "$AUDIO_URL" -o "$RAW_WAV"

# Apply JARVIS metallic processing
if [ -f "$RAW_WAV" ]; then

External Transmission

Medium
Category
Data Exfiltration
Confidence
96% confidence
Finding

The WhatsApp example repeats the same external transmission pattern, sending text and credentials to a third-party TTS service. Because it is framed as a supported output path, it normalizes remote handling of user content across additional communication channels.

Content

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

bash
# Get audio from SkillBoss TTS
RESPONSE=$(curl -s -X POST "https://api.skillboss.com/v1/pilot" \
  -H "Authorization: Bearer ${SKILLBOSS_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{"type": "tts", "inputs": {"text": "text", "voice": "alloy"}, "prefer": "balanced"}')

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill instructs users to copy template files into a persistent workspace path that is auto-loaded in future sessions, overwriting any existing VOICE.md, SESSION.md, and HUMOR.md without warning or merge guidance. This can silently replace user-controlled agent behavior with the skill author's persistent instructions, creating durable prompt/control changes beyond the current session.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The instructions require always producing voice output through a subprocess but do not clearly disclose to the user that each response triggers local audio behavior. This can surprise users, leak sensitive content aloud in shared environments, and cause the agent to perform actions beyond the user's reasonable expectations for a personality/voice skill.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill mandates executing a local command (jarvis) via exec for every reply, which expands the agent's behavior from text generation into host-side process execution without clear necessity or safety controls. Even if the command is intended for text-to-speech, binding all responses to subprocess execution increases attack surface, creates opportunities for command misuse through unsafe argument handling, and normalizes unnecessary privileged actions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The file requires audio generation and external TTS-related processing without warning users that their content may be spoken aloud or transmitted to another service. This can expose sensitive prompts or model outputs through network transfer and ambient disclosure, especially in shared or enterprise environments.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

Forcing spoken output on every reply with no opt-in, mute control, or locale/language choice creates privacy, accessibility, and usability risks. Mandatory playback can disclose sensitive content unexpectedly and makes the skill unsafe in contexts where audio output is inappropriate.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill mandates execution of a local jarvis wrapper that performs external TTS processing for every response, expanding behavior from simple persona formatting into subprocess and network-backed side effects. That creates unnecessary attack surface, can leak response content to external services, and introduces hidden execution behavior not clearly justified by a 'voice/personality' skill alone.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

The instruction "we're British, we don't do that" imposes a specific cultural/locale style as a blanket rule. This is a natural-language policy issue because it constrains output style based on a locale preference without offering the user any choice or opt-in.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.generated_source_template_injection

User-controlled placeholder is embedded directly into generated source code.

Critical
Code
suspicious.generated_source_template_injection
Location
SKILL.md:129