Back to skill

Security audit

AISkinX护肤AI助手

Security checks for vulnerabilities and agentic risk

Overview

The skill appears intended to run locally for skincare advice, but its safety and capability claims are overstated and its file-validation code has review-worthy gaps.

Install only if you are comfortable reviewing a local-filesystem skill whose documentation is stronger than its implementation. Keep images inside the skill directory, avoid sensitive files, and treat the skincare analysis as mock or unverified unless the publisher provides a real analyzer and fixes the validation and dependency inconsistencies.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (2)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
api_utils_fixed.py:138
Finding

Fail-Open Fallback Permits File Access Outside the Skill Directory

Content
View full analysis
Tuple[bool, str]: """ Verify an image file path with strict path restrictions. """ try: # Check whether the path validator is available if not HAS_PATH_VALIDATOR: logger.warning("Path validator unavailable; using basic validation") return _basic_file_path_validation(file_path) # Get validator validator = get_validator() if validator is None: return False, "Path validator is not initialized; file path cannot be verified" ``` The fallback implementation does not enforce a trusted base directory: ```python def _basic_file_path_validation(file_path: str) -> Tuple[bool, str]: """ Basic file path validation used when the path validator is unavailable. """ try: # Check for path traversal if ".." in file_path or file_path.startswith("~"): return False, "Possible path traversal attack detected" # Resolve the absolute path abs_path = Path(file_path).resolve() # Check whether the file exists if not abs_path.exists(): return False, f"File does not exist: {file_path}" # Check whether the path is a file if not abs_path.is_file(): return False, f"Path is not a file: {file_path}" # Check file size max_size_mb = 50 file_size_mb = abs_path.stat().st_size / (1024 * 1024) if file_size_mb > max_size_mb: return False, ( f"File is too large: {file_size_mb:.2f} MB " f"(limit: {max_size_mb} MB)" ) # Check file extension allowed_extensions = { '.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff', ...[truncated 2880 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
api_utils_fixed.py:87
Finding

Base64 Image Size Limit Is Enforced Only After Full Allocation

Content
View full analysis
max_size: return False, ( f"Image data is too large: {len(image_bytes)} bytes " f"(limit: {max_size} bytes)" ) ``` The Base64 detector also processes the complete attacker-controlled string: ```python def _is_base64(text: str) -> bool: """Check whether a string is Base64 encoded.""" base64_pattern = r'^[A-Za-z0-9+/]*={0,2}$' if not re.match(base64_pattern, text): return False if len(text) % 4 != 0: return False try: base64.b64decode(text, validate=True) return True except: return False ``` ### Technical Analysis The intended decoded-image limit is 50 MB, but the code applies it only after decoding the entire attacker-controlled input. Moreover, `_is_base64` already decodes the complete value once to determine whether it is valid, after which `validate_image_data` decodes it a second time. Consequently, a large valid Base64 string can cause multiple large temporary allocations before the size check is reached. The `security.max_input_length` value in `config.yaml` is not enforced by this function. The issue is therefore exploitable as a memory-exhaustion denial of service. A Base64 value representing 50 MB of decoded data is approximately 66.7 MB before Python object overhead. A substantially larger request can consume memory during validation even though it is eventually rejected. ### Attack Path 1. An attacker ...[truncated 1050 chars]
Remediation
View remediation
max_encoded_size: return False, "Encoded image exceeds the size limit" ``` 2. **Avoid decoding twice.** Replace `_is_base64` with a single strict decoding operation after the preflight length check, then validate the resulting bytes. 3. **Enforce `security.max_input_length` at the command boundary** before dispatching attacker-controlled arguments. 4. **Apply host-level request limits** so oversized command payloads are rejected before being loaded into the Skill process. 5. **Consider incremental or streaming decoding** with a hard output-byte limit if large image inputs must be supported. 6. **Add resource-exhaustion tests** covering oversized Base64 values, malformed padding, concurrent submissions, and memory behavior near the configured limit. ]]>
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
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (71)

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
# 🧴 护肤AI技能 (Skincare AI Skill) - v1.0.4

基于AISkinHealth0827项目的完整护肤分析系统,提供皮肤分析、产品推荐和AI护肤咨询。

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
# 🧴 护肤AI技能 (Skincare AI Skill) - v1.0.4

基于AISkinHealth0827项目的完整护肤分析系统,提供皮肤分析、产品推荐和AI护肤咨询。

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 · path_validator.py (reported line 257)May include surrounding context.

python
test_paths = [
        './data/test.jpg',
        '../outside.txt',
        '/etc/passwd',
        'C:\\Windows\\system32'
    ]

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
81% confidence
Finding

This markdown file documents drag-and-drop file upload and real-time chat capabilities, which can affect user data and privacy, but it does not include any warning or disclosure about what happens to uploaded images or chat content. Under the markdown-specific SQP-2 criteria, descriptions of behaviors that may affect user data should include a warning or disclosure.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill documentation is written entirely in Chinese, including all usage and safety instructions, with no indication that users may choose another language or that the skill is region-specific. This creates a natural-language policy concern because it effectively imposes a specific language without user opt-in or documented justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This markdown file presents all release and operational instructions exclusively in Chinese, including the title, checklist items, release steps, and support guidance. Under the language/locale policy rule, forcing a single language without user opt-in or a documented region-specific justification is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This markdown file is natural-language content, and it appears to require Chinese comprehension throughout the release and installation instructions. Under the policy, forcing a specific language without user opt-in can be a locale/language policy violation, and no alternative language option or justification is provided in the file.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

