Back to skill

Security audit

Turn product images and campaign copy into polished seasonal promo posters.

Security checks for vulnerabilities and agentic risk

Overview

The skill is a real poster-generation workflow, but it handles the user's mew.design API key in ways that could expose it.

Review this skill carefully before installing. Use a low-privilege or newly created mew.design API key, rotate it if it may have appeared in logs, and do not let the agent change the validator base URL or upload private images to an unspecified third-party host without explicit consent.

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

Error
Location
scripts/validate_mew_design_key.py:19
Finding

API key can be transmitted to an arbitrary caller-controlled server

Content
View full analysis
argparse.Namespace: parser = argparse.ArgumentParser( description="Validate a mew.design API key using an auth-only probe request.", ) parser.add_argument("--api-key", required=True, help="mew.design API key to validate.") parser.add_argument("--base-url", default=DEFAULT_BASE_URL, help="Gateway base URL.") parser.add_argument("--timeout", type=int, default=30, help="Request timeout in seconds.") return parser.parse_args() def build_endpoint(base_url: str) -> str: normalized = base_url.rstrip("/") + "/" return urllib.parse.urljoin(normalized, "open/api/design/generate") def probe_key(endpoint: str, api_key: str, timeout: int) -> dict: request = urllib.request.Request( endpoint, data=b"{}", headers={ "Content-Type": "application/json", "x-api-key": api_key, "User-Agent": "curl/8.7.1", "Accept": "*/*", }, ``` ### Technical Analysis The validator accepts an unrestricted `--base-url`, constructs an endpoint from it, and sends the user-provided Mew API key in the `x-api-key` request header. It does not enforce HTTPS, validate the destination hostname, or restrict the endpoint to the declared Mew service at `api.mew.design`. Sending the credential to Mew is necessary for the advertised key-validation functionality. Allowing callers or agent instructions to redirect that credential to any server exceeds the minimum privileges required for the Skill. An attacker who can influence the command invocation can set `--base-url` to an attacker-controlled HTTP or HTTPS service. The validator will then deliver the API key to that service. The same credential-forwarding risk may arise if t ...[truncated 1289 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/validate_mew_design_key.py:20
Finding

API key is exposed through command-line arguments

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (13)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The manifest frames the skill as a poster-generation helper, but the body also performs credential collection/validation and external API interaction that are not clearly disclosed up front. This mismatch undermines informed consent and can lead users to reveal API keys or permit network actions they did not reasonably expect from the advertised capability.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill explicitly instructs use of shell commands, network calls, and local file output, but declares no corresponding tool scope or permissions. This creates hidden capability risk: an installer or user may believe the skill is a simple poster workflow while it can write files, transmit data externally, and execute commands without transparent declaration.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The description instructs users to say "Help me install this skill...", which includes the generic phrase "Help me install" and could collide with ordinary requests for installation assistance rather than uniquely targeting this skill. The file also lacks explicit exclusion conditions or negative examples in the top-level invocation description to narrow when this install intent should apply.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

Examples like "Help me install this ClawHub skill" and "Install this skill and then use it" are broad references that depend on unclear context and could match many unrelated conversations. Because the examples do not consistently require the exact skill name, they do not sufficiently constrain activation scope.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill collects and validates a user API key, which is credential handling beyond the simple poster-generation description and introduces secrecy and misuse risks. Credentials passed into loosely scoped skills can be exposed through logs, shell history, error output, or accidental reuse if handling rules are not tightly constrained.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The onboarding copy is prescribed entirely in Chinese and is presented as the text to use when the user lacks an API key, with no opt-in or alternative locale offered. This imposes a specific language on users and conflicts with the policy against forcing a locale without user choice.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill proposes uploading user-provided images to a third-party host to obtain a public URL, which expands data exposure beyond the primary design service. Even with a consent prompt, this introduces privacy, retention, and link-leakage risks for potentially sensitive marketing assets or unpublished product imagery.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The file specifies a fixed Chinese-language style-selection format for presenting options to the user, but does not say to adapt to the user's language. This is a natural-language locale constraint that is not justified or made optional.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

The hardcoded external endpoint confirms that skill operation depends on outbound network access to a third-party API. This is not inherently malicious, but it is security-relevant because it transfers user assets off-platform and should be explicitly permissioned and disclosed, especially when combined with credential collection.

Content

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

Then generate the image:

bash
curl -sS -X POST "https://api.mew.design/open/api/design/generate" \
  -H "Content-Type: application/json" \
  -H "x-api-key: USER_PROVIDED_KEY" \
  --data @/tmp/holiday-promo-body.json

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

The hardcoded external endpoint confirms that skill operation depends on outbound network access to a third-party API. This is not inherently malicious, but it is security-relevant because it transfers user assets off-platform and should be explicitly permissioned and disclosed, especially when combined with credential collection.

Content

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

Then generate the image:

bash
curl -sS -X POST "https://api.mew.design/open/api/design/generate" \
  -H "Content-Type: application/json" \
  -H "x-api-key: USER_PROVIDED_KEY" \
  --data @/tmp/holiday-promo-body.json

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The mandated privacy/consent explanation is provided only in Chinese even though it is a key user-facing disclosure. Because the skill does not offer a language choice or instruct adaptation to the user's language, it forces a specific locale during an important consent interaction.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The instruction string says to create the poster in Chinese unless the provided copy is clearly another language. This imposes a specific language choice by default rather than offering the user a language/locale option, which matches the policy-violation category for forced language selection.

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 · scripts/validate_mew_design_key.py (reported line 13)May include surrounding context.

python
import urllib.parse
import urllib.request

DEFAULT_BASE_URL = "https://api.mew.design/"


def parse_args() -> argparse.Namespace: