Back to skill

Security audit

Poyo Happy Horse

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent PoYo video-generation integration, but its helper script uses a sensitive API key with weak safeguards and forwards arbitrary request files to a paid external API.

Review before installing or using the helper script. Use only trusted payload files, avoid submitting private prompts or media URLs unless you intend to share them with PoYo, consider replacing the curl helper with a safer implementation that validates the model and request schema, and avoid exposing POYO_API_KEY in command-line arguments or logs.

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

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/submit_happy_horse.sh:18
Finding

PoYo API Key Exposed Through Process Arguments

Content
View full analysis

Vulnerability Details

File Location: scripts/submit_happy_horse.sh, lines 18-20
Vulnerability Type: API credential exposure through command-line arguments
Risk Level: Medium

Vulnerable Code:

bash
curl -sS https://api.poyo.ai/api/generate/submit \
  -H "Authorization: Bearer ${POYO_API_KEY}" \
  -H 'Content-Type: application/json' \

Technical Analysis

The shell expands POYO_API_KEY before starting curl, placing the complete authorization header in the process argument vector. Depending on operating-system process visibility and monitoring configuration, the bearer token may be exposed through process inspection interfaces, diagnostic utilities, audit logs, crash reports, or process-monitoring agents.

The token is not hardcoded in the repository, and exploitation requires local process visibility or access to captured process metadata. However, this implementation conflicts with the documented requirement to treat the API key as a secret.

Attack Path

  1. An attacker obtains access to the same host or to a monitoring system that records process command lines.
  2. The attacker waits for a user or automation job to run submit_happy_horse.sh.
  3. While curl is active, or from previously collected telemetry, the attacker reads its argument vector.
  4. The attacker extracts the value following Authorization: Bearer.
  5. The attacker uses the stolen token to authenticate unauthorized requests to the PoYo API.

Impact Assessment

Successful exploitation discloses the privileges associated with the affected PoYo API key. The attacker could submit unauthorized generation jobs, consume account quota or funds, and access any API operations authorized for that credential. This issue does not itself grant local privilege escalation or arbitrary code execution; its scope is limited to the exposed API credential and the permissions assigned to it.

Remediation
View remediation

Remediation Suggestions

  • Do not pass bearer tokens directly as command-line argument values.
  • Supply the authorization header through a protected mechanism that does not expose the token in the process argument vector, such as a temporary curl configuration file with mode 0600.
  • Create temporary credential material with mktemp, apply restrictive permissions before writing the secret, and install a trap to remove it on normal exit, errors, and signals.
  • Ensure process-monitoring and diagnostic systems do not retain authorization headers.
  • Use narrowly scoped API credentials where supported and rotate the current key if process arguments may already have been collected.
  • Avoid printing commands or enabling shell tracing while credentials are in scope.

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/submit_happy_horse.sh:14
Finding

Unvalidated Payload Allows Authenticated Submission Outside the Declared Model Scope

Content
View full analysis

Vulnerability Details

File Location: scripts/submit_happy_horse.sh, lines 14-21
Vulnerability Type: Missing validation of an authenticated API request body
Risk Level: Medium

Vulnerable Code:

bash
: "${POYO_API_KEY:?POYO_API_KEY is required}"
payload_file="$1"

curl -sS https://api.poyo.ai/api/generate/submit \
  -H "Authorization: Bearer ${POYO_API_KEY}" \
  -H 'Content-Type: application/json' \
  --data @"${payload_file}"

Technical Analysis

The script's usage message states that the payload must be a PoYo request for the "happy-horse" model, but the script does not enforce that restriction. It forwards the supplied file verbatim to the authenticated submission endpoint without checking that:

  • The file contains valid JSON.
  • The top-level model value is exactly "happy-horse".
  • Required fields are present and correctly typed.
  • Only expected fields are included.
  • Parameter values and file size remain within reasonable limits.

Quoting "${payload_file}" prevents direct shell metacharacter injection through the filename. The issue is instead a trust-boundary failure: arbitrary request content is authenticated with the user's API key. Exploitation requires the attacker to influence the payload file or persuade an authorized user or automation process to submit it.

Attack Path

  1. An attacker creates or modifies a JSON payload consumed by the wrapper.
  2. The payload specifies another model, unintended options, excessive resource parameters, or other request content accepted by the shared PoYo endpoint.
  3. A user or automated process invokes submit_happy_horse.sh with that file while POYO_API_KEY is configured.
  4. The wrapper forwards the payload unchanged and authenticates it with the victim's key.
  5. PoYo processes any accepted operation under the victim's account and quota.

