Back to skill

Security audit

Video Translator

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent video translation integration that sends user-provided videos or video URLs to a disclosed external service and returns a preview link.

Use this skill only for videos or URLs you are allowed to send to the disclosed third-party service. Keep VIDEO_TRANSLATE_SERVICE_API_KEY in the environment, avoid pasting it into prompts or logs, and be cautious with confidential media. If using the helper script with untrusted URLs, harden JSON construction with a serializer first.

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
scripts/curl_examples.sh:98
Finding
Unescaped User-Controlled URL Allows JSON Request Injection<![CDATA[ ## Vulnerability Details **File Location**: `scripts/curl_examples.sh`, lines 98-105 **Vulnerability Type**: Improper encoding of user-controlled data in a JSON request **Risk Level**: Medium ### Vulnerable Code ```bash --data-binary @- <<JSON { "video_url": "${VIDEO_SOURCE}", "sourceLanguage": "${SOURCE_LANGUAGE}", "targetLanguage": "${TARGET_LANGUAGE}", "show": ${SHOW}, "bilingual": ${BILINGUAL} } JSON ``` ### Technical Analysis `VIDEO_SOURCE` originates from the script's first command-line argument. When it begins with `http://` or `https://`, the value is interpolated directly into a JSON heredoc without JSON escaping or serialization. The URL validation only checks its scheme. It does not reject or encode quotation marks, backslashes, control characters, or newlines. A crafted value can therefore terminate the `video_url` string and inject additional JSON properties or make the request body syntactically invalid. For example, an input containing a quotation mark followed by additional JSON syntax could produce duplicate or attacker-selected request fields. Whether injected duplicate fields override the legitimate fields depends on the remote service's JSON parser. Even when property injection is not accepted, malformed JSON can reliably disrupt job submission. This is JSON injection rather than shell command injection. Shell metacharacters inside `VIDEO_SOURCE` are expanded as heredoc data and are not reevaluated as shell commands. ### Attack Path 1. An attacker supplies a crafted first argument that starts with `http://` or `https://` and contains JSON metacharacters. 2. The script classifies the argument as a remote video URL. 3. The crafted value is inserted verbatim between JSON quotation marks. 4. The generated request body becomes malformed or contains injected properties. 5. `curl` submits that body to `/video-trans/orchestrate` using the configured bearer token. 6. Depending on server-side parsing and validation, the re ...[truncated 661 chars]
Remediation
<![CDATA[ ## Remediation Suggestions Construct the request body with a JSON serializer instead of interpolating values into a heredoc. For example, use `jq`: ```bash REQUEST_BODY="$( jq -n \ --arg video_url "${VIDEO_SOURCE}" \ --arg sourceLanguage "${SOURCE_LANGUAGE}" \ --arg targetLanguage "${TARGET_LANGUAGE}" \ --argjson show "${SHOW}" \ --argjson bilingual "${BILINGUAL}" \ '{ video_url: $video_url, sourceLanguage: $sourceLanguage, targetLanguage: $targetLanguage, show: $show, bilingual: $bilingual }' )" SUBMIT_RESP="$( curl -sS -X POST "${BASE_URL}/video-trans/orchestrate" \ -H "Authorization: Bearer ${API_KEY}" \ -H "Content-Type: application/json" \ --data-binary "${REQUEST_BODY}" )" ``` Alternatively, use Python's `json` module, which is already listed as a runtime requirement, to serialize the complete object. Additional hardening should include: 1. Parse and validate the URL with a dedicated URL parser. 2. Permit only the intended `http` and `https` schemes. 3. Reject control characters in URL input. 4. Treat language and Boolean validation as defense in depth rather than as a substitute for JSON serialization. 5. Add tests using URLs containing quotation marks, backslashes, Unicode characters, and newlines to verify that generated request bodies remain valid JSON. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (9)

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The README clearly states that user-provided videos are sent to an external service, but it provides no warning about third-party transmission, retention, or privacy implications. Because videos often contain sensitive personal or proprietary content, lack of disclosure can lead to unintended data exposure and unsafe operator assumptions about where user data is processed.

Lp3

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding
The skill declares shell runtime requirements and operational steps that imply code/tool execution, but it does not explicitly constrain tool scope with permissions or allowed-tools. In an agent environment, that increases the chance the skill can invoke broader shell capabilities than intended, which can enable unsafe command execution paths or unreviewed network access.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The skill is built to send user-provided video files or URLs to a third-party service, but the user-facing description does not clearly warn that potentially sensitive media and linked content will leave the local system. This creates a privacy and data-handling risk because users may submit confidential videos or internal URLs without informed consent.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The instructions require defaulting targetLanguage to en whenever the user does not specify a target language. This imposes a language choice without asking the user or offering an opt-in, which is a natural-language policy concern under the language/locale rule.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
The default_prompt specifies `targetLanguage (zh/en, default en)`, which imposes English as the default output language unless the user explicitly requests otherwise. This is a natural-language locale policy issue because it forces a specific language without opt-in or offering a neutral user choice in the interaction.

Natural-Language Policy Violations

Medium
Confidence
92% confidence
Finding
Lines L115-L120 instruct the skill to route CN users to the default Chinese site and non-CN users to an English-locale URL. This imposes a locale decision based on geography rather than offering the user a language choice, which matches the language/locale policy violation criteria.

External Transmission

Medium
Category
Data Exfiltration
Content
echo "[2/4] Submit job"
if [[ "${VIDEO_SOURCE}" =~ ^https?:// ]]; then
  SUBMIT_RESP="$(curl -sS -X POST "${BASE_URL}/video-trans/orchestrate" \
    -H "Authorization: Bearer ${API_KEY}" \
    -H 'Content-Type: application/json' \
    --data-binary @- <<JSON
Confidence
70% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Natural-Language Policy Violations

Low
Confidence
88% confidence
Finding
The README instructs the skill to default to `en` if the user does not specify a target language. This imposes a specific language choice without user opt-in, which matches the language/locale policy violation criteria for natural-language instructions.

Missing User Warnings

Low
Confidence
84% confidence
Finding
The skill requires an API key in an environment variable and uses it for authorization to an external service, but the description does not clearly warn users that sensitive credentials are required and will be handled by the skill. Without that notice, operators may mismanage secrets, expose them in logs, or misunderstand the trust boundary around external authentication.

Static analysis

No suspicious patterns detected.