Back to skill

Security audit

Avatar

Security checks for vulnerabilities and agentic risk

Overview

This avatar skill is mostly coherent, but it exposes powerful agent, messaging, and provider-key capabilities with weak access controls.

Review before installing. Run it only on a trusted local machine, bind the server to localhost, add authentication before exposing any port, avoid enabling Slack/email or Stream Deck sends until confirmations and recipient limits exist, rotate any Simli key exposed during testing, and update/pin dependencies.

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

T05 · Unauthorized Access and Privilege Escalation

Error
Location
src/server.ts:286
Finding

Unauthenticated privileged API endpoints are exposed on all network interfaces

Content
View full analysis
{ const clientConfig: ClientConfig = getClientConfig(config); res.json(clientConfig); }); app.post('/api/speaking-done', async (_req: Request, res: Response) => { await setSpeaking(false); res.json({ ok: true }); }); app.post('/api/chat', async (req: Request, res: Response) => { const { message, lang } = req.body; // ... const response = await sendChat(augmented); // ... res.json({ spoken, detail }); }); app.post('/api/send-slack', async (req: Request, res: Response) => { const { text } = req.body; // ... const response = await sendChat( `[SYSTEM] Send the following message via Slack DM to targets: ${targetStr}. Do NOT modify the content, just send it as-is. Reply with just "Sent!" after.\n\n${text}` ); res.json({ ok: true, response }); }); app.post('/api/tts', async (req: Request, res: Response) => { const { text, lang, voiceId: customVoiceId } = req.body; // ... const ttsRes = await fetch( `https://api.elevenlabs.io/v1/text-to-speech/${voiceId}?output_format=pcm_16000`, { method: 'POST', headers: { 'xi-api-key': config.secrets.elevenLabsApiKey, 'Content-Type': 'application/json', }, body: JSON.stringify(ttsBody), } ); // ... }); app.post('/api/send-email', async (req: Request, res: Response) => { const { text } = req.body; // ... const response = await sendChat( `[SYSTEM] Send the following content to ${config.integrations.email.recipient} as an email from ${config.app.name}. Use a suitable subject line based on the content. Do NOT modify the content. Reply with just "Sent!" after ...[truncated 2322 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/config/index.ts:112
Finding

Simli API key is disclosed through an unauthenticated client configuration endpoint

Content
View full analysis
{ const clientConfig: ClientConfig = getClientConfig(config); res.json(clientConfig); }); ``` ### Technical Analysis The application explicitly copies `SIMLI_API_KEY` from the server's secret configuration into a JSON response available from `/api/client-config`. The endpoint is unauthenticated. The comment claiming that the response contains no secrets is contradicted by the implementation. A long-lived provider API key is a bearer credential; anyone who obtains it may attempt to use it independently of this application. This exposure is amplified because the Express service is not explicitly restricted to the loopback interface. ### Attack Path 1. An attacker gains network access to the avatar server. 2. The attacker sends `GET /api/client-config`. 3. The server returns JSON containing `simliApiKey`. 4. The attacker extracts the key. 5. The attacker reuses the credential with Simli services outside the avatar application, subject to the key's provider-side privileges. A browser XSS payload executing in the application origin could perform the same extraction. ### Impact Assessment Potential impact includes: - Unauthorized Simli sessions. - Consumption of the victim's service quota. - Financial loss or account throttling. - Exposure of provider resources accessible to the API ...[truncated 64 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/client/app.ts:220
Finding

Unsanitized agent Markdown and configuration values allow DOM-based cross-site scripting

Content
View full analysis
${flag} ${lang.name}`; langOptions.appendChild(btn); } ``` ```ts for (const avatar of clientConfig.avatars) { const btn = document.createElement('button'); btn.className = 'avatar-option'; btn.dataset.faceId = avatar.faceId; btn.dataset.voiceId = avatar.voiceId; btn.innerHTML = `
${avatar.name}
`; avatarOptions.appendChild(btn); } ``` ```html ``` ### Technical Analysis The client converts agent-controlled `detail` output to HTML through Marked and assigns the result directly to `innerHTML`. Marked is a Markdown parser, not an HTML sanitizer. No sanitization layer is applied before insertion into the DOM. The application also inserts `lang.name` and `avatar.name` from `avatar.config.json` into `innerHTML`. These values are locally configurable and could become attacker-controlled if configuration is modified or generated by another system. No restrictive Content Security Policy is shown in the audited HTML. Therefore, active HTML generated from malicious Markdown or configuration can potentially execute scripts or event handlers in the application's origin. ### Attack Path Agent-output path: 1. An attacker causes the OpenClaw agent to ret ...[truncated 1193 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
src/server.ts:32
Finding

Persistent device private key is stored as plaintext Base64 without explicit restrictive permissions

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
package.json:47
Finding

Mutable runtime dependency and unverified CDN script create supply-chain risk

Content
View full analysis
``` ### Technical Analysis The runtime dependency `simli-client` uses the mutable `latest` tag rather than an explicit version. Although the current lockfile records a resolved package, installations that regenerate or ignore the lockfile may retrieve a different release without source review. The browser also loads Marked from a CDN without an exact version or a Subresource Integrity hash. This allows the effective browser-side code to change independently of the audited repository. These patterns do not prove that the present dependencies are malicious. They create unnecessary exposure to compromised upstream releases, CDN compromise, package-account takeover, and unexpected breaking changes. ### Attack Path NPM path: 1. A deployment performs dependency installation without strictly enforcing the committed lockfile. 2. The `latest` tag resolves to a newer or compromised `simli-client` release. 3. The application bundles or executes the changed package. 4. Malicious package code runs in the application's trusted context. CDN path: 1. The CDN asset or upstream package is modified or compromised. 2. A user loads the avatar page. 3. The browser downloads the changed script without integrity verification. 4. The script executes in the avatar origin and can invoke same-origin APIs. ### Impact Assessment A compromised dependency may obtain: - Browser-origin access to avatar APIs and exposed client configuration. - Access to user interactions and rendered agent content. - The ability to issue Slack, email, TTS, or chat requests. - Server-side privileg ...[truncated 170 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/server.ts:102
Finding