This markdown file includes commands such as cache cleanup and later backup/restore and automatic data migration steps, which can affect user data or system state. While the release notes emphasize security and local execution, they do not clearly warn users about possible data loss, overwrite, or rollback implications of these operations.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The description says the skill understands '中文护肤问题', and the command examples and parameter values are entirely Chinese, but there is no opt-in choice for language or explanation that the skill is intentionally China/Chinese-specific. SQP-3 applies because the natural-language documentation imposes a specific language/locale without user choice or documented justification.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The documentation says the skill supports consultation history, saved conversations, backups, and restore operations, but it does not clearly warn users that sensitive skincare discussions and possibly image-derived results may persist locally. This can mislead privacy-conscious users into believing no data is retained because the document repeatedly emphasizes '100% local' and 'does not collect/upload user data,' which is not the same as non-persistence.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This code file contains natural-language documentation and operational messages entirely in Chinese, including the module docstring and later user-visible status/error strings, with no indication that the skill is intentionally China/Chinese-specific or that users can choose another language. The policy explicitly flags language or locale constraints that are imposed without opt-in.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The code claims to reject all URLs for a '100% local' skill, but _is_url() only matches ftp://, www., and bare-domain patterns, not common http:// or https:// URLs. As a result, HTTP(S) inputs can bypass the explicit URL rejection path and be treated as ordinary file-path strings, undermining the documented security model and potentially enabling unintended remote resource handling in downstream consumers.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The package description and author-facing branding are written in Chinese, and the manifest provides no indication that other languages are supported or that language choice is optional. For a general-purpose skill manifest, this can amount to an implicit language policy constraint without user opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This code file contains natural-language documentation and runtime output entirely in Chinese, including the main module docstring and later user-visible messages, with no indication that the skill is region-specific or that users can opt into this locale. Under the language/locale policy, forcing a specific language without user choice is a policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The returned validation messages such as file-not-found, unsupported type, and success responses are all hard-coded in Chinese, and the test/demo output is also Chinese-only. Because the file does not provide localization options or justify a Chinese-only audience, it forces a specific language on users.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This Python file contains natural-language descriptions, comments, command labels, and user-facing strings entirely in Chinese, including the top-level skill description and returned messages. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale restriction is explicitly documented and justified, which is not present here.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The module and class descriptions present the skill as an 'AI skin analysis system' running locally, which implies it actually analyzes provided image data. In _handle_analyze_skin, the code explicitly labels the output as simulated and returns fixed scores unrelated to the input, contradicting the stated behavior.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The configuration merge logic explicitly drops nested security.path_restriction settings, so the skill may claim path restrictions are active while failing to preserve the actual enforcement parameters from configuration. This creates a misleading security posture and can weaken or disable expected file access controls depending on how create_path_validator_from_config relies on the merged config.

Content

No source excerpt is available for this finding.

Ae2

Medium
Category
analysis-evasion
Confidence
90% confidence
Finding

Artifact content does not match its filename extension

Content

No source excerpt is available for this finding.

Ae2

Medium
Category
analysis-evasion
Confidence
90% confidence
Finding

Artifact content does not match its filename extension

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The upgrade guide instructs users to back up and restore configuration and data, which are data-affecting operations, but it does not warn that restore steps may overwrite existing state or should be validated before use. For markdown files, SQP-2 applies when potentially system- or data-impacting behaviors are described without warning.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

This markdown file is natural-language content, so locale-policy checks apply. The report consistently uses Chinese throughout and does not indicate that the skill is region-specific or that users may choose another language, which can amount to forcing a specific language without opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

The natural-language documentation is entirely in Chinese and the command examples use Chinese user inputs, with no indication that users may choose another language or that the skill is intentionally limited to a Chinese-speaking locale. Under the stated policy, forcing or implicitly requiring a specific language without opt-in can be a locale-policy issue.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: openclaw has 16 known advisory(ies) (CVE-2026-53846 (OpenClaw: Workspace .env npm_execpath could influence bundled runtime dependency); CVE-2026-32064 (OpenClaw's andbox browser noVNC observer lacked VNC authentication); CVE-2026-32006 (OpenClaw has a BlueBubbles group allowlist mismatch via DM pairing-store fallbac) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
83% confidence
Finding

The dependency on openclaw is specified as ">=2026.3.0", which permits installation of a wide range of future versions and does not guarantee exclusion of vulnerable releases. Because the dependency is associated with multiple advisories and the manifest does not pin to a known-safe version, builds may resolve to an affected package, creating supply-chain risk despite the manifest's claims about security and local-only behavior.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

This file contains natural-language comments entirely in Chinese, which can amount to a language-policy issue when the skill does not provide user opt-in or explain that it is intentionally region- or locale-specific. The applicable policy category covers natural-language content in any file type, including comments in dependency files.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.