Back to skill

Security audit

MyReels API

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its MyReels API purpose, but it needs review because its shell helpers can execute config files and may send access tokens to a configurable endpoint.

Install only after reviewing the shell scripts. Prefer a pinned commit and project-local install, keep the access token limited, avoid sensitive prompts or regulated data, do not set MYREELS_BASE_URL to anything except the official HTTPS MyReels API unless using a separate test token, and treat ~/.myreels/config as trusted shell code until the skill switches to safe config parsing.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/_common.sh:57
Finding
Bearer Token Disclosure Through an Unrestricted API Base URL<![CDATA[ ## Vulnerability Details **File Location**: `scripts/_common.sh:7`, `scripts/_common.sh:57-66`, and `scripts/_common.sh:187-195` **Vulnerability Type**: Unrestricted credential destination / sensitive information exposure **Risk Level**: High ### Vulnerable Code ```bash MYREELS_BASE_URL="${MYREELS_BASE_URL:-https://api.myreels.ai}" ``` ```bash _myreels_url() { local path="$1" if [[ "$path" =~ ^https?:// ]]; then printf '%s\n' "$path" elif [[ "$path" == /* ]]; then printf '%s%s\n' "${MYREELS_BASE_URL%/}" "$path" else printf '%s/%s\n' "${MYREELS_BASE_URL%/}" "$path" fi } ``` ```bash if [[ "$auth_mode" != "none" && -n "${MYREELS_ACCESS_TOKEN:-}" ]]; then curl_args+=(-H "$(_myreels_auth_header)") fi if [[ -n "$body" ]]; then curl_args+=(-d "$body") fi http_code=$(curl "${curl_args[@]}" "$@" "$(_myreels_url "$path")" 2>"$err_file") || curl_status=$? ``` ### Technical Analysis Authenticated requests add `MYREELS_ACCESS_TOKEN` to the `Authorization` header without first verifying that the resolved destination is the official MyReels HTTPS origin. `MYREELS_BASE_URL` may be supplied through the environment or sourced configuration, and no scheme or hostname allowlist is enforced. Consequently, the token can be transmitted to an attacker-controlled host or over plaintext HTTP. Generation request bodies may also contain private prompts, source-media URLs, or other user-provided generation parameters and would be disclosed to the same destination. Allowing a configurable endpoint can be useful for development, but forwarding production credentials to an unrestricted destination exceeds the minimum privileges necessary for the declared functionality. ### Attack Path 1. An attacker influences the process environment or the MyReels configuration file. 2. The attacker sets `MYREELS_BASE_URL` to a host under their control, such as `http://attacker.example`. 3. The user or agent invokes `myreels-generate.sh`, `myreels-task-get.sh`, ...[truncated 710 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Require the resolved authenticated destination to use HTTPS. - Allowlist the exact production origin, such as `https://api.myreels.ai`, before adding the authorization header. - Reject URLs containing unexpected user information, ports, hosts, schemes, or redirects to untrusted origins. - If custom endpoints are required for development, place them behind an explicit opt-in flag and require a separate development token. - Configure `curl` so authenticated requests do not forward credentials across redirects to a different origin. - Resolve and validate the final URL immediately before constructing authentication headers. - Avoid sending production credentials whenever the destination cannot be conclusively verified. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/myreels-models.sh:65
Finding
Access Token Sent to an Endpoint Documented as Public<![CDATA[ ## Vulnerability Details **File Location**: `scripts/myreels-models.sh:65` and `scripts/_common.sh:187-188` **Vulnerability Type**: Unnecessary credential transmission / least-privilege violation **Risk Level**: Medium ### Vulnerable Code ```bash payload=$(myreels_get_optional_auth "/api/v1/models/api") myreels_require_api_ok "$payload" "Load models failed" || exit 1 ``` The optional-authentication helper ultimately applies this behavior: ```bash if [[ "$auth_mode" != "none" && -n "${MYREELS_ACCESS_TOKEN:-}" ]]; then curl_args+=(-H "$(_myreels_auth_header)") fi ``` ### Technical Analysis The project documentation states that `GET /api/v1/models/api` does not require authorization. Nevertheless, `myreels-models.sh` invokes `myreels_get_optional_auth`, which sends the access token whenever it is configured. Model discovery is also prescribed as the first step before building a request. This makes unnecessary token transmission routine rather than exceptional. The behavior increases credential exposure through web-server logs, reverse proxies, monitoring systems, and any incorrectly configured custom base URL. The request should use the existing unauthenticated `myreels_get_public` helper because authentication provides no required functionality for this endpoint. ### Attack Path 1. The user configures `MYREELS_ACCESS_TOKEN` for authenticated generation or task operations. 2. The agent follows the documented workflow and invokes `myreels-models.sh`. 3. Although model discovery is public, the helper detects the configured token and adds it to the request. 4. The token becomes available to every server, proxy, logging layer, or custom endpoint involved in that otherwise public request. 5. A party with access to one of those systems can recover and reuse the credential. ### Impact Assessment This flaw unnecessarily broadens the number of requests and infrastructure components exposed to the bearer token. When combined with a compromised proxy, ...[truncated 207 chars]
Remediation
<![CDATA[ ## Remediation Suggestions Replace the optional-authenticated request with the public request helper: ```bash payload=$(myreels_get_public "/api/v1/models/api") ``` Additionally: - Default every endpoint to unauthenticated operation unless authentication is explicitly required. - Maintain a small allowlist of paths authorized to receive bearer credentials. - Add an automated test confirming that model-discovery requests contain no `Authorization` header. - Ensure debug logs and diagnostics never print complete access tokens. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/_common.sh:4
Finding
Environment-Selected Configuration File Is Executed as Shell Code<![CDATA[ ## Vulnerability Details **File Location**: `scripts/_common.sh:4-5` **Vulnerability Type**: Arbitrary shell command execution through unsafe configuration loading **Risk Level**: Medium ### Vulnerable Code ```bash _MYREELS_CONFIG="${MYREELS_CONFIG:-$HOME/.myreels/config}" [[ -f "$_MYREELS_CONFIG" ]] && source "$_MYREELS_CONFIG" ``` ### Technical Analysis The configuration file is loaded with Bash `source`. This does not parse a restricted configuration format; it executes every command, substitution, function definition, redirection, and shell construct in the file with the privileges of the invoking user. The path is selected through `MYREELS_CONFIG`, so an attacker who can influence the environment can point the Skill at an arbitrary readable script. An attacker who can modify the default file can achieve the same result. No ownership, permission, regular-file, or symbolic-link validation occurs before execution. Although a user-owned configuration file is commonly trusted, arbitrary code execution is unnecessary when only `MYREELS_BASE_URL` and `MYREELS_ACCESS_TOKEN` values are required. ### Attack Path 1. An attacker creates a file containing malicious shell commands and apparently valid MyReels assignments. 2. The attacker sets `MYREELS_CONFIG` to that file, replaces the default configuration, or redirects it through a filesystem manipulation. 3. The user or agent invokes any bundled script that imports `_common.sh`. 4. `_common.sh` executes the attacker's file through `source` before processing the requested operation. 5. The malicious commands run with the current user's privileges and can access that user's files, environment variables, and network capabilities. ### Impact Assessment Successful exploitation provides arbitrary command execution as the user running the Skill. This can expose the MyReels token and other environment secrets, read or alter user-accessible files, execute additional programs, and make network requests. It d ...[truncated 134 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Do not execute configuration data with `source`. - Parse only an allowlist of supported keys, such as `MYREELS_BASE_URL` and `MYREELS_ACCESS_TOKEN`. - Reject command substitutions, shell metacharacters, functions, redirections, and unknown keys. - Require the configuration to be a regular file owned by the current user. - Reject symbolic links where feasible and verify that the file is not group- or world-writable. - Recommend restrictive permissions such as `0600` for files containing access tokens. - If environment-selected configuration paths remain supported, clearly treat them as trusted inputs and validate the resolved path before reading it. ]]>

T08 · Insecure Dependencies

Warning
Location
SKILL.md:211
Finding
Installation Instructions Use Mutable and Unpinned Supply-Chain Sources<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:211-215`; duplicate instruction at `references/code-examples.md:3-6` **Vulnerability Type**: Unpinned installer and mutable repository dependency **Risk Level**: Medium ### Vulnerable Code ```bash npx skills add https://github.com/myreelsai/skills --skill myreels-api -g ``` The reference documentation repeats the same command: ```bash npx skills add https://github.com/myreelsai/skills --skill myreels-api -g ``` ### Technical Analysis The installation command invokes `npx` without pinning the installer package to an audited version and retrieves Skill content from a mutable Git repository reference without specifying a commit. The command therefore does not guarantee that future users receive the same code that was audited. The `-g` option installs globally, increasing the scope and persistence of any compromised content. There is also no documented checksum, signature, or commit verification step. This is a supply-chain weakness rather than evidence that the current repository contains a remote-execution backdoor. Exploitation depends on compromise or malicious modification of the installer package, repository, account, or mutable default branch. ### Attack Path 1. An attacker compromises the package resolved by `npx`, the repository, a maintainer account, or the repository's mutable default branch. 2. The attacker publishes or commits modified Skill content. 3. A user follows the documented installation command after the compromise. 4. `npx` resolves the current installer and downloads the current repository state rather than an audited immutable revision. 5. The compromised content is installed globally and may execute when the Skill is subsequently loaded or invoked. ### Impact Assessment Impact depends on the behavior of the compromised installer or Skill revision. It could reach arbitrary code execution under the installing user's account, theft of environment credentials, modificat ...[truncated 171 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Pin the `npx` installer to a reviewed version rather than relying on the current registry resolution. - Pin the Git repository to a specific audited commit or signed release tag. - Publish and verify cryptographic checksums or signatures for released Skill artifacts. - Default to project-local installation and make global installation an explicit, documented choice. - Use lockfiles or equivalent integrity metadata where supported. - Document a verification command that confirms the downloaded commit and artifact digest before installation. - Establish release signing and protected-branch controls for the upstream repository. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Rogue AgentSelf-Modification, Session Persistence
Findings (33)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
This is a meaningful description-to-behavior mismatch. The declared purpose frames the skill as an operational MyReels API integration for generation, model inspection, task listing, and polling. The actual code chunk is instead a 'doctor' utility whose main function is environment validation: locating config, checking environment variables, confirming curl/jq installation, and probing `/api/v1/models/api` for reachability and expected JSON structure. While the network probe touches a declared resource related to model inspection, it is only a limited connectivity/sanity test, not the broader interactive functionality described. The code does not perform the core declared actions such as generating images/videos/speech/music, submitting tasks, listing authenticated user tasks, or polling status. Therefore the supplied code chunk's primary purpose is materially different from the declared description.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Content
If your runtime can access this endpoint, prefer the live response over any static model list.

### Cost Display Rule

Use `estimatedCost` as the final user-facing cost field.
Confidence
85% confidence
Finding
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Lp3

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding
The skill documents shell and network-capable behavior but does not declare any explicit tool scope such as allowed-tools or permissions. That weakens policy enforcement and increases the chance the agent can invoke broader capabilities than intended when handling external API calls and local shell scripts.

Vague Triggers

Medium
Confidence
89% confidence
Finding
The invocation text says to use this skill when the user wants to generate images, videos, speech, or music, and whenever the user mentions MyReels generation, model selection, task history, task polling, result URLs, or MyReels API integration. This is broad and lacks explicit exclusion conditions or narrower trigger boundaries, which could cause unintended activation for general conversation about media generation or APIs.

Session Persistence

Medium
Category
Rogue Agent
Content
## Prerequisites

- An active MyReels subscription is required for generation and task query endpoints.
- Create an AccessToken in [myreels.ai/developer](https://myreels.ai/developer).
- `GET https://api.myreels.ai/api/v1/models/api` was verified on March 18, 2026 and currently does not require `Authorization`.

Config file `~/.myreels/config`:
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.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
- `userInputSchema.<param>.default`
- `userInputSchema.<param>.options`

For natural-language requests such as "stronger motion" or "disable prompt extension", map user intent from `label` and `description`, not from field names alone.

### 2. List existing tasks when needed
Confidence
85% confidence
Finding
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Rp1

Medium
Category
MCP Rug Pull
Confidence
81% confidence
Finding
The install instruction uses an unpinned `npx skills` invocation, which can fetch whatever version is current at execution time. This creates supply-chain risk because behavior may change unexpectedly or a compromised upstream package version could be executed.

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.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The examples instruct users to send prompts, bearer tokens, task IDs, and retrieve account-linked task results from an external service, but they do not include an explicit privacy/security warning about what data leaves the local environment. In a skill context, this omission can cause users or downstream agents to transmit sensitive prompts or account metadata without informed consent.

External Transmission

Medium
Category
Data Exfiltration
Content
TOKEN = "YOUR_ACCESS_TOKEN"
MODEL = "nano-banana2"

resp = requests.post(
    f"https://api.myreels.ai/generation/{MODEL}",
    headers={"Authorization": f"Bearer {TOKEN}"},
    json={"prompt": "A cinematic portrait"},
Confidence
70% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
time.sleep(10)
```

#### cURL

```bash
curl -X POST "https://api.myreels.ai/generation/nano-banana2" \
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
The single source of truth for available models, parameter definitions, defaults, options, and field descriptions is:

`GET https://api.myreels.ai/api/v1/models/api`

Verified on March 18, 2026:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
The single source of truth for available models, parameter definitions, defaults, options, and field descriptions is:

`GET https://api.myreels.ai/api/v1/models/api`

Verified on March 18, 2026:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
The single source of truth for available models, parameter definitions, defaults, options, and field descriptions is:

`GET https://api.myreels.ai/api/v1/models/api`

Verified on March 18, 2026:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
The single source of truth for available models, parameter definitions, defaults, options, and field descriptions is:

`GET https://api.myreels.ai/api/v1/models/api`

Verified on March 18, 2026:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
The single source of truth for available models, parameter definitions, defaults, options, and field descriptions is:

`GET https://api.myreels.ai/api/v1/models/api`

Verified on March 18, 2026:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
The single source of truth for available models, parameter definitions, defaults, options, and field descriptions is:

`GET https://api.myreels.ai/api/v1/models/api`

Verified on March 18, 2026:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
The single source of truth for available models, parameter definitions, defaults, options, and field descriptions is:

`GET https://api.myreels.ai/api/v1/models/api`

Verified on March 18, 2026:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
The single source of truth for available models, parameter definitions, defaults, options, and field descriptions is:

`GET https://api.myreels.ai/api/v1/models/api`

Verified on March 18, 2026:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
The single source of truth for available models, parameter definitions, defaults, options, and field descriptions is:

`GET https://api.myreels.ai/api/v1/models/api`

Verified on March 18, 2026:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
The single source of truth for available models, parameter definitions, defaults, options, and field descriptions is:

`GET https://api.myreels.ai/api/v1/models/api`

Verified on March 18, 2026:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
The single source of truth for available models, parameter definitions, defaults, options, and field descriptions is:

`GET https://api.myreels.ai/api/v1/models/api`

Verified on March 18, 2026:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
The single source of truth for available models, parameter definitions, defaults, options, and field descriptions is:

`GET https://api.myreels.ai/api/v1/models/api`

Verified on March 18, 2026:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
The single source of truth for available models, parameter definitions, defaults, options, and field descriptions is:

`GET https://api.myreels.ai/api/v1/models/api`

Verified on March 18, 2026:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
The single source of truth for available models, parameter definitions, defaults, options, and field descriptions is:

`GET https://api.myreels.ai/api/v1/models/api`

Verified on March 18, 2026:
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Static analysis

No suspicious patterns detected.