Back to skill

Security audit

Avatar

Security checks across malware telemetry and agentic risk

Overview

This is a functional avatar app, but it needs Review because it exposes a provider key to the browser and gives the local avatar server broad messaging and business-tool authority that is only partly disclosed.

Install only if you are comfortable giving this local server access to Simli, ElevenLabs, OpenClaw gateway credentials, and any enabled Slack/email integrations. Treat it as a Review-risk app: use restricted API keys, bind or firewall the server to trusted local access, avoid sensitive prompts unless vendor processing is acceptable, disable Slack/email/Stream Deck forwarding unless needed, and rotate the Simli key if this version has already exposed it to browsers.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • 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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (26)

Lp3

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding
The skill declares required binaries and environment variables, and its metadata clearly implies networked execution and external service access, but it does not declare explicit permissions for those capabilities. That creates a trust and review gap: operators may approve or install the skill without understanding that it can access secrets, make outbound connections, and invoke local processes.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The declared purpose presents the skill as an avatar frontend, but the described behavior extends into authenticated gateway access, external AI/backend prompt routing, Slack and email actions, hardware control, speech input, and kiosk-launching shell behavior. This mismatch is dangerous because users and reviewers may grant trust appropriate for a UI component while the skill actually has broad communication and action capabilities that could expose data or trigger external side effects.

Intent-Code Divergence

High
Confidence
99% confidence
Finding
The function comment says the returned configuration is safe for clients and contains no secrets, but it explicitly includes `config.secrets.simliApiKey`. Returning a server-side API key to client code exposes the credential to any user of the application and can enable unauthorized use of the Simli service, quota exhaustion, billing abuse, or downstream impersonation depending on the provider’s privileges.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
This avatar skill implements Slack DM, email sending, Stream Deck-triggered outbound messaging, and team alert workflows that materially exceed the declared purpose of interactive avatar rendering and TTS. Scope expansion is dangerous because it gives the skill the ability to trigger external communications and operational actions that users or reviewers may not expect from the manifest, increasing the chance of covert data exfiltration or unauthorized messaging.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The chat endpoint injects a privileged prompt claiming the agent has 'full access to HubSpot, Gmail, Calendar, Notion, and Slack,' despite the skill being presented as an avatar/TTS interface. This hidden capability expansion can cause sensitive enterprise data access or side effects through tools that are not disclosed by the skill description, making prompt-triggered data retrieval and action execution much more dangerous.

Context-Inappropriate Capability

Medium
Confidence
87% confidence
Finding
The code creates and persists a device identity keypair to disk for gateway authentication, but that persistence is not obviously necessary for a local avatar/TTS skill and increases the sensitivity of the deployment. Long-lived identity material can be reused across sessions, copied from disk, or abused to impersonate the device to the upstream gateway if the file is exposed.

Intent-Code Divergence

Medium
Confidence
76% confidence
Finding
The comment asserts the client config endpoint is safe while acknowledging a secret ('simli key') exception, which normalizes exposing sensitive configuration to the browser. If getClientConfig includes service keys, integration metadata, or other operational details, unauthenticated clients could harvest them and abuse downstream services or map the environment for further attacks.

Missing User Warnings

Medium
Confidence
76% confidence
Finding
The README says the skill uses third-party APIs and supports Slack/email forwarding, but it does not disclose that user prompts, speech, or generated content may be transmitted to external services. In an interactive avatar context, users may reasonably provide sensitive voice or text data, so missing transparency and consent guidance can lead to unintentional data exposure and privacy harm.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The skill advertises Slack/email forwarding and use of third-party TTS/avatar services, but it does not prominently warn that spoken or detailed responses may be transmitted to external providers or forwarded onward. In a skill that may process sensitive conversational content, this omission increases the risk of unintentional data disclosure to vendors or messaging destinations.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The client-facing configuration exposes an API key without any indication that it is intentionally public or restricted for browser use. In the context of an interactive avatar skill using third-party video/TTS services, leaking a reusable provider key can allow outsiders to consume paid resources or abuse the integration from arbitrary clients.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
Private key material is exported and written to a JSON file on disk without any visible protection or user-facing disclosure. Plain persistence of cryptographic identity secrets increases the risk of credential theft through filesystem access, backups, logs, or accidental source-control inclusion, which can enable upstream impersonation.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
User chat input is forwarded to an external gateway along with hidden instructions about broad connected-service access, without any explicit disclosure in this endpoint. That creates a privacy and trust problem because users may believe they are only interacting with a local avatar, while their content is actually transmitted off-box to a service that may invoke additional enterprise tools.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The Slack DM endpoint accepts arbitrary text and initiates an external message send via the backend agent without any confirmation, authentication shown here, or user warning about outbound transmission. In context, this turns an avatar skill into a messaging relay that could be used for spam, phishing, or exfiltration of sensitive content if the endpoint is reachable by untrusted callers.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The TTS proxy sends caller-provided text to ElevenLabs, an external third party, with no indication here of user-facing notice or consent. Because text sent for speech generation may contain personal, confidential, or regulated information, silent transmission to a vendor expands privacy and compliance risk beyond a purely local avatar renderer.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The email-sending endpoint performs an external send action using arbitrary caller-provided text without any visible confirmation or warning. This is risky because it can be abused to exfiltrate data or send unauthorized communications under the application's identity, especially since the skill description does not suggest email capabilities.

