Back to skill

Security audit

短剧拆解学习

Security checks for vulnerabilities and agentic risk

Overview

ClawScan marks this skill suspicious because it reports unbounded memory use while processing supplied videos and the skill does not declare its detected tool scope.

Review the reported memory risk and clarify which file and shell tools the skill needs before installing. The scan covered all listed components, but a suspicious verdict means the reported risk should be considered; it does not establish malicious intent.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (13)

Skill declares no tool scope ('permissions' or 'allowed-tools') but code capabilities were detected: file_read, file_write, shell.

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

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/breakdown_tool.py (reported line 167)May include surrounding context.

python
def probe(video: Path) -> Dict[str, Any]:
    result = subprocess.run(
        [_require("ffprobe"), "-v", "error", "-select_streams", "v:0",
         "-show_entries", "stream=width,height:stream_tags=rotate:stream_side_data=rotation:format=duration",
         "-of", "json", str(video)],

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/breakdown_tool.py (reported line 197)May include surrounding context.

python
def detect_cuts(video: Path, threshold: float) -> List[float]:
    result = subprocess.run(
        # The same first video track probe() reads, whatever ffmpeg would pick.
        [_require("ffmpeg"), "-hide_banner", "-nostats", "-i", str(video), "-map", "0:v:0",
         "-vf", f"scale=256:-2,select='gt(scene,{threshold})',showinfo", "-f", "null", "-"],

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/breakdown_tool.py (reported line 223)May include surrounding context.

python
for index, length in enumerate(lengths):
            middle = start + length / 2
            start += length
            subprocess.run(
                [ffmpeg, "-v", "error", "-ss", f"{middle:.3f}", "-i", str(video), "-map", "0:v:0",
                 "-frames:v", "1", "-vf", "scale=320:-2", "-y", f"{tmp}/{index:04d}.jpg"],
                check=False,

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/breakdown_tool.py (reported line 232)May include surrounding context.

python
if not frames:
            return
        rows = (len(frames) + columns - 1) // columns
        subprocess.run(
            [ffmpeg, "-v", "error", "-framerate", "1", "-i", f"{tmp}/%04d.jpg",
             "-vf", f"tile={columns}x{rows}:padding=2", "-frames:v", "1", "-y", str(out)],
            check=False,

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/breakdown_tool.py (reported line 287)May include surrounding context.

python
def has_audio(video: Path) -> bool:
    result = subprocess.run(
        [_require("ffprobe"), "-v", "error", "-select_streams", "a", "-show_entries", "stream=index",
         "-of", "json", str(video)],
        capture_output=True, text=True, check=False,

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/breakdown_tool.py (reported line 300)May include surrounding context.

python
def audio_end(video: Path) -> Optional[float]:
    """Where the first audio stream stops, or ``None`` when the container does not say."""

    result = subprocess.run(
        [_require("ffprobe"), "-v", "error", "-select_streams", "a:0", "-show_entries",
         "stream=start_time,duration", "-of", "json", str(video)],
        capture_output=True, text=True, check=False,

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/breakdown_tool.py (reported line 369)May include surrounding context.

python
"blind_spot": "有声区间不分对白、旁白、配乐与音效;整段配乐铺底时几乎全程算有声",
    }
    if record["has_audio"]:
        result = subprocess.run(
            [_require("ffmpeg"), "-hide_banner", "-nostats", "-i", str(video), "-map", "0:a:0",
             "-af", f"silencedetect=noise={noise_db}dB:d={min_silence},ebur128=peak=true", "-f", "null", "-"],
            capture_output=True, text=True, check=False,

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/breakdown_tool.py (reported line 423)May include surrounding context.

python
"""Frame rate and the video stream's own duration (a longer audio track
    stretches the container's)."""

    result = subprocess.run(
        [_require("ffprobe"), "-v", "error", "-select_streams", "v:0", "-show_entries",
         "stream=avg_frame_rate,r_frame_rate,duration", "-of", "json", str(video)],
        capture_output=True, text=True, check=False,

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/breakdown_tool.py (reported line 455)May include surrounding context.

python
if target.exists():
        target.unlink()
    result = subprocess.run(
        [ffmpeg, "-v", "error", "-ss", f"{moment:.3f}", "-i", str(video), "-map", "0:v:0",
         "-frames:v", "1", "-vf", vf, "-y", str(target)],
        capture_output=True, check=False,

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/breakdown_tool.py (reported line 510)May include surrounding context.

python
for shot in shots:
        start, end = shot["start"], shot["end"]
        clip = f"{shot['id']}.mp4"
        result = subprocess.run(
            [ffmpeg, "-v", "error", "-ss", f"{start:.3f}", "-i", str(video), "-t", f"{end - start:.3f}",
             "-map", "0:v:0", "-map", "0:a:0?", "-vf", scale, "-c:v", "libx264", "-preset", "veryfast",
             "-crf", "23", "-pix_fmt", "yuv420p", "-c:a", "aac", "-movflags", "+faststart", "-y",

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
97% confidence
Finding

The multi-frame path captures the entire decoded raw-video stream in memory before processing it, without a duration, output-size, or execution limit. A long or unusually tall supplied video can exhaust the agent's memory and terminate the workflow; subtitle analysis makes processing externally supplied videos an expected exposure, although this is resource exhaustion rather than shell injection.

Content

Scanner excerpt · scripts/breakdown_tool.py (reported line 576)May include surrounding context.

python
# Both branches of a split share one pixel format: make it RGB, or the
        # colour branch would only ever see grey.
        chain += f",format=gbrp,split[grey][hue];[grey]format=gray[g];[hue]{_color_filter(color, tolerance)}[c];[g][c]vstack"
    result = subprocess.run(
        [_require("ffmpeg"), "-v", "error", "-i", str(video), "-map", "0:v:0"]
        + ([] if fps else ["-frames:v", "1"])
        + ["-vf", chain, "-f", "rawvideo", "-"],

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/breakdown_tool.py (reported line 827)May include surrounding context.

python
kept += 1
        if kept:
            columns = min(kept, 4 if portrait else 2)
            subprocess.run(
                [ffmpeg, "-v", "error", "-i", str(Path(scratch) / "f%03d.png"), "-frames:v", "1",
                 "-vf", f"tile={columns}x{math.ceil(kept / columns)}:padding=8:color=white", "-y", str(sheet)],
                capture_output=True, check=False,