Back to skill

Security audit

OATDA Generate Video

Security checks for vulnerabilities and agentic risk

Overview

The skill has a coherent video-generation purpose, but its copy-paste shell examples handle user prompts and API credentials in a way that could expose secrets or allow unsafe command execution.

Install only if you are comfortable sending prompts and any referenced public images to OATDA. Treat the API key as sensitive, avoid printing even partial key values, and prefer safer implementations that build request JSON with jq or another encoder instead of substituting user text into shell commands.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:72
Finding

Shell Command Injection Through Unsafe Prompt Interpolation

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 72–82. The same unsafe construction pattern is repeated in the examples at lines 128–138, 143–157, 162–172, and 177–189.
Vulnerability Type: Shell command injection and unsafe JSON construction
Risk Level: Medium

Vulnerable Code:

bash
export OATDA_API_KEY="${OATDA_API_KEY:-$(cat ~/.oatda/credentials.json 2>/dev/null | jq -r '.profiles[.defaultProfile].apiKey' 2>/dev/null)}" && \
curl -s -X POST "https://oatda.com/api/v1/llm/generate-video?async=true" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OATDA_API_KEY" \
  -d '{
    "provider": "<PROVIDER>",
    "model": "<MODEL>",
    "prompt": "<VIDEO_DESCRIPTION>"
  }'

Technical Analysis

The Skill instructs an agent to insert provider, model, and user-controlled video-description values into a JSON document embedded directly in a single-quoted shell argument. It does not require the use of a JSON encoder or any shell-safe mechanism for passing these values.

If an agent implements the placeholders through direct textual substitution, a single quote in a supplied value can terminate the shell string. Subsequent text can then be interpreted by the shell as operators, arguments, or commands. Double quotes, backslashes, newlines, and control characters can also corrupt the JSON structure or modify the request semantics even when they do not achieve shell execution.

The credential-file access itself is consistent with the declared authenticated OATDA functionality: the Skill reads a dedicated OATDA credential and sends it to the declared HTTPS OATDA endpoint. However, successful command injection would execute in the same process context and could expose that credential. The instruction permitting disclosure of the first eight API-key characters is also unnecessary; key presence should be reported without revealing any portion of the secret ...[truncated 1596 chars]

Remediation
View remediation

Remediation Suggestions

Require all request bodies to be constructed with a JSON encoder rather than by substituting values into shell source. Pass dynamic values through shell variables and jq --arg, for example:

bash
payload=$(jq -n \
  --arg provider "$PROVIDER" \
  --arg model "$MODEL" \
  --arg prompt "$VIDEO_DESCRIPTION" \
  '{provider: $provider, model: $model, prompt: $prompt}')

curl --fail-with-body -sS \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OATDA_API_KEY" \
  --data-binary "$payload" \
  "https://oatda.com/api/v1/llm/generate-video?async=true"

Apply the same encoding approach to every optional or model-specific parameter. Build nested model_params as structured JSON rather than accepting raw JSON fragments from users.

Additionally:

  1. Explicitly prohibit direct textual replacement of placeholders inside shell commands.
  2. Validate provider and model values against allowlists or values returned by the model-discovery endpoint.
  3. Validate parameter types, URL schemes, duration, dimensions, and other bounded values before request construction.
  4. Use curl --fail-with-body -sS so transport and HTTP failures are not silently ignored.
  5. Verify only whether the API key exists; do not display its first eight characters or any other portion.
  6. Restrict ~/.oatda/credentials.json to the owning account, preferably with mode 0600, and prefer the dedicated environment variable when it is already configured.
  7. Update every example in the Skill to demonstrate the safe construction pattern so an agent is not encouraged to reproduce the vulnerable form.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (15)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
"openclaw":
      {
        "emoji": "🎬",
        "requires": { "bins": ["curl", "jq"], "env": ["OATDA_API_KEY"], "files": ["~/.oatda/credentials.json"] },
        "primaryEnv": "OATDA_API_KEY",
      },
  }

Credential Access

High
Category
Privilege Escalation
Confidence
72% confidence
Finding

