Back to skill

Security audit

Product Video Maker

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent wrapper for Pexo's hosted video service, but it handles API credentials in ways that could expose them or execute local config as shell code.

Review before installing. Use only a trusted Pexo endpoint, protect the API key, set restrictive permissions on ~/.pexo/config, avoid putting shell code in that file, and do not upload confidential product images or prompts unless you are comfortable sending them to Pexo's hosted backend.

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 (3)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/_common.sh:218
Finding

Configurable API base URL can disclose bearer credentials and user content

Content
View full analysis
"$err_file") || curl_status=$? else http_code=$(curl -sS \ --connect-timeout "$_PEXO_CONNECT_TIMEOUT" \ --max-time "$_PEXO_REQUEST_TIMEOUT" \ -X "$method" \ -H "$(_pexo_auth_header)" \ -H "Content-Type: application/json" \ -D "$header_file" \ -o "$body_file" \ -w '%{http_code}' \ "$@" \ "${PEXO_BASE_URL}${path}" 2>"$err_file") || curl_status=$? fi ``` The diagnostic script uses the same unvalidated destination: ```bash if [[ -n "${PEXO_BASE_URL:-}" && -n "${PEXO_API_KEY:-}" ]]; then tmp_body=$(mktemp) tmp_err=$(mktemp) http_code=$(curl -sS \ --connect-timeout 10 \ -H "Authorization: Bearer $PEXO_API_KEY" \ -H "Content-Type: application/json" \ -o "$tmp_body" \ -w '%{http_code}' \ "${PEXO_BASE_URL}/api/biz/projects?page_size=1" 2>"$tmp_err" || echo "000") ``` ### Technical Analysis `PEXO_BASE_URL` may come from the environment or the sourced configuration file. The scripts only verify that it is non-empty; they do not require HTTPS or verify that the destination belongs to ...[truncated 1692 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/_common.sh:7
Finding

Configuration files are executed as arbitrary shell code

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
README.md:9
Finding

Installation instructions use unpinned external dependencies

Content
View full analysis
Remediation
View remediation
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
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (29)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description presents a media-generation skill that turns product photos or a store URL into a finished product video. The supplied code does not create, edit, or render any video content, nor does it accept product photos or store URLs as described. Its sole purpose is to call a Pexo asset API endpoint, inspect the returned downloadUrl, and optionally download the referenced file into a local temp directory. This is a materially different primary purpose and exposes undeclared capability around asset retrieval and local file download. Therefore the description does not accurately represent the code's behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description promises a product-video generation workflow: take product photos or a store URL, upload/download assets, add motion/music/transitions, and return a finished marketing clip. The supplied code does something materially different: it validates message text for specially tagged asset IDs and asynchronously posts that message to an existing Pexo project chat endpoint. Its output is only a submission acknowledgement with a hint to poll project status later. While this could be a supporting component within a larger Pexo system, this code chunk alone does not implement the advertised primary purpose and instead exposes a different capability: chat submission to an existing project.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description says the skill creates product videos from images or a store URL. The actual code does not process images, download product photos, compose video, add music/transitions, or return any media output. Instead, it functions as a setup/troubleshooting utility for Pexo shell scripts, reading a local config file, checking installed commands, contacting the Pexo service, and validating API authentication. This is a materially different primary purpose and includes undeclared capabilities related to local environment inspection and credential validation.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description promises a content-generation workflow: ingest product images or a store URL, compose a product video, add motion/music/transitions, and return a publish-ready clip. The supplied code does none of that. Its sole purpose is to fetch the authenticated user's plan and credit balance from an entitlements endpoint and optionally print instructions for buying more credits when the balance is zero. This is a materially different primary purpose and exposes an undeclared capability around account/quota inspection. Therefore, the description does not accurately represent the code's behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description promises an end-to-end product-video creation capability from images or a store URL. The actual code chunk is much narrower: it simply creates a blank Pexo project and returns its ID. While project creation could be a supporting step in a larger workflow, this code alone does not implement the core advertised behavior and therefore materially differs from the declared primary purpose.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is for a user-facing media-generation skill that turns product photos or a store URL into a finished product video. The supplied code does not perform content ingestion or video generation. Instead, it acts as an internal project-status retrieval/orchestration utility: it calls Pexo project and history APIs, strips status fields, simplifies message history, and derives a next action for an agent. This is a materially different primary purpose and exposes undeclared capability around project state/history retrieval and workflow orchestration. Therefore the description does not accurately represent the code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

There is a clear description-behavior mismatch. The declared purpose is a content-generation workflow for turning product photos or a store URL into a product video. The actual code only implements project enumeration with pagination for an authenticated user. That is a materially different primary purpose and capability from video creation. While listing projects could be related to the same platform, it is not a supporting detail of the claimed function in this code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The declared purpose centers on an end-user workflow for generating e-commerce product videos from photos or a store URL. The actual code only implements an asset-upload utility: it validates a local file, gets an upload credential, uploads the file to storage, finalizes the asset in a Pexo project, and prints the asset ID. While uploading source media could be a supporting step in a larger video-generation pipeline, this code chunk by itself lacks the core advertised behavior and includes broader generic media upload capability. Therefore the description materially overstates what the supplied code actually does.

Content

No source excerpt is available for this finding.

Context Leakage

High
Category
Data Exfiltration
Confidence
85% confidence
Finding

Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Content

Scanner excerpt · references/TROUBLESHOOTING.md (reported line 125)May include surrounding context.

md
- `400`: the file was rejected — possible reasons: file exceeds the size limit, file format is not supported, or the file content does not match its extension. Convert or compress the file and re-upload from scratch using `pexo-upload.sh`.
- `401`: auth failure — see Auth and Proxy Errors above.
- `404`: the file record was not found. The upload session may have been cleaned up. Re-upload from scratch using `pexo-upload.sh`.
- `412`: the upload session has already expired or been completed. Re-upload from scratch using `pexo-upload.sh`.
- `500`: an unexpected server error occurred. Retry in a moment; if the problem persists, contact support at pexo.ai.

Context Leakage

High
Category
Data Exfiltration
Confidence
85% confidence
Finding

Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Content

Scanner excerpt · references/TROUBLESHOOTING.md (reported line 126)May include surrounding context.

md
- `400`: the file was rejected — possible reasons: file exceeds the size limit, file format is not supported, or the file content does not match its extension. Convert or compress the file and re-upload from scratch using `pexo-upload.sh`.
- `401`: auth failure — see Auth and Proxy Errors above.
- `404`: the file record was not found. The upload session may have been cleaned up. Re-upload from scratch using `pexo-upload.sh`.
- `412`: the upload session has already expired or been completed. Re-upload from scratch using `pexo-upload.sh`.
- `500`: an unexpected server error occurred. Retry in a moment; if the problem persists, contact support at pexo.ai.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README says product photos are uploaded and that all creative work happens server-side, but it does not clearly warn users that their images and related content are transmitted to a hosted third-party backend. In a product-media workflow, images may contain unreleased products, branding, metadata, or other sensitive business material, so lack of disclosure can lead to unintentional data exposure.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

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 · README.md (reported line 15)May include surrounding context.

Configure

Create ~/.pexo/config:

text
PEXO_BASE_URL="https://pexo.ai"

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
73% confidence
Finding

The skill persists and reuses a remote project context across turns and explicitly tells the agent to send the user's request verbatim and continue the same project for revisions. That persistent session can carry forward prior user content, uploaded assets, and backend state in ways that may surprise users, increasing the risk of unintended disclosure, cross-request confusion, or acting on stale context if project IDs are mixed up.

Content

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

md
images and relay the request to the hosted Pexo agent, then deliver the result — Pexo composes
the shots, motion, and music.

## Your role: relay, don't create

Create a project, send the user's request **verbatim**, poll, deliver. Pexo's backend handles
all creative work — scriptwriting, model choice, prompts, music. Adding your own direction

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill instructs the agent to download content from user-provided links without any safety constraints, validation, or warning. In an agentic shell/network context, this can enable SSRF-like access to internal resources, fetching of malicious payloads, or retrieval of sensitive third-party data that the user should not cause the agent to access blindly.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
89% confidence
Finding

The instructions establish persistent local storage of a bearer credential in ~/.pexo/config, which increases exposure duration compared with ephemeral entry. Persistent session/API material can be recovered later by malware, other local users, backup systems, or accidental disclosure, enabling unauthorized API access until the key is rotated.

Content

Scanner excerpt · references/SETUP-CHECKLIST.md (reported line 7)May include surrounding context.

Quick Start

1. Create config file

bash
mkdir -p ~/.pexo

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The setup instructions direct users to store a live API key in a plaintext file under their home directory without any warning about credential sensitivity, file permissions, or safer alternatives. If that file is readable by other local users, accidentally backed up, synced, or exposed through logs/support bundles, the key could be stolen and used to access the Pexo account and consume credits or access associated data.

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 · references/TROUBLESHOOTING.md (reported line 181)May include surrounding context.

md
- `403`: the download link has expired. Re-run `pexo-asset-get.sh` to get a fresh link.
- `000`: network request failed before receiving a response. Check network connectivity and retry.
- local filesystem write failure: the temp directory (`~/.pexo/tmp/`) is not writable or the disk is full. Free up space or set `PEXO_TMP_DIR` to a writable path.

Notes:

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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 · scripts/_common.sh (reported line 228)May include surrounding context.

sh
err_file=$(mktemp)

  if [[ -n "$body" ]]; then
    http_code=$(curl -sS \
      --connect-timeout "$_PEXO_CONNECT_TIMEOUT" \
      --max-time "$_PEXO_REQUEST_TIMEOUT" \
      -X "$method" \

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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 · scripts/_common.sh (reported line 241)May include surrounding context.

sh
err_file=$(mktemp)

  if [[ -n "$body" ]]; then
    http_code=$(curl -sS \
      --connect-timeout "$_PEXO_CONNECT_TIMEOUT" \
      --max-time "$_PEXO_REQUEST_TIMEOUT" \
      -X "$method" \

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code performs outbound network requests using curl and automatically includes the bearer token from PEXO_API_KEY in the Authorization header, but there is no user-facing prompt or runtime notice before transmission. Although the file comments mention shared auth handling, they do not clearly warn users that invoking helper functions sends authenticated requests and may transmit request bodies to the configured remote service.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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 · scripts/_common.sh (reported line 335)May include surrounding context.

sh
set +o pipefail
  if [[ -n "$body" ]]; then
    curl -sS -N \
      --connect-timeout "$_PEXO_CONNECT_TIMEOUT" \
      --max-time "$timeout" \
      -X POST \

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 · scripts/pexo-doctor.sh (reported line 79)May include surrounding context.

sh
source "$config_path"
else
  echo "$FAIL Config file not found: $config_path"
  echo "  Create it with:"
  echo '  mkdir -p ~/.pexo && cat > ~/.pexo/config << EOF'
  echo '  PEXO_BASE_URL="https://pexo.ai"'
  echo '  PEXO_API_KEY="sk-<your-api-key>"'

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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 · scripts/pexo-upload.sh (reported line 83)May include surrounding context.

sh
[[ -n "$storage_path" && "$storage_path" != "null" ]] || { echo "Error: upload credential missing storagePath" >&2; echo "$cred" >&2; exit 1; }

# Phase 2: upload file
http_code=$(curl -sS -X PUT -H "Content-Type: $mime_type" \
  --data-binary "@$filepath" -o /dev/null -w '%{http_code}' "$upload_url" 2>/dev/null || echo "000")

[[ "$http_code" =~ ^2 ]] || { echo "Error: upload failed with HTTP $http_code" >&2; exit 1; }

Static analysis

No suspicious patterns detected.