T08 · Insecure Dependencies
- Location
SKILL.md:67- Finding
Unpinned Third-Party Dependencies and Mutable Package Sources
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a coherent Manim video-generation skill, with expected but important cautions around third-party installs and optional Google TTS narration.
Install this only if you are comfortable running local Manim/ffmpeg rendering tools and installing third-party dependencies. Use a virtual environment or container, review generated scene code before rendering, avoid putting secrets or confidential text in gTTS narration, and choose the offline pyttsx3 option for sensitive narration.
SKILL.md:67Unpinned Third-Party Dependencies and Mutable Package Sources
SKILL.md:19External Disclosure of Narration Text Through Default Google TTS Workflow
The guide recommends rm -rf media/voiceovers/ to clear cache, which is a destructive shell command. Although the path is relatively specific and intended for local cleanup, documentation that normalizes recursive forced deletion can become dangerous if copied into the wrong directory, adapted with variable input, or later automated by an agent without path validation.
manim-voiceover 会缓存生成的 TTS 音频到 `media/voiceovers/` 目录:
- 相同文本不会重复生成
- 修改文本后自动重新生成
- 清除缓存:`rm -rf media/voiceovers/`
### SRT 字幕自动生成
The skill instructs the agent to read and write files and invoke shell commands, but it does not declare any explicit tool scope or allowed-tools boundary. That increases the chance of unintended command execution or filesystem access if the skill is auto-selected, because the runtime has no least-privilege guardrails documented at the skill level.
The description includes broad trigger phrases like general animated-video creation requests, which can cause the skill to activate outside a tightly bounded Manim use case. Over-broad routing can expose users to unnecessary shell, file, and network behaviors in situations where a simpler, lower-risk skill should have handled the request.
The skill states that gTTS uses Google TTS but does not clearly warn that user-provided narration text may be transmitted to an external third-party service. This creates a privacy and data-handling risk, especially if users include sensitive educational, business, or personal content in narration scripts.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
- **FFmpeg(含 libx264 + libass)**:Manim 硬编码使用 `libx264` 编码器渲染视频,字幕烧录需要 `libass`
- macOS(Homebrew):`brew install ffmpeg`(默认包含 x264 和 libass)
- macOS(Conda):`conda install x264 -c conda-forge`(**⚠️ conda 的 ffmpeg 默认不含 libx264**)
- Linux:`sudo apt install ffmpeg libx264-dev libass-dev`
- **Python 3.9+** 及 pip
### 必需的 Python 包
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
- **FFmpeg(含 libx264 + libass)**:Manim 硬编码使用 `libx264` 编码器渲染视频,字幕烧录需要 `libass`
- macOS(Homebrew):`brew install ffmpeg`(默认包含 x264 和 libass)
- macOS(Conda):`conda install x264 -c conda-forge`(**⚠️ conda 的 ffmpeg 默认不含 libx264**)
- Linux:`sudo apt install ffmpeg libx264-dev libass-dev`
- **Python 3.9+** 及 pip
### 必需的 Python 包
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
- **FFmpeg(含 libx264 + libass)**:Manim 硬编码使用 `libx264` 编码器渲染视频,字幕烧录需要 `libass`
- macOS(Homebrew):`brew install ffmpeg`(默认包含 x264 和 libass)
- macOS(Conda):`conda install x264 -c conda-forge`(**⚠️ conda 的 ffmpeg 默认不含 libx264**)
- Linux:`sudo apt install ffmpeg libx264-dev libass-dev`
- **Python 3.9+** 及 pip
### 必需的 Python 包
The documentation instructs GTTSService(lang="zh"), which forces Chinese output in the example workflow. Because no nearby guidance says the language should be selected based on user preference, this can violate language/locale policy by implicitly defaulting all users to one language.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
Linux:
sudo apt install libass-dev
# 可能需要重新编译 ffmpeg
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
Linux:
sudo apt install libass-dev
# 可能需要重新编译 ffmpeg
This markdown file includes a Chinese-only title and later configures TTS with lang="zh", indicating a forced locale choice in the skill guidance. Under the policy, language constraints should either be optional or clearly justified as region-specific; no user opt-in or justification is provided here.
The example initializes the speech service with a fixed Chinese locale, which is a natural-language policy concern when the skill does not offer language selection. This can cause the skill to default to a specific language regardless of user preference.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def run_cmd(cmd_args, capture=True):
"""Run a command as argument list (shell=False) and return (success, output)."""
try:
result = subprocess.run(
cmd_args, capture_output=capture, text=True, timeout=30
)
return result.returncode == 0, result.stdout.strip()
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def run_pipe(cmd1_args, cmd2_args):
"""Run two commands connected by a pipe (safe, no shell). Returns (success, output)."""
try:
p1 = subprocess.Popen(cmd1_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
p2 = subprocess.Popen(cmd2_args, stdin=p1.stdout, stdout=subprocess.PIPE, text=True)
p1.stdout.close()
output, _ = p2.communicate(timeout=30)
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
"""Run two commands connected by a pipe (safe, no shell). Returns (success, output)."""
try:
p1 = subprocess.Popen(cmd1_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
p2 = subprocess.Popen(cmd2_args, stdin=p1.stdout, stdout=subprocess.PIPE, text=True)
p1.stdout.close()
output, _ = p2.communicate(timeout=30)
return p2.returncode == 0, output.strip()
The script presents 'Chinese Fonts' as a dedicated environment check and warns that text rendering may fail when Chinese fonts are not detected. This imposes a specific language/locale expectation in a general environment checker without indicating that it applies only to users creating Chinese-language content or offering any opt-in choice.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
# Display the command in a human-readable form
display_cmd = " ".join(shlex.quote(str(a)) for a in cmd_args)
print(f" $ {display_cmd}\n")
result = subprocess.run(cmd_args, cwd=cwd)
return result.returncode == 0
The skill can launch local applications to preview media, which is not necessary for rendering or subtitle generation and therefore broadens host interaction beyond its declared purpose. In an agent setting, unnecessary host actions are risky because they can surprise users, trigger external handlers, or open attacker-influenced content on the local machine.
Launching a local application via open on a generated file crosses from file generation into host-side application execution. While it does not use shell=True and is not directly command-injectable, it can cause unintended local program launches and may open attacker-controlled files or URLs if upstream path handling or file generation is compromised.
else video_file
)
if sys.platform == "darwin":
subprocess.run(["open", preview_file])
elif sys.platform == "linux":
subprocess.run(["xdg-open", preview_file])
Using xdg-open causes the host OS to dispatch the target to an associated application, which can trigger unintended local application execution outside the core rendering scope. Even without shell injection, this expands the attack surface because attacker-influenced output paths or files may result in opening unsafe content or remote handlers.
if sys.platform == "darwin":
subprocess.run(["open", preview_file])
elif sys.platform == "linux":
subprocess.run(["xdg-open", preview_file])
# Summary
print(f"\n{'='*60}")
This guidance again uses GTTSService(lang="zh") as the default pattern, reinforcing a forced locale in the skill documentation. Because no opt-in or alternative is shown, it conflicts with the requirement to avoid imposing a language without user choice.
The manifest describes creating Manim animations with synchronized voiceover narration and subtitles, but this script also exposes a general playback speed modification feature that rewrites the rendered video. Speeding up output is not mentioned in the manifest and is not an obvious requirement for generating narrated Manim videos.
No suspicious patterns detected.