Arbitrary gateway configuration can disclose the OpenClaw token and requests broad operator scopes

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • 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
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (71)

Known Vulnerable Dependency: tar==7.5.7 — 9 advisory(ies): CVE-2026-59873 (node-tar: Decompression/parse DoS via unlimited input); CVE-2026-26960 (Arbitrary File Read/Write via Hardlink Target Escape Through Symlink Chain in no); CVE-2026-59874 (node-tar: Negative tar entry size causes infinite loop in archive replace) +6 more

Critical
Category
Supply Chain
Confidence
90% 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.

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

  1. Configure environment
    bash
    cp .env.example .env
    # Edit .env and add your API keys
    

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

  1. Configure environment

    bash
    cp .env.example .env
    # Edit .env and add your API keys
    
  2. Start the server

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 · src/cli.ts (reported line 25)May include surrounding context.

ts
2. **Configure environment**
   ```bash
   cp .env.example .env
   # Edit .env and add your API keys
   ```

3. **Start the server**

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Hardware integration and shortcut actions that can trigger send_slack or send_email go well beyond passive avatar rendering. In this context, concealed action shortcuts are especially risky because they can turn a presentation interface into an action-taking control surface capable of transmitting sensitive content or triggering workflows.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Hardware integration and shortcut actions that can trigger send_slack or send_email go well beyond passive avatar rendering. In this context, concealed action shortcuts are especially risky because they can turn a presentation interface into an action-taking control surface capable of transmitting sensitive content or triggering workflows.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Hardware integration and shortcut actions that can trigger send_slack or send_email go well beyond passive avatar rendering. In this context, concealed action shortcuts are especially risky because they can turn a presentation interface into an action-taking control surface capable of transmitting sensitive content or triggering workflows.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Hardware integration and shortcut actions that can trigger send_slack or send_email go well beyond passive avatar rendering. In this context, concealed action shortcuts are especially risky because they can turn a presentation interface into an action-taking control surface capable of transmitting sensitive content or triggering workflows.

Content

No source excerpt is available for this finding.

Hidden Instructions

High
Category
Prompt Injection
Confidence
70% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

Scanner excerpt · index.html (reported line 496)May include surrounding context.

html
<div id="top-bar">
    </div>

    <!-- Settings Page -->
    <div id="settings-page">
      <div class="settings-header">
        <h2>Settings</h2>

Known Vulnerable Dependency: nanoid==3.3.11 — 3 advisory(ies): CVE-2026-67214 (nanoid: non-secure generators can loop indefinitely with negative size); CVE-2026-67213 (nanoid: custom generators can loop indefinitely when size is zero); CVE-2026-73086 (nanoid: Integer Overflow or Wraparound)

High
Category
Supply Chain
Confidence
80% 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.

Known Vulnerable Dependency: path-to-regexp==8.3.0 — 2 advisory(ies): CVE-2026-4923 (path-to-regexp vulnerable to Regular Expression Denial of Service via multiple w); CVE-2026-4926 (path-to-regexp vulnerable to Denial of Service via sequential optional groups)

