Back to skill

Security audit

Dub YouTube with Voice.ai

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its YouTube dubbing purpose, but verified code has review-worthy security issues around where it sends API credentials/content and how it generates helper scripts.

Review before installing. Use the skill only with scripts you are comfortable sending to Voice.ai, keep the API key scoped/rotatable, do not set VOICEAI_API_BASE unless it points to a trusted HTTPS Voice.ai endpoint, and inspect any generated ffmpeg helper scripts before running them, especially when paths or media files came from someone else.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
voiceai-vo.cjs:3972
Finding
Arbitrary API Base URL Can Exfiltrate the Voice.ai API Key and Script Content<![CDATA[ ## Vulnerability Details **File Location**: `voiceai-vo.cjs:3972-4057` **Vulnerability Type**: Unrestricted credentialed endpoint override **Risk Level**: High ### Vulnerable Code ```js var VoiceAIClient = class { apiKey; mock; baseUrl; constructor(options) { this.apiKey = options.apiKey ?? null; this.mock = options.mock ?? false; this.baseUrl = process.env.VOICEAI_API_BASE ?? BASE_URL; } endpoint(path) { return `${this.baseUrl}/api/${API_VERSION}${path}`; } async listVoices(options) { if (this.mock) return this.mockListVoices(options); if (voiceCache.entry && Date.now() < voiceCache.entry.expiresAt) { return this.filterVoices(voiceCache.entry.data, options); } const params = new URLSearchParams(); if (options?.limit) params.set("limit", String(options.limit)); if (options?.offset) params.set("offset", String(options.offset)); const url = `${this.endpoint("/tts/voices")}?${params.toString()}`; const res = await fetch(url, { headers: { Authorization: `Bearer ${this.apiKey}`, "User-Agent": "voiceai-creator-voiceover-pipeline/0.1.0" } }); if (!res.ok) { const body = await res.text().catch(() => ""); throw new Error(`Voice.ai API error ${res.status}: ${body}`); } const json = await res.json(); const rawVoices = Array.isArray(json) ? json : json.voices ?? []; const voices = rawVoices.map((v) => ({ id: String(v.voice_id ?? v.id ?? ""), name: String(v.name ?? "Unnamed"), language: String(v.language ?? "en"), visibility: String(v.visibility ?? ""), status: String(v.status ?? "") })); const data = { voices, total: voices.length }; voiceCache.entry = { data, expiresAt: Date.now() + CACHE_TTL_MS }; return this.filterVoices(data, options); } async callTtsEndpoint(text, opts) { const body = { text, audio_format: opts.audio_format, language: opts.language, ...[truncated 2974 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove `VOICEAI_API_BASE` support from production builds if endpoint customization is not essential. 2. If an override is required, parse it with `new URL()` and enforce: - The `https:` protocol. - An explicit allowlist of trusted Voice.ai hostnames. - Approved ports only. - No embedded username or password. 3. Require an explicit command-line development flag before honoring a custom endpoint. 4. Bind credentials to the expected origin and refuse to attach the Authorization header to any other origin. 5. Configure redirect handling so credentials are never forwarded across origins. Prefer rejecting redirects for authenticated API calls. 6. Fail closed when URL validation fails. 7. Document `VOICEAI_API_BASE` in the Skill metadata and security/privacy documentation because it controls where credentials and scripts are sent. 8. Add automated tests covering HTTP URLs, lookalike domains, embedded credentials, redirects, and attacker-controlled hosts. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
voiceai-vo.cjs:3758
Finding
Command Injection in Generated Bash and PowerShell FFmpeg Helper Scripts<![CDATA[ ## Vulnerability Details **File Location**: `voiceai-vo.cjs:3758-3816` **Vulnerability Type**: Shell command injection through unsafe path interpolation **Risk Level**: High ### Vulnerable Code ```js async function generateMuxScripts(videoPath, audioPath, outputPath, syncPolicy, outDir) { const ffmpegDir = (0, import_node_path2.join)(outDir, "ffmpeg"); await ensureDir(ffmpegDir); const args = buildMuxArgs({ videoPath, audioPath, outputPath, syncPolicy }); const cmdString = `ffmpeg ${args.map((a) => a.includes(" ") ? `"${a}"` : a).join(" ")}`; const bash = `#!/usr/bin/env bash # Replace Audio — generated by voiceai-creator-voiceover-pipeline # Sync policy: ${syncPolicy} # # Prerequisites: Install ffmpeg (https://ffmpeg.org/download.html) # macOS: brew install ffmpeg # Ubuntu: sudo apt install ffmpeg # Windows: choco install ffmpeg OR download from https://ffmpeg.org # # Usage: bash replace-audio.sh set -euo pipefail VIDEO_INPUT="${videoPath}" AUDIO_INPUT="${audioPath}" OUTPUT="${outputPath}" echo "🎬 Muxing audio into video…" echo " Video: $VIDEO_INPUT" echo " Audio: $AUDIO_INPUT" echo " Sync: ${syncPolicy}" echo "" ${cmdString} echo "" echo "✅ Done → $OUTPUT" `; const ps1 = `# Replace Audio — generated by voiceai-creator-voiceover-pipeline # Sync policy: ${syncPolicy} # # Prerequisites: Install ffmpeg (https://ffmpeg.org/download.html) # Windows: choco install ffmpeg OR winget install ffmpeg # # Usage: .\\replace-audio.ps1 $ErrorActionPreference = "Stop" $VideoInput = "${videoPath.replace(/\\/g, "\\\\")}" $AudioInput = "${audioPath.replace(/\\/g, "\\\\")}" $Output = "${outputPath.replace(/\\/g, "\\\\")}" Write-Host "🎬 Muxing audio into video…" Write-Host " Video: $VideoInput" Write-Host " Audio: $AudioInput" Write-Host " Sync: ${syncPolicy}" Write-Host "" ${cmdString} Write-Host "" Write-Host "✅ Done → $Output" `; await writeOutputFile((0, import_node_path2.join)(ffmpegDir, "replace-audio.sh"), ...[truncated 2950 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Prefer not to generate executable shell source. Continue using `execFile` or `spawn` with an argument array after FFmpeg becomes available. 2. If helper scripts are required, generate scripts that accept media paths as positional parameters instead of embedding paths into source code. 3. Implement separate, well-tested serializers for Bash and PowerShell: - For Bash, use rigorous single-quote escaping for every argument. - For PowerShell, use PowerShell-specific literal quoting and invocation syntax. - Do not reuse a Bash command string in PowerShell. 4. Reject path values containing null bytes, carriage returns, line feeds, or other control characters. 5. Do not rely on checking for spaces as a security boundary. 6. Keep paths and executable commands separate throughout the program. 7. Clearly warn users that generated scripts contain embedded paths and should be reviewed before execution until the unsafe implementation is removed. 8. Add security tests using filenames containing quotes, semicolons, dollar signs, backticks, command substitutions, pipes, redirection operators, newlines, ampersands, and PowerShell subexpressions. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
Findings (21)

Chaining Abuse

High
Category
Tool Misuse
Content
brew install ffmpeg

# Ubuntu / Debian
sudo apt update && sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg
Confidence
75% confidence
Finding
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
**To clear cache manually:**
```bash
rm out/my-project/segments/.cache.json
```
Confidence
85% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Credential Access

High
Category
Privilege Escalation
Content
const apiKey = getApiKey();
  if (!isMock && !apiKey) {
    console.error(
      source_default.red("\u2717 VOICE_AI_API_KEY not set.\n") + source_default.yellow("  Set it in .env or your environment, or use --mock for testing.\n") + source_default.gray("  Get your key at https://voice.ai/dashboard")
    );
    process.exit(1);
  }
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
const apiKey = getApiKey();
  if (!isMock && !apiKey) {
    console.error(
      source_default.red("\u2717 VOICE_AI_API_KEY not set.\n") + source_default.yellow("  Set it in .env or your environment, or use --mock for testing.\n") + source_default.gray("  Get your key at https://voice.ai/dashboard")
    );
    process.exit(1);
  }
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Lp3

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding
The skill explicitly requires an API key and describes making outbound requests to Voice.ai, but it does not declare any tool scope such as permissions or allowed-tools. That mismatch weakens least-privilege controls and can cause an agent platform or reviewer to underestimate the skill's access to environment secrets and network egress.

Missing User Warnings

Medium
Confidence
84% confidence
Finding
This manifest instructs users to export a bearer API key into an environment variable, which is a sensitive credential handling operation. Under the code/markdown warning rule, there is no accompanying caution about protecting the key, avoiding shell history exposure, or limiting where it is used.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
brew install ffmpeg

# Ubuntu / Debian
sudo apt update && sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
brew install ffmpeg

# Ubuntu / Debian
sudo apt update && sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The documented `POST /api/v1/tts/speech` and streaming endpoints send arbitrary user-provided text to an external third-party service, but the reference does not warn users that their scripts, captions, or potentially sensitive content leave the local environment. In a dubbing workflow, users may submit unpublished content, private transcripts, or regulated data, so the lack of an explicit privacy/transmission disclosure creates a real risk of unintended data exposure and compliance violations.

Session Persistence

Medium
Category
Rogue Agent
Content
*/
      subcommandTerm(cmd) {
        const args = cmd.registeredArguments.map((arg) => humanReadableArgName(arg)).join(" ");
        return cmd._name + (cmd._aliases[0] ? "|" + cmd._aliases[0] : "") + (cmd.options.length ? " [options]" : "") + // simplistic check for non-help option
        (args ? " " + args : "");
      }
      /**
Confidence
75% 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.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill sends arbitrary script text to a remote Voice.ai TTS endpoint via fetch, which can expose sensitive or proprietary content if users process confidential scripts. In this skill context, remote transmission is core functionality, but the lack of an explicit consent/privacy warning at the point of use increases the risk of unintentional data disclosure.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
const outputDir = opts.out ? (0, import_node_path6.resolve)(opts.out) : (0, import_node_path6.resolve)("out", titleSlug);
  await ensureDir(outputDir);
  const templateDir = (0, import_node_path6.resolve)(process.cwd(), "templates");
  console.log(source_default.bold("\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
  console.log(source_default.bold("\u2551") + source_default.cyan.bold("   Voice.ai Creator Voiceover Pipeline             ") + source_default.bold("\u2551"));
  console.log(source_default.bold("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
  if (isMock) console.log(source_default.yellow.bold("   \u26A1 Mock mode \u2014 no API calls will be made\n"));
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Missing User Warnings

Low
Confidence
83% confidence
Finding
This markdown file explains that running the skill produces multiple files under an output directory, including media and text artifacts, but it does not explicitly warn the user that the command will create and populate local files and directories. For a skill that affects user data on disk, the description should disclose that behavior so users understand the filesystem impact before running it.

Missing User Warnings

Low
Confidence
84% confidence
Finding
The code accesses `process.env.VOICE_AI_API_KEY`, which is a sensitive credential source. While later error messages mention setting the key, there is no explicit warning in this code path about handling the credential securely or that the skill reads credentials from the environment.

Static analysis

Detected: suspicious.dangerous_exec, suspicious.env_credential_access

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
voiceai-vo.cjs:1569

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
voiceai-vo.cjs:3900