The skill reads a credential directly from a local file and exports it into the shell environment for subsequent commands. Although done for legitimate authentication, this pattern increases exposure because environment variables can leak via logs, subprocesses, shell history in debugging contexts, or accidental echoing.

Content

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

All commands need the OATDA API key. Resolve it inline for each exec call:

bash
export OATDA_API_KEY="${OATDA_API_KEY:-$(cat ~/.oatda/credentials.json 2>/dev/null | jq -r '.profiles[.defaultProfile].apiKey' 2>/dev/null)}"

If the key is empty or null, tell the user to get one at https://oatda.com and configure it.

Credential Access

High
Category
Privilege Escalation
Confidence
71% confidence
Finding

This command again reads the API key from a local credentials file and injects it into an authorization header for a network request. The action is functionally required, but repeated inline credential extraction expands the number of places where secrets are handled and raises accidental exposure risk.

Content

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

Different models support different parameters. Query before generating:

bash
export OATDA_API_KEY="${OATDA_API_KEY:-$(cat ~/.oatda/credentials.json 2>/dev/null | jq -r '.profiles[.defaultProfile].apiKey' 2>/dev/null)}" && \
curl -s -X GET "https://oatda.com/api/v1/llm/models?type=video" \
  -H "Authorization: Bearer $OATDA_API_KEY" | jq '.video_models[] | {id, supported_params}'

Credential Access

High
Category
Privilege Escalation
Confidence
74% confidence
Finding

Here the skill reads the local API key and immediately uses it in an authenticated POST request. This is not inherently malicious, but it is a genuine secret-handling risk because the skill normalizes direct access to local credentials and broad environment export before external transmission.

Content

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

CRITICAL: The endpoint URL must include ?async=true.

bash
export OATDA_API_KEY="${OATDA_API_KEY:-$(cat ~/.oatda/credentials.json 2>/dev/null | jq -r '.profiles[.defaultProfile].apiKey' 2>/dev/null)}" && \
curl -s -X POST "https://oatda.com/api/v1/llm/generate-video?async=true" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OATDA_API_KEY" \

Credential Access

High
Category
Privilege Escalation
Confidence
71% confidence
Finding

The example repeats the same credential-access pattern, pulling a secret from local storage into an environment variable for use in a network request. Repetition across examples increases the chance downstream implementations will copy the less-safe pattern verbatim.

Content

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

Seedance (default)

bash
export OATDA_API_KEY="${OATDA_API_KEY:-$(cat ~/.oatda/credentials.json 2>/dev/null | jq -r '.profiles[.defaultProfile].apiKey' 2>/dev/null)}" && \
curl -s -X POST "https://oatda.com/api/v1/llm/generate-video?async=true" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OATDA_API_KEY" \

Credential Access

High
Category
Privilege Escalation
Confidence
71% confidence
Finding

This example combines credential retrieval from disk with an external request that also references public image assets. While aligned with the skill's purpose, it still normalizes local secret access and broader exposure of sensitive content in one workflow.

Content

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

Seedance Image-to-Video

bash
export OATDA_API_KEY="${OATDA_API_KEY:-$(cat ~/.oatda/credentials.json 2>/dev/null | jq -r '.profiles[.defaultProfile].apiKey' 2>/dev/null)}" && \
curl -s -X POST "https://oatda.com/api/v1/llm/generate-video?async=true" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OATDA_API_KEY" \

Credential Access

High
Category
Privilege Escalation
Confidence
71% confidence
Finding

The example reads the API key from local credentials and exports it before sending an authenticated request. In a skill that already processes user media, this increases cumulative risk by combining secret handling and third-party data transfer in copy-paste-ready commands.

Content

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

MiniMax with Reference Image

bash
export OATDA_API_KEY="${OATDA_API_KEY:-$(cat ~/.oatda/credentials.json 2>/dev/null | jq -r '.profiles[.defaultProfile].apiKey' 2>/dev/null)}" && \
curl -s -X POST "https://oatda.com/api/v1/llm/generate-video?async=true" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OATDA_API_KEY" \

