Back to skill

Security audit

Video Clip Assistant

Security checks for vulnerabilities and agentic risk

Overview

This is a plausible video-editing skill, but it needs review because untrusted transcripts and edit files can drive rendering and external model use without enough safeguards.

Use this only on media and EDL files you trust, preferably in an isolated project or virtual environment. Review generated EDL source paths, subtitle paths, and output paths before rendering because FFmpeg output may overwrite files. Avoid sensitive recordings unless you understand where ASR and diarization models run, and do not enable diarization with HF_TOKEN unless that external model access is acceptable.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
Findings (3)

T01 · Skill Instruction Hijacking

Error
Location
scripts/generate_edl.py:135
Finding

Untrusted Transcript Content Is Embedded Directly into Agent Instructions

Content
View full analysis
str: """Convert transcript JSON to compact text for the LLM prompt.""" lines = [] lines.append(f"Source: {transcript.get('source', 'unknown')}") lines.append(f"Duration: {transcript.get('duration', 0):.1f}s") lines.append(f"Language: {transcript.get('language', 'unknown')}") lines.append(f"Total phrases: {len(transcript.get('phrases', []))}") lines.append("") for phrase in transcript.get("phrases", []): start = phrase["start"] end = phrase["end"] speaker = phrase.get("speaker", "S0") text = phrase.get("text", "") conf = phrase.get("confidence", 0) lines.append(f"[{start:07.2f}-{end:07.2f}] {speaker} (conf:{conf:.2f}) {text}") return "\n".join(lines) def build_prompt(strategy_name: str, transcript_text: str, params: dict, strategies_yaml: dict) -> str: """Build the prompt sent to the LLM.""" if strategy_name in STRATEGY_PROMPTS: template = STRATEGY_PROMPTS[strategy_name] else: template = """You are a professional video editor. Analyze the following transcript according to the editing request and generate an EDL. Editing request: {custom_prompt} Transcript: {transcript_text} Return an EDL in JSON format.""" yaml_params = {} raw_strategies = strategies_yaml.get("strategies", {}) if strategy_name in raw_strategies: yaml_params = raw_strategies[strategy_name].get("parameters", {}) merged = {**yaml_params, **params} prompt = template.format( transcript_text=transcript_text, **merged, custom_prompt=params.get("custom_prompt", "No special requirements"), ) return prompt ``` ### Technical Analysis Spe ...[truncated 2514 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/render_edl.py:180
Finding

Unvalidated EDL Paths Are Passed to FFmpeg

Content
View full analysis
bool: """Render the final video according to an EDL.""" edits = edl.get("edits", []) sources = {s["id"]: s for s in edl.get("sources", [])} if not edits: print("Error: EDL contains no editing instructions", file=sys.stderr) return False print(f"EDL contains {len(edits)} editing instructions") output_dir = os.path.dirname(os.path.abspath(output)) os.makedirs(output_dir, exist_ok=True) tmp_dir = tempfile.mkdtemp(prefix="edl_render_") segment_files = [] try: for i, edit in enumerate(edits): edit_type = edit.get("type", "keep") if edit_type not in ("keep",): print(f" [{i+1}/{len(edits)}] Skipping {edit_type} (unsupported)") continue source_id = edit.get("source", edit.get("source_id", "src0")) src_info = sources.get(source_id, {}) src_path = src_info.get("path", "") start = edit.get("start", 0) end = edit.get("end", 0) reason = edit.get("reason", "") params = edit.get("params", {}) if not src_path or end <= start: continue seg_file = os.path.join(tmp_dir, f"seg_{i:04d}.mp4") print(f" [{i+1}/{len(edits)}] {start:.1f}s-{end:.1f}s ({end - start:.1f}s)" f" — {reason[:50]}") if not extract_segment(src_path, start, end, seg_file): continue current = seg_file if params.get("color_grade"): graded = os.path.join(tmp_dir, f"seg_{i:04d}_graded.mp4") if apply_color_grade(current, graded, params["color_grade"]): ...[truncated 3682 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
README.md:38
Finding

Installation Instructions Use Unpinned Third-Party Dependencies

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (46)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

声明描述的是一个端到端 AI 视频剪辑助手,包含语音识别、语义理解、智能决策和导出适配等多项高级能力。但提供的代码块只是一个命令行视频裁剪工具,依赖外部传入的时间段或已有 EDL JSON,按时间轴调用 ffmpeg 导出片段。虽然“支持 EDL JSON 输入”与声明中的 EDL 概念部分相关,但代码本身并不生成 EDL,也没有任何 AI/LLM、ASR、字幕、渲染或平台适配逻辑。因此代码实际行为明显窄于且不同于声明的核心能力,构成描述与行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description presents a broad AI video editing assistant with transcription, semantic understanding, LLM-based editing decisions, rendering, subtitle workflows, and export adaptation. The supplied code only implements one narrower function: extracting highlight clips from a video using ffprobe/ffmpeg scene detection, audio energy heuristics, and an optional preexisting transcript file for simple phrase-density scoring. It does not generate transcripts itself, does not do word-level cuts, does not use any LLM, does not render subtitles, and does not handle platform-specific exports. While '提取高光片段' is one listed use case and the code is consistent with that subset, the overall declared purpose materially overstates what this code chunk actually does.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

声明描述的是一个端到端的视频剪辑助手,而代码片段的实际作用明显更窄:它是 EDL 生成流程中的前置辅助脚本,主要做 transcript 文本整理、策略模板拼接、参数合并、prompt 生成,以及输出一个空的 EDL 模板。即使在非 dry-run 模式下,代码也只是写出一个带元数据和空 edits 的 JSON 模板,并提示用户后续手动将 prompt 发给 LLM,再使用其他脚本渲染。代码中虽然存在 validate_edl 等辅助函数,也支持高光提取、精简、主题切分、短视频平台等策略提示词,但这些都停留在 prompt/template 层,不等于真正实现了声明中的完整剪辑、渲染、字幕和导出能力。因此描述与该代码块实际行为存在显著不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

声明描述的是完整的视频智能剪辑工作流,而代码片段只是其中一个子功能:字幕生成。它确实覆盖了宣称中的一小部分——ASR 语音转文字以及词级时间戳到字幕的转换,但没有看到任何视频编辑、裁剪输出、渲染、LLM 决策、自检循环、平台适配或导出逻辑。代码中的 --style 参数仅用于打印提示,未实际应用;--provider 虽允许 funclip,但实现中只调用 transcribe_whisper。由于实际主行为显著窄于声明的核心用途,属于描述与代码行为不一致。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

The declared description presents a broad AI-powered end-to-end video editing assistant. The supplied code, however, only covers the rendering stage of such a pipeline. Its primary behavior is to consume an already-produced EDL and render output video segments via FFmpeg. It supports only 'keep' edits, with optional color grading and subtitle burn-in, then concatenation/export. There is no evidence of speech recognition, transcript generation, word-level timestamp logic, LLM-based content understanding or edit planning, self-check loops, highlight detection, or multi-platform output adaptation in this chunk. Therefore the code chunk does not accurately represent the full declared purpose; it is materially narrower and omits several headline capabilities.

Content

No source excerpt is available for this finding.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · scripts/generate_edl.py (reported line 180)May include surrounding context.

python
custom_prompt=params.get("custom_prompt", "无特殊要求"),
    )

    return prompt


def validate_edl(edl: dict, transcript: dict) -> tuple:

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

This markdown file describes an AI agent that automatically performs editing, rendering, and export steps end-to-end. Those behaviors can affect user data and generated media artifacts, but the description does not include any warning about file creation, overwrite risk, or reviewing outputs before rendering/export.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill advertises and documents shell execution, file reads/writes, and environment-dependent tooling, but the manifest does not declare any explicit tool scope or allowed-tools restrictions. In an agent setting, this increases the chance the skill will be invoked with broader-than-necessary capabilities, enabling unintended command execution or filesystem access during video processing workflows.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The activation description is broad enough to trigger the skill for many loosely related requests involving user videos, automatic editing, subtitles, highlights, or exports. Over-broad invocation criteria can cause the agent to activate a capability-heavy skill unnecessarily, increasing exposure to shell/file operations and privacy-sensitive media analysis in contexts where a narrower tool would suffice.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill processes potentially sensitive user audio/video through transcription and AI analysis but does not present any explicit privacy notice, retention policy, or handling constraints. Because meeting recordings, live streams, and spoken content can contain personal or confidential information, the absence of privacy guidance increases the risk of inappropriate processing, storage, or onward sharing.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file presents its title and user-facing descriptions in Chinese, and the rest of the script continues this pattern for help text and status/error messages. Because this is a general video-cutting utility rather than a clearly region-specific tool, forcing a single locale without opt-in matches the language/locale policy violation criteria.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The argparse description and argument help strings are all written in Chinese, and later print/error statements follow the same pattern. This enforces one language for all users without opt-in or documented justification, which is a natural-language policy concern under the locale rule.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This code presents its description, help text, and status/error messages in Chinese only, including the module docstring and CLI output. The policy explicitly prohibits forcing a specific language without user opt-in, and there is no mechanism here to select another language or document a justified locale restriction.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/export_social.py (reported line 21)May include surrounding context.

python
"-c:a", "aac",
        output
    ]
    return subprocess.run(cmd, capture_output=True).returncode == 0

def scale_and_pad(input_file: str, target_size: str, output: str) -> bool:
    """缩放并填充黑边以适应目标比例。"""

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/extract_highlights.py (reported line 109)May include surrounding context.

python
"-c:a", "aac",
        output
    ]
    return subprocess.run(cmd, capture_output=True).returncode == 0

def scale_and_pad(input_file: str, target_size: str, output: str) -> bool:
    """缩放并填充黑边以适应目标比例。"""

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/transcribe.py (reported line 60)May include surrounding context.

python
"-c:a", "aac",
        output
    ]
    return subprocess.run(cmd, capture_output=True).returncode == 0

def scale_and_pad(input_file: str, target_size: str, output: str) -> bool:
    """缩放并填充黑边以适应目标比例。"""

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/export_social.py (reported line 34)May include surrounding context.

python
"-c:a", "aac",
        output
    ]
    return subprocess.run(cmd, capture_output=True, text=True).returncode == 0

def export(input_file: str, fmt: str, duration: float, output_dir: str) -> list:
    os.makedirs(output_dir, exist_ok=True)

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/burn_subtitles.py (reported line 76)May include surrounding context.

python
"ffprobe", "-v", "quiet", "-print_format", "json",
        "-show_format", "-show_streams", input_file
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        return {}
    try:

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/burn_subtitles.py (reported line 87)May include surrounding context.

python
"ffprobe", "-v", "quiet", "-print_format", "json",
        "-show_format", "-show_streams", input_file
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        return {}
    try:

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/cut_video.py (reported line 17)May include surrounding context.

python
"ffprobe", "-v", "quiet", "-print_format", "json",
        "-show_format", "-show_streams", input_file
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        return {}
    try:

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/extract_highlights.py (reported line 12)May include surrounding context.

python
"ffprobe", "-v", "quiet", "-print_format", "json",
        "-show_format", "-show_streams", input_file
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        return {}
    try:

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/extract_highlights.py (reported line 35)May include surrounding context.

python
"ffprobe", "-v", "quiet", "-print_format", "json",
        "-show_format", "-show_streams", input_file
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        return {}
    try:

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/extract_highlights.py (reported line 53)May include surrounding context.

python
"ffprobe", "-v", "quiet", "-print_format", "json",
        "-show_format", "-show_streams", input_file
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        return {}
    try:

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/render_edl.py (reported line 27)May include surrounding context.

python
"ffprobe", "-v", "quiet", "-print_format", "json",
        "-show_format", "-show_streams", input_file
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        return {}
    try:

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/render_edl.py (reported line 38)May include surrounding context.

python
"ffprobe", "-v", "quiet", "-print_format", "json",
        "-show_format", "-show_streams", input_file
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        return {}
    try:

Static analysis

No suspicious patterns detected.