Impact Assessment

An attacker who can control the payload may cause authen ...[truncated 492 chars]

Remediation
View remediation

Remediation Suggestions

  • Parse the payload with a trusted JSON parser before submission.
  • Require the top-level model field to equal "happy-horse" exactly.
  • Validate the expected schema, including required fields, data types, permitted properties, URL schemes, and bounds for duration, resolution, and other resource-sensitive options.
  • Reject malformed JSON, unknown fields, oversized files, symbolic links where inappropriate, and payload files not controlled by the expected user or workflow.
  • Consider constructing the final request from individually validated inputs rather than forwarding an arbitrary JSON document.
  • Add curl --fail-with-body and explicit timeout controls so HTTP errors and stalled requests are handled predictably.
  • Require explicit confirmation for costly options, external callback URLs, or source-media URLs when payloads originate outside a trusted workflow.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (10)

Hidden Instructions

High
Category
Prompt Injection
Confidence
60% confidence
Finding

Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Content

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

md
---
name: poyo-happy-horse
description: Happy Horse video generation on PoYo / poyo.ai via `https://api.poyo.ai/api/generate/submit`; use for `happy-horse`, text-to-video, image-to-video, reference-driven short video, video edit planning, task submission, polling, and webhook integration.
metadata: {"openclaw":{"homepage":"https://poyo.ai/models/happy-horse","requires":{"bins":["curl"],"env":["POYO_API_KEY"]},"primaryEnv":"POYO_API_KEY"}}

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

Content-Type: application/json

text

Get API keys from <https://poyo.ai/dashboard/api-key>.

Recommended skill env var:

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

Text-to-Video Example

bash
curl --fail-with-body --request POST \
  --url "https://api.poyo.ai/api/generate/submit" \
  --header "Authorization: Bearer YOUR_API_KEY" \
  --header "Content-Type: application/json" \

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 3)May include surrounding context.

md
: "${POYO_API_KEY:?POYO_API_KEY is required}"
payload_file="$1"

curl -sS https://api.poyo.ai/api/generate/submit \
  -H "Authorization: Bearer ${POYO_API_KEY}" \
  -H 'Content-Type: application/json' \
  --data @"${payload_file}"

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

md
: "${POYO_API_KEY:?POYO_API_KEY is required}"
payload_file="$1"

curl -sS https://api.poyo.ai/api/generate/submit \
  -H "Authorization: Bearer ${POYO_API_KEY}" \
  -H 'Content-Type: application/json' \
  --data @"${payload_file}"

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

md
: "${POYO_API_KEY:?POYO_API_KEY is required}"
payload_file="$1"

curl -sS https://api.poyo.ai/api/generate/submit \
  -H "Authorization: Bearer ${POYO_API_KEY}" \
  -H 'Content-Type: application/json' \
  --data @"${payload_file}"

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

md
: "${POYO_API_KEY:?POYO_API_KEY is required}"
payload_file="$1"

curl -sS https://api.poyo.ai/api/generate/submit \
  -H "Authorization: Bearer ${POYO_API_KEY}" \
  -H 'Content-Type: application/json' \
  --data @"${payload_file}"

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

md
: "${POYO_API_KEY:?POYO_API_KEY is required}"
payload_file="$1"

curl -sS https://api.poyo.ai/api/generate/submit \
  -H "Authorization: Bearer ${POYO_API_KEY}" \
  -H 'Content-Type: application/json' \
  --data @"${payload_file}"

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

sh
: "${POYO_API_KEY:?POYO_API_KEY is required}"
payload_file="$1"

curl -sS https://api.poyo.ai/api/generate/submit \
  -H "Authorization: Bearer ${POYO_API_KEY}" \
  -H 'Content-Type: application/json' \
  --data @"${payload_file}"

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/submit_happy_horse.sh (reported line 18)May include surrounding context.

sh
: "${POYO_API_KEY:?POYO_API_KEY is required}"
payload_file="$1"

curl -sS https://api.poyo.ai/api/generate/submit \
  -H "Authorization: Bearer ${POYO_API_KEY}" \
  -H 'Content-Type: application/json' \
  --data @"${payload_file}"

Static analysis

No suspicious patterns detected.