Back to skill

Security audit

Video Captioning by ReelWords

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its caption-generation purpose, but its fallback download path may expose your ReelWords API key during redirects.

Review before installing. Use only with a ReelWords key you can rotate, avoid the video-endpoint fallback until redirects are handled without x-api-key, prefer result.downloadUrl downloads, and do not use sensitive/private videos unless you are comfortable sending them to ReelWords.

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

Error
Location
scripts/reelwords_caption_job.py:86
Finding

ReelWords API Key May Be Disclosed to a Cross-Origin Redirect Target

Content
View full analysis
None: """Download via GET /api/v1/caption-jobs/{id}/video which 302-redirects to signed URL.""" url = f"{BASE_URL}/api/v1/caption-jobs/{job_id}/video" with requests.get(url, headers={"x-api-key": api_key, "Accept": "application/json"}, stream=True, allow_redirects=True, timeout=timeout_s) as r: if r.status_code == 409: raise ReelWordsError(f"Job not ready for download yet (HTTP 409): {r.text}") if r.status_code >= 400: raise ReelWordsError(f"Download endpoint failed: HTTP {r.status_code}: {r.text}") with open(out_path, "wb") as f: for chunk in r.iter_content(chunk_size=1024 * 1024): if chunk: f.write(chunk) ``` ### Technical Analysis The authenticated `/video` endpoint is documented as returning an HTTP 302 redirect to a signed storage URL. The request supplies the reusable ReelWords API key through the custom `x-api-key` header while enabling `allow_redirects=True`. Python Requests has special cross-origin redirect handling for standard authentication information such as the `Authorization` header, but arbitrary sensitive headers such as `x-api-key` are not guaranteed to be removed when the redirect changes origin. The automatically followed request may therefore transmit the ReelWords credential to the storage host named by the redirect. Sending the API key to `https://api.reelwords.ai` for job creation and status polling is necessary for the Skill's declared functionality. Forwarding that credential to a separate download host is not necessary because the redirected URL is already signed. This redirect beh ...[truncated 1730 chars]
Remediation
View remediation
None: endpoint = f"{BASE_URL}/api/v1/caption-jobs/{job_id}/video" with requests.get( endpoint, headers={"x-api-key": api_key, "Accept": "application/json"}, stream=True, allow_redirects=False, timeout=timeout_s, ) as initial: if initial.status_code == 409: raise ReelWordsError( f"Job not ready for download yet (HTTP 409): {initial.text}" ) if initial.status_code not in {301, 302, 303, 307, 308}: raise ReelWordsError( f"Expected download redirect, received HTTP {initial.status_code}" ) location = initial.headers.get("Location") if not location: raise ReelWordsError("Download redirect omitted the Location header.") download_url = urljoin(endpoint, location) parsed = urlparse(download_url) if parsed.scheme != "https" or not parsed.hostname: raise ReelWordsError("Rejected unsafe download redirect.") # Deliberately omit x-api-key from the ...[truncated 681 chars]
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (11)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill explicitly requires environment variables and performs outbound network actions, but it does not declare any tool scope restrictions such as allowed tools or destination constraints. That omission weakens least-privilege controls and makes it easier for future edits or companion scripts to use broader capabilities than intended without policy enforcement.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

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

md
---
name: reelwords-captions
description: Generate captions for short-form videos using the ReelWords (reelwords.ai) Caption API. Use when a user asks to create caption jobs, render stylized subtitles for Reels/TikTok/Shorts, poll caption-job status, or download the rendered captioned video via the ReelWords REST API endpoints (/api/v1/caption-jobs) using an x-api-key (rw_...).
metadata: {"clawdbot":{"emoji":"📝","requires":{"bins":["python3"],"env":["REELWORDS_API_KEY"]}}}
---

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

1) Create job

bash
curl -sS https://api.reelwords.ai/api/v1/caption-jobs \
  -H "x-api-key: $REELWORDS_API_KEY" \
  -H "content-type: application/json" \
  -d '{

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The reference explicitly instructs use of a secret x-api-key and shows it in request examples, but provides no guidance on secure handling, storage, redaction, or avoiding exposure in logs and transcripts. In an agent-skill context, this omission increases the chance that users or downstream tooling will paste real credentials into prompts, code, shell history, or telemetry that may be externally exposed.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
79% confidence
Finding

This example documents sending data, including a secret auth header and user-supplied videoUrl, to an external third-party API. External transmission is expected for this skill, but it remains security-relevant because the file does not warn about consent, data sensitivity of video content, or secret leakage through copied curl commands and logs.

Content

Scanner excerpt · references/api.md (reported line 21)May include surrounding context.

  • styleId (string, required) - optional: positionY, fontSize, mainColor, highlightColor, hookColor, highlightOpacity, highlightCornerRadius, highlightMode, highlightScale, fontFamily, styleClasses

Example curl (from docs):

bash
curl https://api.reelwords.ai/api/v1/caption-jobs \

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

Example curl (from docs):

bash
curl https://api.reelwords.ai/api/v1/caption-jobs \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_SECRET_TOKEN' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

Example curl (from docs):

bash
curl https://api.reelwords.ai/api/v1/caption-jobs \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_SECRET_TOKEN' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

Example curl (from docs):

bash
curl https://api.reelwords.ai/api/v1/caption-jobs \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_SECRET_TOKEN' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api.md (reported line 24)May include surrounding context.

Example curl (from docs):

bash
curl https://api.reelwords.ai/api/v1/caption-jobs \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_SECRET_TOKEN' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/api.md (reported line 64)May include surrounding context.

Example curl (from docs):

bash
curl https://api.reelwords.ai/api/v1/caption-jobs \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_SECRET_TOKEN' \

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

The download endpoint returns a 302 redirect to a signed storage URL, which can function as a bearer-style access link to the rendered video. Without warnings about treating redirect targets and result.downloadUrl as sensitive, users may leak access to private rendered media through logs, shared terminals, or chat transcripts.

Content

Scanner excerpt · references/api.md (reported line 77)May include surrounding context.

Example curl (download endpoint):

bash
curl -i https://api.reelwords.ai/api/v1/caption-jobs/123e4567-e89b-12d3-a456-426614174000/video \
  --header 'x-api-key: YOUR_SECRET_TOKEN'

Static analysis

No suspicious patterns detected.