Back to skill

Security audit

AI role play character image generation

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a real AuraShot image-generation skill, but it needs Review because it handles face photos and API keys with incomplete privacy disclosures and overbroad network destination controls.

Install only if you are comfortable sending face photos, target images, clothing/scene references, prompts, and an AuraShot API key through this skill. Get consent before using real-person photos, avoid untrusted custom base URLs or proxy settings, protect .aurashot.env, and treat generated/local avatar folders as sensitive personal data.

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/aurashot.py:83
Finding

Credentials and Sensitive Images Can Be Sent to an Arbitrary Host

Content
View full analysis
str: return (args.base_url or os.environ.get("AURASHOT_BASE_URL") or DEFAULT_BASE_URL).rstrip("/") ``` ```python def upload_file(file_path: Path, api_key: str, base_url: str = DEFAULT_BASE_URL) -> str: """Upload a local image via AuraShot /v1/uploads and return the public URL.""" body, boundary = encode_multipart("file", file_path) req = request.Request( f"{base_url}/v1/uploads", data=body, headers={ "Authorization": f"Bearer {api_key}", "Content-Type": f"multipart/form-data; boundary={boundary}", }, method="POST", ) opener = _build_url_opener() ``` ```python def make_request(method: str, url: str, api_key: str, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: body = json.dumps(payload).encode("utf-8") if payload is not None else None headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"} req = request.Request(url, data=body, headers=headers, method=method) opener = _build_url_opener() ``` ### Technical Analysis The API destination can be overridden through either the `--base-url` command-line option or the `AURASHOT_BASE_URL` environment variable. The value is only normalized by removing trailing slashes. The implementation does not enforce HTTPS, validate the hostname or port, or restrict the destination to an approved AuraShot origin. The selected base URL is then used for authenticated API requests and local image uploads. These requests include the AuraShot bearer token in the `Authorization` header. Upload requests also include the complete contents of the user-selected image, which may c ...[truncated 1735 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/aurashot.py:207
Finding

Image Downloads Retry with TLS Certificate Verification Disabled

Content
View full analysis
Remediation
View remediation

other

Warning
Location
SKILL.md:32
Finding

Public Biometric Upload Behavior Conflicts with the Claimed Local-Only Privacy Model

Content
View full analysis
str: """Upload a local image via AuraShot /v1/uploads and return the public URL.""" body, boundary = encode_multipart("file", file_path) req = request.Request( f"{base_url}/v1/uploads", data=body, headers={ "Authorization": f"Bearer {api_key}", "Content-Type": f"multipart/form-data; boundary={boundary}", }, method="POST", ) opener = _build_url_opener() try: with opener.open(req, timeout=120) as resp: raw = resp.read().decode("utf-8") ``` ### Technical Analysis The Skill's core workflow transmits local face images and other references to a remote upload service, which returns a public URL. This behavior is necessary for the remote image-generation service, but it conflicts with the unqualified statement that the API “stores nothi ...[truncated 1815 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (12)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README explicitly instructs users to upload real-person face photos to an external image-generation service and emphasizes identity preservation, but it provides no warning about privacy, biometric sensitivity, retention, third-party processing, or consent requirements. Because face images are sensitive biometric data and the skill is designed to preserve identity across generations, omission of these disclosures can lead users to submit personal or third-party data without understanding the risks.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill clearly expects access to environment variables, local file reads/writes, and outbound network use, but it does not declare a constrained tool scope such as permissions or allowed-tools. That leaves the agent with broader implicit capabilities than users or hosting platforms may realize, increasing the risk of unintended file access, secret exposure, or remote uploads beyond the narrow image-generation workflow.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill processes highly sensitive inputs—face images and local files—and the input rules state that local files are automatically uploaded to a remote API, but there is no prominent user warning or consent step. Because the skill is identity-preserving and supports real-person face workflows, silent or poorly disclosed uploads create meaningful privacy, biometric, and compliance risks.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The documentation instructs users to upload local images and then use publicly accessible HTTPS URLs for face and reference images, but it does not warn that these images may become externally reachable and may contain sensitive biometric or personal data. In a character-consistent face generation skill, this omission increases privacy risk because users are likely to submit portraits, ID-style photos, or other highly sensitive images without understanding exposure or retention implications.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill automatically uploads any user-supplied local image path to the remote AuraShot service after only a minimal stderr message, which may cause unintentional exfiltration of sensitive local files such as private photos or identity documents. In this skill's context, identity-preserving face workflows make the privacy impact more serious because the uploaded data is likely highly sensitive biometric content.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The manifest describes this skill as focused on character-consistent generation from a face reference, preserving identity across outfits, scenes, and styles. The code also exposes separate legacy workflows for virtual try-on and pose-change job submission/querying, which broaden the behavior into general aesthetic workflow orchestration not stated in the manifest.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The API examples for generation use Chinese prompt text, and the edit example does the same, which may imply a preferred or required language. The document does not state that prompts may be provided in any language or that Chinese is merely illustrative, creating a potential language/locale policy issue.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The edit endpoint example uses Chinese-only prompt text without indicating that other languages are supported or that the API is region-specific. That can be read as a language constraint without user opt-in.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

The skill’s purpose is to generate character-consistent images via AuraShot, but it also downloads remote output URLs and writes files locally when --output is provided. Local file persistence may be convenient, but it is a separate capability from image-generation itself and is not disclosed in the manifest description.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

If --output is provided, the script automatically creates directories and writes downloaded files locally. The code logs the download after it occurs, but the command descriptions do not clearly disclose that remote results will be persisted to disk, which is relevant for user data handling.

Content

No source excerpt is available for this finding.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Confidence
50% confidence
Finding

Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Content

Scanner excerpt · scripts/aurashot.py (reported line 298)May include surrounding context.

python
if args.workflow == "virtual_try_on":
        for flag, name in [("--product-image", "product_image"), ("--model-image", "model_image"), ("--scene-image", "scene_image")]:
            if not getattr(args, name, None):
                raise SystemExit(json.dumps({"error": f"virtual_try_on requires {flag}."}, ensure_ascii=False, indent=2))

        description_type = "custom" if args.description else "auto"

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The docstring and CLI help for the ID photo command include the fixed Chinese term '四合一' even though the rest of the interface is English. This imposes a locale-specific label without user opt-in or explanation, which may conflict with language or locale policy expectations.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.