Back to skill

Security audit

Send Video Message

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed Runway video-message helper with some ordinary integration risks, but I found no hidden, deceptive, or purpose-mismatched behavior.

Install only if you are comfortable sending the message text, avatar image or prompt, and generated media workflow data to Runway using your API key. Prefer setting RUNWAY_API_SECRET in the environment instead of passing --api-key, use a private or explicit --output path on shared machines, pin dependencies before production use, and choose voices by user preference rather than inferred appearance.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
Findings (2)

T08 · Insecure Dependencies

Warning
Location
scripts/setup_avatar.py:2
Finding

Unpinned Runtime Dependencies Create a Supply-Chain Risk

Content
View full analysis
=3.10" # dependencies = [ # "runwayml>=4.0.0", # "httpx>=0.27.0", # ] # /// ``` ### Technical Analysis The scripts are intended to be launched through `uv run`, which resolves the inline dependency declarations at runtime. The dependencies specify only minimum versions and do not provide exact versions, a committed lockfile, or package integrity hashes. Consequently, a future release of `runwayml` or `httpx` can be installed and executed without that release having been reviewed as part of this Skill. Python package installation and import execute package-controlled code with the privileges of the user invoking the Skill. This is particularly sensitive because the dependency code executes in a process that has access to: - The `RUNWAY_API_SECRET` environment variable or an API key supplied through `--api-key`. - User-provided speech text and avatar descriptions. - Avatar image URLs and generated media URLs. - The current user's filesystem permissions. - Network access available to the Skill process. There is no evidence that the currently declared package names are malicious. The vulnerability is the lack of reproducible, integrity-controlled dependency resolution. ### Attack Path 1. An attacker compromises the publisher account, distribution infrastructure, or a future permitted release of one of the dependencies. 2. The attacker publishes a malicious version satisfying `runwayml>=4.0.0` or `httpx>=0.27.0`. 3. A user invokes one of the documented `uv run` commands in an environment that resolves the malicious release. 4. `uv` downloads and installs the permitted version. 5. The script imports the dependency: ...[truncated 954 chars]
Remediation
View remediation
", # "httpx==", # ] ``` 2. Generate and commit a `uv.lock` file so dependency resolution, including transitive dependencies, is reproducible. 3. Run documented commands in locked or frozen mode so execution fails rather than silently selecting newer versions. 4. Use package hashes or an integrity-verifying internal package mirror where supported. 5. Introduce an explicit dependency-update process that includes: - Source and release review. - Vulnerability scanning. - Automated tests. - Lockfile review. 6. Avoid exposing secrets to dependency installation or build hooks where the execution environment permits installation to be separated from runtime. 7. Apply the same controls to both `scripts/setup_avatar.py` and `scripts/generate_video.py`. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/generate_video.py:276
Finding

Predictable Temporary Video Path Permits Symbolic-Link File Overwrite

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
Findings (12)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The advertised purpose is sending a video message, but the skill also provisions avatars, can generate images from prompts, and stores persistent state in the user's home directory. This mismatch matters because users and policy engines may approve the skill for a narrow messaging task while it actually performs additional networked and persistent operations that affect privacy, consent, and system state.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · SKILL.md (reported line 14)May include surrounding context.

md
## Privacy & Data Handling

- **Runway API**: Only data you explicitly pass (spoken text, avatar image) is sent to Runway ([dev.runwayml.com](https://dev.runwayml.com)). Nothing is uploaded automatically. Custom avatars can be deleted anytime via `DELETE /v1/avatars/{id}`.
- **Output**: Generated videos are saved to `/tmp` and sent via `MEDIA:` for OpenClaw to auto-attach.

## Setup

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill requests or implies powerful capabilities (environment access, file read/write, network, shell) but does not declare any explicit tool scope or permissions boundary. In an agent ecosystem, this increases the chance that the skill runs with broader privileges than users or orchestrators expect, enabling unintended command execution, local persistence, and external data transfer.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
82% confidence
Finding

The skill establishes durable state through an API secret in the environment and a persisted avatar identifier in ~/.openclaw/runway-avatar.json for reuse across sessions. Persistent credentials and identity state can be reused unintentionally, cause cross-user/session confusion on shared systems, and expand the blast radius if local files are exposed.

Content

Scanner excerpt · SKILL.md (reported line 22)May include surrounding context.

md
### Get a Runway API Key

1. Go to [dev.runwayml.com](https://dev.runwayml.com)
2. Create an account and get an API key
3. Set it: `export RUNWAY_API_SECRET=your_key`

## One-Time Setup: Create Your Avatar

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The instructions direct the agent to infer and enforce gendered voice selection from avatar appearance without user opt-in. This can cause harmful profiling or misgendering and may override explicit or implicit user preferences, especially in a user-facing communication tool.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The manifest describes a skill focused on sending a video message using the Runway Character API. This file adds local media transformation by discovering and invoking an external executable via subprocess, which is a broader host-level capability than the stated purpose requires and is not mentioned in the manifest description.

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

python
"+faststart",
        str(dest),
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        print(f"Error: ffmpeg failed:\n{result.stderr}", file=sys.stderr)
        sys.exit(1)

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

python
"+faststart",
        str(dest),
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        print(f"Error: ffmpeg failed:\n{result.stderr}", file=sys.stderr)
        sys.exit(1)

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

In addition to generating and downloading the avatar video, the code can invoke a local ffmpeg binary to create a Telegram-oriented square variant. Local subprocess execution is not an obvious requirement of the manifest's stated purpose and is not disclosed there.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The script transmits arbitrary user-provided text, the generated audio/video workflow metadata, and an API bearer token to external Runway endpoints without any explicit notice or confirmation at the point of use. In an agent setting, this can cause unintentional disclosure of sensitive user content to third-party services, especially if the text contains private data the user did not realize would leave the local environment.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The manifest describes a skill for sending a video message, but this file performs one-time avatar provisioning and writes the resulting avatar ID/name to a local config file for future reuse. Creating long-lived account configuration is a broader behavior than simply sending a message and is not an obvious implementation detail of the described runtime action.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The manifest says the skill sends a video message using an AI avatar, but this script can also invoke a text-to-image generation workflow to create the avatar's portrait when no image URL is supplied. Image generation is a separate content-creation capability not communicated by the manifest description.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.