Back to skill

Security audit

YM-MediaToolkit(媒体处理工具集)

Security checks across malware telemetry and agentic risk

Overview

This appears to be a real media-processing skill, but its unauthenticated HTTP service can fetch URLs, write workspace files, and expose persisted job details, so users should review its scope before installing.

Install only if you need this local media server and are comfortable with it reading approved media paths, fetching remote URLs, and writing outputs in the workspace. Keep it bound to 127.0.0.1, do not expose it on 0.0.0.0 without authentication, avoid passing sensitive file paths or prompts, use overwrite=false when preserving outputs matters, and consider pinning/updating dependencies before use.

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
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (29)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
描述覆盖了代码中的核心媒体处理能力:视频压缩、封面提取、音频处理、ASR/OCR 字幕识别,因此主方向基本一致。但按评估标准,只要代码包含未在描述中声明的重要能力,也应判定为不匹配。该代码不仅是一个“媒体助手”,还是一个完整的任务执行服务:支持 info/audio_info 查询、字幕分句、批量和 pipeline 编排、聊天指令解析、异步 job 管理以及 Flask HTTP 接口。这些都属于实质性能力扩展,不只是实现细节,因此描述未完整反映实际行为,应标记为 mismatch。

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
The code creates a requests session and later fetches attacker-controlled URLs, enabling the skill to make arbitrary outbound HTTP requests. If validate_video_url/validate_media_source do not strictly block internal, loopback, link-local, cloud-metadata, and private-network targets, this becomes SSRF that can probe internal services or access sensitive network resources.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill supports remote `http/https` sources but does not prominently warn that using a URL causes the service to initiate outbound network requests and exchange data with third-party hosts. In a chat-driven tool, this can enable unanticipated data disclosure, SSRF-like access to internal HTTP endpoints if source validation is weak elsewhere, or privacy exposure through automatic fetching of attacker-controlled URLs.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
Defaulting `overwrite` to `true` means a chat/API request can silently replace existing output files without a strong warning to users. In a batch or pipeline workflow, this raises the risk of irreversible data loss or tampering with prior artifacts, especially when output paths are user-influenced or reused across runs.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The job record persists the full `params` and `metadata` payload to disk, which can easily include sensitive user data such as file paths, prompts, tokens, or media-related metadata. In a media-processing skill, requests often contain personal content references, so silent persistence increases privacy and data-exposure risk if the host is multi-user, logs are collected, or the jobs directory is readable by other components.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
`list_jobs()` returns full stored job objects, including request parameters and metadata for all jobs, which can expose prior users' input data and internal paths to anyone able to call this API. In this skill context, job parameters may contain media file locations, extracted output paths, and user intent metadata, making cross-job data leakage more dangerous than a purely cosmetic issue.

Vague Triggers

Medium
Confidence
90% confidence
Finding
The manifest presents the skill as a broad natural-language media assistant without strong invocation boundaries, which can cause an agent to route unrelated user prompts into a capability that reads local files, fetches URLs, and writes outputs. In an agentic environment, vague scope increases the chance of unintended tool use and unsafe processing of user-supplied paths or remote media sources.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
Many actions write files and default to overwrite=true, yet the manifest does not prominently warn that existing files may be replaced. This creates a real integrity risk: an agent or user can unintentionally destroy or alter prior outputs or arbitrary reachable files if output paths are mis-specified.

Missing User Warnings

Medium
Confidence
87% confidence
Finding
The function downloads attacker-controlled remote content and stores it to a local temporary file without checking HTTP status, content type, content length, or imposing a maximum size. In a media-processing skill, this expands the attack surface for disk exhaustion, processing of malformed files by downstream tools, and accidental handling of unexpected content disguised as media.

Unvalidated Output Injection