High
Category
Supply Chain
Confidence
92% confidence
Finding

path-to-regexp 8.3.0 is a transitive runtime dependency of Express router and the cited issues are ReDoS/DoS conditions in route matching. Because this skill depends on Express at runtime, maliciously crafted request paths may trigger excessive CPU consumption and degrade or deny service availability.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: postcss==8.5.6 — 4 advisory(ies): CVE-2026-45623 (PostCSS: Arbitrary file read and information disclosure via attacker-controlled ); CVE-2026-69153 (PostCSS: incomplete fix of GHSA-6g55-p6wh-862q — attacker-controlled sourceMappi); CVE-2026-41305 (PostCSS has XSS via Unescaped </style> in its CSS Stringify Output) +1 more

High
Category
Supply Chain
Confidence
80% 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.

Known Vulnerable Dependency: rollup==4.57.1 — 1 advisory(ies): CVE-2026-27606 (Rollup 4 has Arbitrary File Write via Path Traversal)

High
Category
Supply Chain
Confidence
80% 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.

Known Vulnerable Dependency: vite==5.4.21 — 3 advisory(ies): CVE-2026-39365 (Vite Vulnerable to Path Traversal in Optimized Deps `.map` Handling); CVE-2026-53571 (vite: `server.fs.deny` bypass on Windows alternate paths); CVE-2026-53632 (launch-editor: NTLMv2 hash disclosure via UNC path handling on Windows)

High
Category
Supply Chain
Confidence
80% 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.

Known Vulnerable Dependency: ws==8.19.0 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
93% confidence
Finding

ws 8.19.0 is a direct runtime dependency, and the cited issues include memory disclosure and memory exhaustion from attacker-controlled WebSocket traffic. Given this skill's interactive avatar/video use case, WebSockets are especially likely to be exposed to remote clients, which makes the availability and data exposure risk materially more relevant.

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 · src/cli.ts (reported line 46)May include surrounding context.

ts
} catch (err) {
    console.error('Configuration error:', (err as Error).message);
    console.error('\nMake sure you have:');
    console.error('  1. Copied .env.example to .env');
    console.error('  2. Added your SIMLI_API_KEY and ELEVENLABS_API_KEY');
    process.exit(1);
  }

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

Email sending is triggered from Stream Deck events with no user-facing confirmation, preview, or local interaction at the time of transmission. Because the action can be initiated remotely through the event channel, it creates a higher-risk path for accidental or unauthorized outbound sharing of potentially sensitive AI-generated content.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The function comment explicitly says the returned client config contains no secrets, but getClientConfig() includes config.secrets.simliApiKey. Sending an API key to the client exposes a credential to any user or script with access to the frontend bundle or network responses, enabling unauthorized use of the Simli service and possible billing abuse or account compromise.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The chat prompt tells the agent it has full access to HubSpot, Gmail, Calendar, Notion, and Slack, despite the avatar skill's narrow stated purpose. Embedding user input into a prompt with broad tool authority creates an overprivileged agent path where ordinary conversation can steer high-impact actions or data access.

Content

No source excerpt is available for this finding.

Ssd 1

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

User input is concatenated into a privileged natural-language instruction that grants broad workspace access and asks the model to use tools. This creates a prompt-layer capability escalation path where crafted conversation can steer the agent into sensitive retrievals or side effects not enforced by code-level policy.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

This server exposes Slack DM and email sending capabilities even though the skill is described as an avatar/TTS renderer. That mismatch materially expands the trust boundary: a user or downstream agent can trigger outbound communications and potential data disclosure through integrations that are unrelated to the stated purpose.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The prompt instructs the agent to send supplied content via Slack DM 'as-is' and only reply 'Sent!', creating a direct semantic exfiltration channel. Any sensitive data placed into text can be forwarded externally with minimal friction and no content inspection.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The email path similarly tells the agent to forward supplied content unchanged, which turns the model into a free-form data relay. This is dangerous because sensitive conversation output can be packaged and sent externally without policy enforcement beyond the prompt.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The Stream Deck actions instruct the agent to transmit previously generated detail verbatim to Slack or email, enabling one-button disclosure of accumulated conversation output. Because this content may contain sensitive summaries or tool-derived data, the path materially raises exfiltration risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The README instructs users to configure third-party API keys and advertises Slack/email forwarding, but it does not warn that user prompts, responses, audio, and possibly other metadata may be transmitted to external providers. This creates a real privacy and data-handling risk because operators may deploy the skill without understanding where sensitive content is sent or what external services can access it.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.env_credential_access, suspicious.exposed_secret_literal

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/server.ts:13

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
src/client/app.ts:138

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
src/server.ts:24