Back to skill

Security audit

Openclaw Video Editor

Security checks for vulnerabilities and agentic risk

Overview

This is a local ffmpeg video-editing skill whose file and command behavior matches its stated purpose, with one minor disclosure gap around temporary highlight-reel files.

Install only if you are comfortable running local ffmpeg workflows on media files you choose. Be aware that outputs may overwrite existing files at the paths you provide, and highlight reel generation temporarily stores derived clips in the system temp directory before cleanup.

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
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (13)

Memory Manipulation

High
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.

Content

Scanner excerpt · scripts/generate_srt.py (reported line 66)May include surrounding context.

python
chunk_end = None

    def flush_chunk():
        """Add current chunk to chunks list and reset state."""
        nonlocal current_words, current_text, chunk_start, chunk_end
        if current_words and chunk_start is not None:
            chunks.append({

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_audio.py (reported line 101)May include surrounding context.

python
def probe_audio_info(path: Path) -> Optional[Dict[str, str]]:
    """Return basic info about the first audio stream, or None on failure."""
    res = subprocess.run(
        [
            "ffprobe", "-v", "error",
            "-select_streams", "a:0",

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_audio.py (reported line 242)May include surrounding context.

python
+ ")",
              file=sys.stderr)

    res = subprocess.run(cmd, check=False, text=True,
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if res.returncode != 0:
        # Surface the most useful ffmpeg error line.

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_clip.py (reported line 99)May include surrounding context.

python
def probe_has_video(path: Path) -> bool:
    res = subprocess.run(
        ["ffprobe", "-v", "error", "-select_streams", "v",
         "-show_entries", "stream=codec_type", "-of", "csv=p=0", str(path)],
        check=False, capture_output=True, text=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/extract_clip.py (reported line 108)May include surrounding context.

python
def probe_duration(path: Path) -> Optional[float]:
    res = subprocess.run(
        ["ffprobe", "-v", "error", "-show_entries", "format=duration",
         "-of", "default=nw=1:nk=1", str(path)],
        check=False, capture_output=True, text=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/extract_clip.py (reported line 242)May include surrounding context.

python
f"-> {out_path}  "
              f"({'accurate re-encode' if args.accurate else 'fast stream-copy'})")

    res = subprocess.run(cmd, check=False)
    if res.returncode != 0:
        print(f"Error: ffmpeg failed (exit {res.returncode})", file=sys.stderr)
        return 1

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The docstring states that the script never reads or writes paths outside the directories of the input and output files. In reality, the code creates a temporary working directory via TemporaryDirectory and writes extracted clip files and a concat list there before producing the final output, which is a direct contradiction of the stated behavior.

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

python
def run(cmd: List[str], capture: bool = False) -> subprocess.CompletedProcess:
    """Run a command; never use shell=True."""
    return subprocess.run(
        cmd,
        check=False,
        text=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/apply_lut.py (reported line 48)May include surrounding context.

python
def run(cmd: List[str]) -> subprocess.CompletedProcess:
    return subprocess.run(cmd, check=False, text=True, stderr=subprocess.PIPE)


def has_audio_stream(path: Path) -> 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/loudnorm_two_pass.py (reported line 39)May include surrounding context.

python
def run(cmd: List[str]) -> subprocess.CompletedProcess:
    return subprocess.run(cmd, check=False, text=True, stderr=subprocess.PIPE)


def has_audio_stream(path: Path) -> 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/make_vertical.py (reported line 42)May include surrounding context.

python
def run(cmd: List[str]) -> subprocess.CompletedProcess:
    return subprocess.run(cmd, check=False, text=True, stderr=subprocess.PIPE)


def has_audio_stream(path: Path) -> 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_audio.py (reported line 84)May include surrounding context.

python
so the caller can surface a clean error message rather than letting
    pass 1 of loudnorm fail with an opaque "measurement JSON not found".
    """
    res = subprocess.run(
        [
            "ffprobe", "-v", "error",
            "-select_streams", "a",

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

python
so the caller can surface a clean error message rather than letting
    pass 1 of loudnorm fail with an opaque "measurement JSON not found".
    """
    res = subprocess.run(
        [
            "ffprobe", "-v", "error",
            "-select_streams", "a",

Static analysis

No suspicious patterns detected.