Ssd 3

High
Confidence
99% confidence
Finding
This is a direct secret exposure: a function advertised as returning config with 'no secrets' returns `simliApiKey` to the client. The contradiction increases the risk because maintainers may rely on the comment and propagate the object broadly, unintentionally widening credential exposure.

Ssd 3

Medium
Confidence
90% confidence
Finding
Model-generated detail content is stored and later forwarded through Slack or email workflows without content review, sensitivity checks, or recipient confirmation. This is dangerous because the model may include confidential business data, hallucinated statements, or prompt-influenced secrets, and the skill provides one-button onward transmission to external systems.

Ssd 3

Medium
Confidence
94% confidence
Finding
Arbitrary request text is embedded into an instruction telling the backend agent to relay it externally via Slack 'as-is.' Passing untrusted input into an agent that has external action capability is risky because prompt injection or formatting tricks can alter behavior, leak context, or cause unintended message content and side effects.

Ssd 3

Medium
Confidence
94% confidence
Finding
Arbitrary caller-provided text is passed to the agent with instructions to email it externally without modification. Combining untrusted content with agent-mediated external actions creates a prompt-injection and unauthorized-dispatch risk, especially because the model can reinterpret instructions or mingle hidden context with the outbound message.

External Transmission

Medium
Category
Data Exfiltration
Content
const alertChannel = config.integrations.slack.alertChannel;
          if (alertChannel) {
            try {
              const slackRes = await fetch('https://slack.com/api/chat.postMessage', {
                method: 'POST',
                headers: {
                  Authorization: `Bearer ${config.secrets.slackBotToken}`,
Confidence
84% confidence
Finding
fetch('https://slack.com/api/chat.postMessage', { method: 'POST'

External Transmission

Medium
Category
Data Exfiltration
Content
if (action === 'alert_resolved' && config.secrets.slackBotToken) {
          if (lastAlertTs && lastAlertChannel) {
            try {
              await fetch('https://slack.com/api/reactions.add', {
                method: 'POST',
                headers: {
                  Authorization: `Bearer ${config.secrets.slackBotToken}`,
Confidence
72% confidence
Finding
fetch('https://slack.com/api/reactions.add', { method: 'POST'

External Transmission

Medium
Category
Data Exfiltration
Content
name: 'white_check_mark',
                }),
              });
              await fetch('https://slack.com/api/chat.postMessage', {
                method: 'POST',
                headers: {
                  Authorization: `Bearer ${config.secrets.slackBotToken}`,
Confidence
82% confidence
Finding
fetch('https://slack.com/api/chat.postMessage', { method: 'POST'

External Transmission

Medium
Category
Data Exfiltration
Content
? { text, model_id: 'eleven_turbo_v2_5', language_code: 'no' }
        : { text, model_id: 'eleven_multilingual_v2' };

      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,
Confidence
88% confidence
Finding
https://api.elevenlabs.io/

Unpinned Dependencies

Low
Category
Supply Chain
Content
"dependencies": {
    "dotenv": "^16.4.0",
    "express": "^5.2.1",
    "simli-client": "latest",
    "ws": "^8.19.0"
  },
  "optionalDependencies": {
Confidence
99% confidence
Finding
"simli-client": "latest"

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
98% confidence
Finding
ws==8.19.0

VirusTotal

65/65 vendors flagged this skill as clean.

View on VirusTotal

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