Back to skill

Security audit

Studio Ghibli Image Filter

Security checks for vulnerabilities and agentic risk

Overview

This skill is a straightforward Media.io image-filter integration, but users should avoid sending private images or internal URLs to the external service.

Use this only with images and image URLs you are comfortable sending to Media.io. Do not submit sensitive, private, or internal-only URLs unless you have explicit authorization, keep MEDIAIO_API_KEY out of logs and chats, and have the agent stop polling after a reasonable timeout or retry limit.

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
SKILL.md:86
Finding

Unbounded Task-Result Polling Can Exhaust Resources and API Quota

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 86-102
Vulnerability Type: Unbounded polling and incomplete terminal-state handling
Risk Level: Medium

Vulnerable Code Snippet

markdown
- `data.status` can be one of the following values:
  - `waiting`: queued
  - `processing`: running
  - `completed`: completed successfully
  - `failed`: failed
  - `timeout`: timed out
- `data.reason`: provides additional context (e.g., `success` or error message)
- When status is `completed`:
  - `data.result` is an array of output objects with generated URLs
  - Each result object contains `val` (internal path), `preview` (public HTTPS URL), and `status` (completion status)

## Standard Invocation Flow
1. Call `user/credits` to verify balance.
2. Call `effects-ghibli` with `data.images` and optional `data.ratio`, `data.batch`.
3. Extract `task_id`.
4. Poll `generation/result/{task_id}` every 3 to 5 seconds.
5. Stop when status is `completed` or `failed`.
6. Return output URLs from `data.result` when `completed`.

Technical Analysis

The documented workflow requires polling every three to five seconds but provides neither a maximum attempt count nor an overall wall-clock deadline. Although the response contract explicitly identifies timeout as a possible task status, the invocation flow only treats completed and failed as terminal states.

Consequently, an implementing agent may continue sending authenticated requests when a task remains in waiting or processing, returns timeout, or produces an unexpected status. The guidance also does not specify termination behavior for repeated transport errors, malformed responses, or nonzero API response codes encountered during polling.

Attack Path

  1. A generation task is created and a valid task_id is returned.
  2. The upstream service or affected task continually reports waiting or processing, reports the documented but ...[truncated 970 chars]
Remediation
View remediation

Remediation Suggestions

  • Treat every documented terminal state, including timeout, as a stopping condition.
  • Set both a maximum polling-attempt count and an overall wall-clock deadline.
  • Replace fixed-interval polling with bounded exponential backoff and jitter, while respecting any server-provided Retry-After guidance.
  • Stop safely on unknown statuses rather than polling indefinitely, and return a clear diagnostic containing the non-sensitive trace_id.
  • Define strict limits for consecutive transport failures, malformed responses, and nonzero API response codes.
  • Allow cancellation by the caller and ensure cancellation immediately stops further requests.
  • Document explicit behavior such as: poll for no more than a configured duration, stop on completed, failed, or timeout, and fail closed on unsupported status values.
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 (3)

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: mediaio-ghibli-image-filter
description: Transform photos and images into Studio Ghibli-style artwork using AI via Media.io OpenAPI. Applies the iconic hand-drawn, painterly aesthetic of Ghibli films. Ghibli filter, Studio Ghibli style, photo to Ghibli, Ghibli AI.
metadata: {"openclaw": {"homepage": "https://platform.media.io/docs/", "requires": {"bins": ["curl"], "env": ["MEDIAIO_API_KEY"]}, "primaryEnv": "MEDIAIO_API_KEY"}}

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill instructs users to provide an image URL to a third-party API and later returns generated asset URLs, but it does not clearly warn that both the source image and generated outputs are transmitted to and potentially hosted by Media.io. This creates a privacy and data-handling risk because users may unknowingly submit sensitive images or internal URLs to an external service.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
83% confidence
Finding

The skill is explicitly designed to send data to Media.io over the network, including user-supplied image URLs and API-authenticated requests. In context this is expected functionality, but it still represents a real external transmission risk because potentially sensitive user data is disclosed to a third-party service.

Content

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

  1. Stop when status is completed or failed.
  2. Return output URLs from data.result when completed.

cURL Examples

Query Credits

bash

Static analysis

No suspicious patterns detected.