T05 · Unauthorized Access and Privilege Escalation
- Location
SKILL.md:54- Finding
Overbroad credential loading through executable shell environment file
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly does what it says, but it asks agents to load a broad local .env file and uses unpinned or downloaded components while sending subtitle text to external TTS services.
Review before installing. Use this only for media you are comfortable sending to third-party TTS providers. Do not source a general ~/code/.env for it; provide only VOLC_TTS_APPID and VOLC_TTS_ACCESS_TOKEN when Volcano is needed. Prefer pinned dependencies and a verified local MediaPipe model cache before running on sensitive projects.
SKILL.md:54Overbroad credential loading through executable shell environment file
SKILL.md:121Unpinned third-party dependency installation
scripts/visual_diarize.py:29Predictable shared temporary model cache without integrity or symlink protection
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
},
},
}
r = _rq.post(url, headers=h, json=payload, timeout=60, stream=True)
if r.status_code != 200:
raise RuntimeError(f"Volcano TTS HTTP {r.status_code}: {r.content[:300]!r}")
audio = b""
The declared description presents a full video dubbing skill whose primary purpose is to synthesize and insert target-language speech into a video. The actual code chunk is a narrow preprocessing utility for visual diarization. While visual diarization is mentioned in the description as an optional feature for multi-speaker dubbing, this code does not perform the main advertised function at all: no speech synthesis, no voice selection, no language-specific TTS routing, no audio track generation, and no final video output. The only external access beyond local files is downloading a MediaPipe face landmark model, which is consistent with diarization but not sufficient to match the declared end-to-end dubbing behavior. Therefore this is a clear description/behavior mismatch.
The skill describes capabilities that require shell, filesystem, environment-variable access, and network egress, but it does not declare any explicit tool scope or permission boundary. That creates an over-privileged execution model where an agent may invoke sensitive capabilities implicitly, increasing the blast radius of prompt injection, misrouting, or user misunderstanding.
The skill sends subtitle text to external TTS providers and replaces the original audio track, but the description does not prominently disclose those behaviors up front. Users may unknowingly expose sensitive transcript content to third parties or approve a workflow that irreversibly changes media semantics without informed consent.
Broad trigger phrases like generic requests for dubbing or voice-over can cause the skill to activate in contexts the user did not intend, especially in agentic routing systems. Because the skill can read local files, call external TTS services, and replace media audio, unintended invocation can lead to privacy-impacting data transmission or destructive workflow changes.
This skill explicitly posts subtitle content and credentials-derived headers to an external TTS endpoint, which is a real external data transmission path. In the context of user-provided videos and subtitles, that can expose confidential, personal, or regulated content to a third party, and the risk is heightened because the skill encourages loading long-lived API credentials from a local .env file.
import base64, json, requests
audio = b""
r = requests.post(url, headers=h, json=payload, timeout=60, stream=True)
for line in r.iter_lines():
if not line: continue
evt = json.loads(line)
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.
1
00:00:00,000 --> 00:00:03,400
[A] So what about that AI rewrite thing?
2
00:00:03,400 --> 00:00:08,200
uvx/uv tool run commands without ==version create a rug-pull risk.
The manifest says the skill routes to edge-tts neural 'for any language', implying broad target-language support. In code, autodetection only looks for .zh-CN.srt and .en.srt files, and language-tag inference recognizes only zh/en/es before defaulting to 'zh', so many languages are not actually handled as described unless manually forced and even then output naming becomes misleading.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
return out
def probe_dur(p: Path) -> float:
r = subprocess.run(["ffprobe","-v","error","-show_entries","format=duration",
"-of","default=nw=1:nk=1", str(p)], capture_output=True, text=True)
return float(r.stdout.strip())
The script sends subtitle text to third-party TTS services (ByteDance Volcano or edge-tts/Microsoft) without any explicit consent, warning, or data-classification check. If the subtitles contain sensitive, private, or regulated content, this causes unintended external disclosure to cloud providers, which is especially relevant because this skill is designed to process user-supplied media/transcripts.
The manifest describes this skill as producing a dub while delegating final mixing to another skill. However, the code invokes ffmpeg to combine generated audio with the source video, maps video and audio streams, encodes AAC audio, and writes the final *_dub.mp4 output itself, which is final mixing behavior rather than handoff.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
"-shortest", str(OUT)]
print("\nrunning ffmpeg…")
r = subprocess.run(cmd, capture_output=True, text=True)
if r.returncode != 0:
print("FFMPEG STDERR:")
print(r.stderr[-3000:])
The script automatically downloads a model from the internet at runtime into /tmp if it is missing. Even though the URL is hardcoded to a legitimate provider, this introduces undeclared network behavior and a supply-chain/trust boundary: execution now depends on external content availability and integrity, which is risky in security-sensitive or offline-controlled environments.
The CLI help and user interface do not disclose that running the tool may trigger an automatic outbound download. Lack of disclosure weakens informed consent and can violate operator expectations, especially in restricted environments where unexpected network access is treated as a security event.
The script reads the user-supplied SRT and produces a rewritten tagged SRT file, which is a file-writing operation affecting user data. The code includes no explicit warning in the description or CLI help about generating or overwriting output content beyond the bare argument name.
No suspicious patterns detected.