T08 · Insecure Dependencies
- Location
SKILL.md:37- Finding
Unverified FFmpeg Binary Download from a Third-Party Distribution Source
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a coherent text-to-speech tool, but it needs Review because it can run an unverified ffmpeg binary from a predictable shared temporary path and sends input text to Microsoft Edge TTS.
Review before installing. Use a trusted system ffmpeg or pass an explicit trusted --ffmpeg path, do not follow the /tmp curl download guidance, and avoid sending confidential or regulated text because synthesis uses Microsoft Edge TTS. Run it only in an environment where temporary audio files and user-level subprocess execution are acceptable.
SKILL.md:37Unverified FFmpeg Binary Download from a Third-Party Distribution Source
scripts/ms_tts_chunked_bgm.py:87Automatic Execution of a Predictable FFmpeg Binary from Shared Temporary Storage
scripts/ms_tts_chunked_bgm.py:170Predictable Intermediate Audio Files Created in Shared Temporary Storage
The skill documentation instructs use of file access and shell execution but does not declare any explicit tool scope such as permissions or allowed-tools. That creates an overbroad execution model where an agent may invoke filesystem and shell capabilities without clear limitation, increasing the risk of unintended command execution or access to sensitive files when the skill is used.
The skill sends user-provided text to Microsoft's Edge TTS service over the network, but the documentation does not clearly disclose this data transfer. Users may provide sensitive notes, documents, or markdown content under the assumption processing is local, causing unintended exposure of private or regulated data to a third-party service.
The natural-language description states the skill converts arbitrary-length Chinese text and the documented defaults and examples are centered on Chinese voices and Chinese-only processing. This creates a locale-specific constraint without an explicit opt-in or justification that the skill is intentionally region/language scoped.
The documentation recommends downloading and unpacking ffmpeg via curl from an unspecified external URL directly into a temporary directory. This encourages execution of externally fetched binaries without integrity verification or pinned source validation, which can lead to supply-chain compromise or arbitrary code execution if the download source is tampered with or replaced.
|------|------|------|
| `edge-tts` | `pip3 install edge-tts` | 微软 TTS 引擎 |
| `miniaudio` | `pip3 install miniaudio` | MP3 解码为 PCM |
| `ffmpeg` | `curl -L .../ffmpeg.zip -o /tmp/ffmpeg.zip && unzip /tmp/ffmpeg.zip -d /tmp/ffmpeg_bin` | WAV 转 MP3、BGM 混音 |
## 速率限制(Rate Limit)
The skill sends supplied text to Microsoft's Edge TTS service via edge_tts.Communicate without any clear user-facing disclosure that content leaves the local environment. If users process sensitive notes, documents, or folder contents, this can cause unintended data exposure to a third-party service and violate privacy or compliance expectations.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
output_mp3_path,
]
completed = subprocess.run(command, capture_output=True, text=True)
if completed.returncode != 0:
stderr = (completed.stderr or '').strip()
raise RuntimeError(f'ffmpeg bgm mix failed: {stderr[:400]}')
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
if ffmpeg_path is None:
print('[MS-TTS-BGM] Warning: ffmpeg not found, outputting WAV instead.')
print('[MS-TTS-BGM] Install ffmpeg: curl -L https://evermeet.cx/ffmpeg/getrelease/ffmpeg/zip -o /tmp/ffmpeg.zip && unzip /tmp/ffmpeg.zip -d /tmp/ffmpeg_bin')
if bgm_path:
raise RuntimeError('ffmpeg is required when --bgm is provided.')
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
return wav_result
if ffmpeg_path and os.path.exists(ffmpeg_path):
subprocess.run([
ffmpeg_path, '-y', '-i', wav_path,
'-b:a', '192k', mp3_path
], capture_output=True)