Back to skill

Security audit

Ellya--OOTD

Security checks for vulnerabilities and agentic risk

Overview

The skill’s image-generation purpose is coherent, but it handles personal photos with under-scoped remote processing and persistent sensitive appearance profiling.

Install only if you are comfortable with personal or reference photos being sent to external AI providers and with derived style descriptions being saved locally. Avoid uploading third-party or sensitive images, verify any OpenClaw message target before sending media, and prefer restricting Minimax endpoints to trusted HTTPS provider domains.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/image_provider.py:177
Finding

Configurable API endpoints can expose bearer credentials and user images

Content
View full analysis
str: base_url = self._require_env("MINIMAX_BASE_URL").rstrip("/") parsed = urlparse(base_url) if not parsed.scheme or not parsed.netloc: raise RuntimeError(f"MINIMAX_BASE_URL is invalid: {base_url}") return base_url def _resolve_text_url(self) -> str: text_url = _normalize_env_value(os.environ.get("MINIMAX_TEXT_LLM_URL", "")) if text_url: parsed = urlparse(text_url) if not parsed.scheme or not parsed.netloc: raise RuntimeError(f"MINIMAX_TEXT_LLM_URL is invalid: {text_url}") return text_url.rstrip("/") return f"{self._resolve_base_url()}/anthropic" def _resolve_image_url(self) -> str: image_url = _normalize_env_value(os.environ.get("MINIMAX_IMAGE_URL", "")) if image_url: parsed = urlparse(image_url) if not parsed.scheme or not parsed.netloc: raise RuntimeError(f"MINIMAX_IMAGE_URL is invalid: {image_url}") return image_url return f"{self._resolve_base_url()}/v1/image_generation" ``` Reference images are serialized and included in the request: ```python def _prepare_reference(self, input_images: Optional[List[str]] = None) -> Optional[List[dict]]: if not input_images: return None refs = [] for img in input_images: if img.startswith("http") or img.startswith("data:"): refs.append({"type": "character", "image_file": img}) else: data_url = image_to_data_url(img) if data_url: refs.append({"type": "character", "image_file": data_url}) else: print(f"Failed to convert reference image to data URL: {img}") return refs or None ``` The API credentia ...[truncated 2908 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/image_provider.py:91
Finding

Provider-controlled image URLs allow server-side request forgery and unbounded downloads

Content
View full analysis
Remediation
View remediation

other

Warning
Location
ANALYSIS_PROMPT.md:7
Finding

Style learning collects and persistently stores excessive biometric and intimate physical attributes

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
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
Findings (21)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The README instructs users to upload reference photos for analysis and generation through external AI providers but does not warn that personal images may be transmitted to third-party services. Because the skill processes appearance photos and style references, this omission creates a meaningful privacy and consent risk involving biometric or highly personal data.

Content

No source excerpt is available for this finding.

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 · README.md (reported line 1)May include surrounding context.

md
---
name: Ellya
description: OpenClaw virtual companion skill. Use it to bootstrap runtime files (SOUL and base image), guide user personalization, learn and store style prompts from uploaded photos, generate selfies from user prompts or autonomous style strategy, and generate a multi-pose photo series from a selected image.
---

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: Ellya
description: OpenClaw virtual companion skill. Use it to bootstrap runtime files (SOUL and base image), guide user personalization, learn and store style prompts from uploaded photos, generate selfies from user prompts or autonomous style strategy, and generate a multi-pose photo series from a selected image.
---

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/genai_media.py (reported line 25)May include surrounding context.

python
from dotenv import load_dotenv

load_dotenv()  # Load .env from project root (or any parent dir)

from google import genai
from google.genai import types

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · scripts/image_provider.py (reported line 231)May include surrounding context.

python
max_prompt_len = MAX_MINIMAX_PROMPT_LENGTH
        prompt = (prompt or "").strip()
        if len(prompt) <= max_prompt_len:
            return prompt

        minimax_text_url = self._resolve_text_url()
        minimax_model = MINIMAX_TEXT_MODEL

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · scripts/image_provider.py (reported line 336)May include surrounding context.

python
max_prompt_len = MAX_MINIMAX_PROMPT_LENGTH
        prompt = (prompt or "").strip()
        if len(prompt) <= max_prompt_len:
            return prompt

        minimax_text_url = self._resolve_text_url()
        minimax_model = MINIMAX_TEXT_MODEL

Ssd 4

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill normalizes invasive, intimate analysis of bodies and faces through detailed instructions to inspect pores, body proportions, chest, buttocks, veins, moles, and other physiological details. In context, this materially increases the likelihood of sexualized or exploitative analysis, biometric profiling, and harassment-oriented use, especially because it pushes the model toward microscopic scrutiny without any limiting purpose or safety boundaries.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The prompt explicitly instructs the model to infer ethnicity and approximate age from an image, which are sensitive or protected attributes in many policy and compliance contexts. This creates privacy, profiling, and discrimination risks without any stated necessity, consent boundary, or safety constraint, and the surrounding prompt encourages highly confident biometric-style scrutiny.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The prompt explicitly instructs the model to 'Use English' with no indication that the user can choose another language or locale. This is a natural-language policy concern because it imposes a language constraint unconditionally rather than offering opt-in or documenting a justified regional requirement.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The README provides commands to send generated images to users via OpenClaw messaging but does not clearly warn operators that generated media will be transmitted to a recipient. Without an explicit notice and verification step, an operator or automated handler may send sensitive, mistaken, or non-consensual images to the wrong target.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README defines broad natural-language triggers such as "Take a selfie" and "Make a photo set," which can cause the skill to activate on ambiguous user messages without strong confirmation. In a skill that generates and sends images, unintended activation can lead to unexpected API use, unwanted content generation, and accidental delivery of media to users.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill instructs the agent to write and overwrite local files like SOUL.md and assets/base.<ext> based on runtime conditions and user uploads, without explicit confirmation before modifying existing files. In an agent runtime, silent file replacement can destroy prior state, replace trusted assets with attacker-controlled content, and create unsafe persistence from untrusted input.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill directs the system to analyze uploaded photos and persist derived style data into styles/<style_name>.md without any privacy disclosure, retention policy, or consent step. Persisting user-derived attributes from images can expose sensitive personal preferences or appearance-related inferences and creates unnecessary long-lived data that may be reused later without the user's awareness.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The markdown says to use series generation when the user says phrases like "give me a set of photos" or "different poses," which are common conversational requests and not narrowly tied to this skill's invocation context. The file does not provide exclusion conditions or negative examples to clarify when these phrases should not activate the behavior.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The file explicitly claims media sending should not occur here, yet still contains working code that can send files or messages externally via OpenClaw. This mismatch is dangerous because maintainers or skill orchestrators may assume no outbound transmission exists, while the code preserves a ready-to-call exfiltration path for local files or generated content.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/genai_media.py (reported line 174)May include surrounding context.

python
cmd += ["--message", message]

    try:
        subprocess.run(cmd, check=True)
        print("Sent via OpenClaw.")
    except FileNotFoundError:
        print("Warning: openclaw command not found. Skipping send.")

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The analysis flow sends user-supplied image content to an external AI provider, which may expose sensitive personal or biometric data without clear notice at the time of use. In a media-processing skill, users may reasonably expect local handling unless remote upload is prominently disclosed and consented to.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The series-generation flow uploads reference image content and extracted descriptions to an external model for scene classification and prompt generation without an explicit warning in the command path. Because these images may contain personal identity information, silent transmission increases privacy and compliance risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The analyze command takes a local image path, uploads the image to Gemini, and stores the returned style prompt, but the CLI does not clearly tell users that the image leaves the local environment. This is risky when images contain faces, documents, or other sensitive material because the upload occurs as part of a normal-looking local analysis command.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

The code sends the full user prompt to a configurable external endpoint (MINIMAX_TEXT_LLM_URL / MINIMAX_BASE_URL) for prompt optimization before image generation. Because the destination is environment-controlled and only minimally validated for scheme/netloc, sensitive user input can be exfiltrated to an unintended third-party or attacker-controlled service. In an agent skill context, prompts may contain confidential data, making this more dangerous than ordinary outbound API use.

Content

Scanner excerpt · scripts/image_provider.py (reported line 312)May include surrounding context.

python
for url in (f"{minimax_text_url}/v1/messages", f"{minimax_text_url}/messages", minimax_text_url):
            try:
                resp = requests.post(url, headers=http_headers, json=http_payload, timeout=60)
                resp.raise_for_status()
                data = resp.json()
                blocks = data.get("content", [])

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The template sets language to en-US as a default configuration value, which is a natural-language locale constraint. The file does not offer a user choice or explain that this skill is region-specific, so it may violate the policy against forcing a specific language or locale without opt-in.

Content

No source excerpt is available for this finding.