Back to skill

Security audit

Poyo Image Translator

Security checks for vulnerabilities and agentic risk

Overview

This skill is a clear PoYo image-translation API helper, with expected external submission behavior and explicit safeguards before live API calls.

Install only if you intend to use PoYo's hosted image translator. Keep POYO_API_KEY server-side, confirm before any live API call, and pass only reviewed JSON payload files containing public image URLs or data you are comfortable sending to PoYo.

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/submit_image_translator.sh:9
Finding

Unvalidated File Path Allows Arbitrary Local File Submission

Content
View full analysis

Vulnerability Details

File Location: scripts/submit_image_translator.sh, lines 9–16
Vulnerability Type: Unrestricted local file upload to an external service
Risk Level: Medium

bash
payload_file="$1"

curl --fail-with-body --request POST \
  --url "https://api.poyo.ai/api/generate/submit" \
  --header "Authorization: Bearer ${POYO_API_KEY}" \
  --header "Content-Type: application/json" \
  --data @"${payload_file}"

Technical Analysis

The script accepts an unrestricted path as its only argument and supplies that path directly to curl using --data @file. It does not verify that the path identifies a regular JSON file, reject symbolic links, constrain the file to an approved directory, or validate its contents against the expected image-translator request schema.

Consequently, any readable local file can be selected as the HTTP request body. Although the remote API may reject content that is not valid JSON, curl transmits the content before the server validates it. This creates a local-file disclosure primitive when an attacker or untrusted automation can influence the script argument.

The bearer token is also interpolated into curl's command-line arguments. Depending on operating-system process visibility and isolation settings, another local user or process may be able to observe the authorization header while curl is running.

Attack Path

  1. A user or automated agent invokes the submission script in an environment containing a valid POYO_API_KEY.
  2. An attacker, untrusted instruction, or compromised workflow controls or influences the script's file-path argument.
  3. The attacker supplies the path of a sensitive file readable by the invoking account, including a path reached through a symbolic link.
  4. The script performs no file-type, path, or JSON-schema validation.
  5. Curl reads the selected file and transmits its contents to https://api.poyo.ai/api/generate/submit.
  6. The ...[truncated 741 chars]
Remediation
View remediation

Remediation Suggestions

  1. Resolve the supplied path to its canonical form and require it to reside inside a dedicated, trusted payload directory.
  2. Require a regular file and reject symbolic links, device files, named pipes, and other special file types.
  3. Parse the file with a trusted JSON parser before transmission and reject malformed content.
  4. Validate the complete request schema, including:
    • An exact model value of poyo-ai/image-translator.
    • An input object containing only supported fields.
    • A bounded image_urls array.
    • Valid source and target language values.
    • An optional callback URL using an approved scheme and, where appropriate, an allowlisted destination.
  5. Prefer constructing the JSON request internally from individually validated parameters rather than accepting an arbitrary file path.
  6. Apply a conservative payload-size limit before reading or transmitting the file.
  7. Avoid placing the bearer token directly in process arguments where the platform permits safer alternatives, such as a permission-restricted temporary curl configuration or an HTTP client that sets headers internally.
  8. Ensure any temporary credential-bearing file is created with restrictive permissions, is not logged, and is securely removed after use.
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 (12)

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-image-translator
description: Image Translator on PoYo / poyo.ai via `https://api.poyo.ai/api/generate/submit`; use for `poyo-ai/image-translator`, translating text inside images, `image_urls`, `source_language`, `target_language`, async status polling, callbacks, and server-side integration.
metadata: {"openclaw":{"homepage":"https://poyo.ai/models/image-translator","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 18)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 47)May include surrounding context.

Submission 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
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_image_translator.sh (reported line 13)May include surrounding context.

sh
payload_file="$1"

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

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This shell script posts the contents of the provided JSON payload file to a remote API using curl. While the command is visible in code, there is no confirmation prompt, user-facing notice, or explanatory comment indicating that local file contents will be transmitted off-system, which matches the missing disclosure criterion for code files.

Content

No source excerpt is available for this finding.

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
payload_file="$1"

curl --fail-with-body --request POST \
  --url "https://api.poyo.ai/api/generate/submit" \
  --header "Authorization: Bearer ${POYO_API_KEY}" \
  --header "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
payload_file="$1"

curl --fail-with-body --request POST \
  --url "https://api.poyo.ai/api/generate/submit" \
  --header "Authorization: Bearer ${POYO_API_KEY}" \
  --header "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
payload_file="$1"

curl --fail-with-body --request POST \
  --url "https://api.poyo.ai/api/generate/submit" \
  --header "Authorization: Bearer ${POYO_API_KEY}" \
  --header "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 48)May include surrounding context.

md
payload_file="$1"

curl --fail-with-body --request POST \
  --url "https://api.poyo.ai/api/generate/submit" \
  --header "Authorization: Bearer ${POYO_API_KEY}" \
  --header "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 81)May include surrounding context.

md
payload_file="$1"

curl --fail-with-body --request POST \
  --url "https://api.poyo.ai/api/generate/submit" \
  --header "Authorization: Bearer ${POYO_API_KEY}" \
  --header "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_image_translator.sh (reported line 14)May include surrounding context.

sh
payload_file="$1"

curl --fail-with-body --request POST \
  --url "https://api.poyo.ai/api/generate/submit" \
  --header "Authorization: Bearer ${POYO_API_KEY}" \
  --header "Content-Type: application/json" \
  --data @"${payload_file}"

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The script requires an API key from the POYO_API_KEY environment variable and then uses it in an Authorization header for a network request. There is no user-facing disclosure or explanatory comment about accessing this credential or using it for remote authentication.

Content

No source excerpt is available for this finding.