Back to skill

Security audit

Course Builder Agent

Security checks for vulnerabilities and agentic risk

Overview

This skill is a plausible course-video generator, but it asks for risky system-level installation and advertises external digital-human/photo handling that is not clearly implemented or disclosed.

Review before installing. The skill can generate local slide-and-audio videos, but do not assume the advertised digital-human or subtitle embedding features actually work. Avoid providing personal photos unless the publisher adds clear third-party privacy terms and explicit consent controls. Install only in an isolated virtual environment or container, because the current install command can alter the host Python environment with unpinned dependencies.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (1)

T08 · Insecure Dependencies

Warning
Location
claw.json:10
Finding
Unpinned Dependencies Installed into the System Python Environment## Vulnerability Details **File Location**: `claw.json`, line 10 **Vulnerability Type**: Unpinned third-party dependencies and unsafe system-level package installation **Risk Level**: Medium ### Vulnerable Code ```json "commands": ["pip3 install edge-tts Pillow --break-system-packages || pip install edge-tts Pillow"], ``` ### Technical Analysis The installation command retrieves `edge-tts` and `Pillow` without fixed versions or package hashes. Consequently, the code installed during deployment can differ from the code assessed during this audit. If a dependency, transitive dependency, package index, or distribution account is compromised, a malicious release could be selected and installed. The primary command also uses `--break-system-packages`, bypassing protections intended to prevent `pip` from modifying an externally managed system Python environment. This can overwrite or introduce conflicts with operating-system-managed packages. The fallback command remains unpinned and does not isolate dependencies in a virtual environment. The reviewed evidence does not establish that the currently published dependencies are malicious. The vulnerability is the uncontrolled supply-chain and installation process. ### Attack Path 1. An attacker compromises a dependency or transitive dependency release, its publisher account, or the package source used by `pip`. 2. The attacker publishes a malicious version that satisfies the unconstrained dependency request. 3. A user installs the skill, causing `pip` to resolve and download that version. 4. Package installation hooks, imported modules, or runtime code execute on the host. 5. The malicious package acts with the privileges of the user or service account performing installation or running the skill. ### Impact Assessment Successful exploitation could permit arbitrary code execution with the privileges of the installer or runtime account. Depending on those privileges, an attacker could access that account's files ...[truncated 378 chars]
Remediation
## Remediation Suggestions 1. Pin every direct dependency to an audited version, for example: ```text edge-tts==<reviewed-version> Pillow==<reviewed-version> ``` 2. Generate a lock file that includes all transitive dependencies and cryptographic hashes. Install with hash verification, such as: ```bash python3 -m pip install --require-hashes -r requirements.txt ``` 3. Install dependencies inside a dedicated virtual environment rather than the system Python environment: ```bash python3 -m venv .venv .venv/bin/python -m pip install --require-hashes -r requirements.txt ``` 4. Remove `--break-system-packages` and do not fall back to an unisolated, unpinned installation. 5. Configure an approved package index or internal artifact repository and enforce TLS certificate validation. 6. Scan and review dependency updates before modifying pinned versions, including transitive dependency and provenance checks. 7. Run installation and media generation under a non-privileged service account with restricted filesystem and network access.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (15)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The skill advertises a full pipeline including digital-human output and subtitle integration, but the documented behavior indicates some of these features are placeholders or not actually used in final composition. This mismatch can mislead users into uploading photos or trusting outputs to contain expected processing steps, creating privacy, integrity, and informed-consent risks rather than a direct exploit primitive.

Unvalidated Output Injection