Credential Access

High
Category
Privilege Escalation
Confidence
71% confidence
Finding

This final example repeats direct local credential access and environment export prior to external transmission. The skill context makes this moderately risky because the pattern may be propagated widely by users without understanding the secret-handling implications.

Content

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

Google Veo

bash
export OATDA_API_KEY="${OATDA_API_KEY:-$(cat ~/.oatda/credentials.json 2>/dev/null | jq -r '.profiles[.defaultProfile].apiKey' 2>/dev/null)}" && \
curl -s -X POST "https://oatda.com/api/v1/llm/generate-video?async=true" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OATDA_API_KEY" \

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest says the skill triggers when the user wants to "generate, create, or produce AI video clips or animations," which is broad and lacks clear boundaries or exclusion conditions. Terms like "create" and "produce" are common phrasing and could cause unintended invocation without a narrower trigger list or negative examples.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill instructs users to provide public URLs for input images but does not warn that making images publicly accessible exposes them to third parties and the remote provider. In this skill context, users may upload personal or sensitive media for video generation, so the omission creates a meaningful privacy and data-disclosure risk.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
91% confidence
Finding

This command sends user prompts and model parameters, along with an authorization bearer token, to an external service. External transmission is expected for this skill, but it is still security-relevant because prompts may contain sensitive data and are disclosed to OATDA and potentially underlying model vendors.

Content

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

bash
export OATDA_API_KEY="${OATDA_API_KEY:-$(cat ~/.oatda/credentials.json 2>/dev/null | jq -r '.profiles[.defaultProfile].apiKey' 2>/dev/null)}" && \
curl -s -X POST "https://oatda.com/api/v1/llm/generate-video?async=true" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OATDA_API_KEY" \
  -d '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

This example performs the same external transmission of prompt content and credentials to OATDA for processing. The behavior is intrinsic to the skill, but without strong notice and consent controls it can expose sensitive user inputs to third-party infrastructure.

Content

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

bash
export OATDA_API_KEY="${OATDA_API_KEY:-$(cat ~/.oatda/credentials.json 2>/dev/null | jq -r '.profiles[.defaultProfile].apiKey' 2>/dev/null)}" && \
curl -s -X POST "https://oatda.com/api/v1/llm/generate-video?async=true" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OATDA_API_KEY" \
  -d '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This example sends not only the prompt but also references to public image URLs to an external service, increasing privacy exposure beyond text alone. In the context of image-to-video generation, users may unknowingly disclose personal images or linkable assets to third parties.

Content

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

bash
export OATDA_API_KEY="${OATDA_API_KEY:-$(cat ~/.oatda/credentials.json 2>/dev/null | jq -r '.profiles[.defaultProfile].apiKey' 2>/dev/null)}" && \
curl -s -X POST "https://oatda.com/api/v1/llm/generate-video?async=true" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OATDA_API_KEY" \
  -d '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This example transmits a prompt and a reference image URL to a third-party API, creating a direct disclosure channel for user content. Because reference images can contain biometric, personal, or proprietary material, the skill context makes this more dangerous than routine external API usage.

Content

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

bash
export OATDA_API_KEY="${OATDA_API_KEY:-$(cat ~/.oatda/credentials.json 2>/dev/null | jq -r '.profiles[.defaultProfile].apiKey' 2>/dev/null)}" && \
curl -s -X POST "https://oatda.com/api/v1/llm/generate-video?async=true" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OATDA_API_KEY" \
  -d '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

This example also sends user-generated prompt content to an external service using a bearer-authenticated request. While necessary for service operation, it still represents a real disclosure boundary that should be treated as security-sensitive rather than implicit.

Content

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

bash
export OATDA_API_KEY="${OATDA_API_KEY:-$(cat ~/.oatda/credentials.json 2>/dev/null | jq -r '.profiles[.defaultProfile].apiKey' 2>/dev/null)}" && \
curl -s -X POST "https://oatda.com/api/v1/llm/generate-video?async=true" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OATDA_API_KEY" \
  -d '{

Static analysis

No suspicious patterns detected.