High
Category
Output Handling
Content
'-y',
                audio_path,
            ]
            ffmpeg_result = subprocess.run(cmd, capture_output=True, text=True, timeout=300)
            if ffmpeg_result.returncode != 0:
                return {
                    'status': 'error',
Confidence
72% confidence
Finding
subprocess.run(cmd, capture_output

Unvalidated Output Injection

High
Category
Output Handling
Content
logger.info(f"命令: {' '.join(cmd[:5])}...")
    
    try:
        result = subprocess.run(
            cmd,
            capture_output=True,
            text=True,
Confidence
95% confidence
Finding
subprocess.run( cmd, capture_output

Unvalidated Output Injection

High
Category
Output Handling
Content
cmd = ['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_streams', video_url]
    
    try:
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
        if result.returncode != 0:
            return {'status': 'error', 'message': 'ffprobe failed'}
Confidence
95% confidence
Finding
subprocess.run(cmd, capture_output

Unvalidated Output Injection

High
Category
Output Handling
Content
def run_command(cmd, cwd):
    result = subprocess.run(cmd, cwd=cwd, capture_output=True, text=True)
    if result.returncode != 0:
        raise RuntimeError(
            f"Command failed: {' '.join(cmd)}\nSTDOUT:\n{result.stdout}\nSTDERR:\n{result.stderr}"
Confidence
95% confidence
Finding
subprocess.run(cmd, cwd=cwd, capture_output

Unvalidated Output Injection

High
Category
Output Handling
Content
logger.info(f"输出文件: {output_path}")
    
    try:
        result = subprocess.run(
            cmd,
            capture_output=True,
            text=True,
Confidence
95% confidence
Finding
subprocess.run( cmd, capture_output

Unpinned Dependencies

Low
Category
Supply Chain
Content
requests>=2.28.0
opencv-python>=4.8.0
numpy>=1.24.0
aiohttp>=3.8.0
Confidence
92% confidence
Finding
requests>=2.28.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
requests>=2.28.0
opencv-python>=4.8.0
numpy>=1.24.0
aiohttp>=3.8.0
flask>=2.3.0
Confidence
92% confidence
Finding
opencv-python>=4.8.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
requests>=2.28.0
opencv-python>=4.8.0
numpy>=1.24.0
aiohttp>=3.8.0
flask>=2.3.0
flask-cors>=4.0.0
Confidence
88% confidence
Finding
numpy>=1.24.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
requests>=2.28.0
opencv-python>=4.8.0
numpy>=1.24.0
aiohttp>=3.8.0
flask>=2.3.0
flask-cors>=4.0.0
faster-whisper>=1.0.0
Confidence
94% confidence
Finding
aiohttp>=3.8.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
opencv-python>=4.8.0
numpy>=1.24.0
aiohttp>=3.8.0
flask>=2.3.0
flask-cors>=4.0.0
faster-whisper>=1.0.0
paddlepaddle>=2.6.0
Confidence
93% confidence
Finding
flask>=2.3.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
numpy>=1.24.0
aiohttp>=3.8.0
flask>=2.3.0
flask-cors>=4.0.0
faster-whisper>=1.0.0
paddlepaddle>=2.6.0
paddleocr>=2.7.0
Confidence
93% confidence
Finding
flask-cors>=4.0.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
aiohttp>=3.8.0
flask>=2.3.0
flask-cors>=4.0.0
faster-whisper>=1.0.0
paddlepaddle>=2.6.0
paddleocr>=2.7.0
Confidence
87% confidence
Finding
faster-whisper>=1.0.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
flask>=2.3.0
flask-cors>=4.0.0
faster-whisper>=1.0.0
paddlepaddle>=2.6.0
paddleocr>=2.7.0
Confidence
97% confidence
Finding
paddlepaddle>=2.6.0

Unpinned Dependencies

Low
Category
Supply Chain
Content
flask-cors>=4.0.0
faster-whisper>=1.0.0
paddlepaddle>=2.6.0
paddleocr>=2.7.0
Confidence
90% confidence
Finding
paddleocr>=2.7.0

Known Vulnerable Dependency: requests==2.28.0 — 5 advisory(ies): CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi); CVE-2026-25645 (Requests has Insecure Temp File Reuse in its extract_zipped_paths() utility func) +2 more

High
Category
Supply Chain
Confidence
95% confidence
Finding
requests==2.28.0

Known Vulnerable Dependency: opencv-python==4.8.0 — 2 advisory(ies): GHSA-qr4w-53vh-m672 (opencv-python bundled libwebp binaries in wheels that are vulnerable to CVE-2023); PYSEC-2023-183 (opencv-python versions before v4.8.1.78 bundled libwebp binaries in wheels that )

High
Category
Supply Chain
Confidence
95% confidence
Finding
opencv-python==4.8.0

VirusTotal

65/65 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.