High
Category
Output Handling
Content
def generate_tts(text, voice, output):
    """生成TTS配音"""
    subprocess.run([
        "edge-tts", "--voice", voice,
        "--text", text,
        "--write-media", output
Confidence
95% confidence
Finding
Model output is used without validation or sanitization. Unvalidated output injected into downstream contexts (SQL, shell, HTML) enables injection attacks and arbitrary code execution.

Unvalidated Output Injection

High
Category
Output Handling
Content
"--write-media", output
    ], check=True, timeout=120)
    
    result = subprocess.run(
        ["ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "csv=p=0", output],
        capture_output=True, text=True
    )
Confidence
95% confidence
Finding
Model output is used without validation or sanitization. Unvalidated output injected into downstream contexts (SQL, shell, HTML) enables injection attacks and arbitrary code execution.

Lp3

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding
The skill describes capabilities that imply file read/write and shell execution, but it does not declare any tool scope or permission boundaries. This creates an authorization ambiguity where an agent runtime may grant broader access than users expect, increasing the risk of unintended file access, overwriting artifacts, or command execution during video generation.

Natural-Language Policy Violations

Medium
Confidence
87% confidence
Finding
The description explicitly says the pipeline generates Chinese slides, and later sections reinforce Chinese-only defaults such as 中文幻灯片 and zh-CN voices, but no user opt-in or locale choice is presented. This is a natural-language locale policy concern because the skill appears to impose a specific language behavior by default rather than offering a choice.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill instructs users to upload a photo to an external digital-human service without a clear warning that biometric or personal image data leaves the local environment. In this context, the omitted disclosure is dangerous because users may provide sensitive likeness data without understanding third-party processing, retention, or model-cloning implications.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The display name and description specify a Chinese-only workflow, including '中文幻灯片' and Chinese command examples, with no indication that users can choose another language or locale. This is a natural-language policy concern because the skill appears to impose a specific language by default rather than offering user choice or documenting a justified regional restriction.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The default voice is fixed to `zh-CN-XiaoxiaoNeural`, and the script’s user-facing description/messages are entirely Chinese, which effectively constrains the skill to a specific language/locale without user opt-in. The policy allows locale constraints only when clearly documented and justified or when users are explicitly given a language choice.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
def generate_tts(text, voice, output):
    """生成TTS配音"""
    subprocess.run([
        "edge-tts", "--voice", voice,
        "--text", text,
        "--write-media", output
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
"--write-media", output
    ], check=True, timeout=120)
    
    result = subprocess.run(
        ["ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "csv=p=0", output],
        capture_output=True, text=True
    )
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
slides_video = output_path + ".slides.mp4"
    
    # 生成幻灯片视频
    subprocess.run([
        "ffmpeg", "-y",
        "-f", "concat", "-safe", "0",
        "-i", concat_file,
Confidence
83% confidence
Finding
This ffmpeg invocation consumes a concat manifest built from filenames derived from the contents of a directory, while explicitly setting -safe 0 to relax path safety checks. If an attacker can influence files placed in slides_dir or their names, ffmpeg may be directed to process unexpected file paths, creating a local file inclusion/trust-boundary issue around media processing.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
# 裁剪到音频长度
    slides_trim = output_path + ".trim.mp4"
    subprocess.run([
        "ffmpeg", "-y", "-i", slides_video,
        "-t", str(duration), "-c", "copy",
        slides_trim
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
], check=True, capture_output=True)
    
    # 合成最终视频
    subprocess.run([
        "ffmpeg", "-y",
        "-i", slides_trim,
        "-i", audio_path,
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Description-Behavior Mismatch

Medium
Confidence
96% confidence
Finding
The manifest describes a full pipeline including '数字人驱动' and specifically names 飞影数字人 as part of the generated courseware video workflow. In the code, the digital-human step is only a placeholder printout and no API call, processing step, or video composition involving a digital human actually occurs.

Intent-Code Divergence

Low
Confidence
92% confidence
Finding
The comment '# 7. 数字人(可选)' and surrounding stage numbering present this as an actual processing step in the build pipeline. However, the implementation merely prints that MCP configuration is pending, which contradicts the implication that a digital-human operation is being performed.

Static analysis

No suspicious patterns detected.