Back to skill

Security audit

lux3d

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its Lux3D 3D-generation purpose, but it needs review because it can redirect authenticated API requests to arbitrary servers while sending the user's Lux3D API key.

Install only if you trust the publisher and can control the runtime environment. Do not set LUX3D_BASE_URL or use --base-url unless it is an approved Lux3D endpoint, because an arbitrary endpoint could receive your API key. Use a virtual environment, consider pinning dependencies, and be careful with output paths because downloads can overwrite the selected file.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T09 · Insecure Skill Coding Practices

Error
Location
lux3d_client.py:90
Finding
Lux3D API Key Disclosure Through an Unrestricted Base URL Override<![CDATA[ ## Vulnerability Details **File Location**: `lux3d_client.py:90-109`, `lux3d_client.py:332-336`, `lux3d_client.py:387-392`, `lux3d_client.py:1047-1052` **Vulnerability Type**: Arbitrary authenticated API endpoint configuration **Risk Level**: High ### Vulnerable Code ```python def get_base_url(region=None): """Return the configured Lux3D API root.""" configured = os.environ.get("LUX3D_BASE_URL", "").strip() if configured: return normalize_base_url(configured, region) return REGION_BASE_URLS[normalize_region(region)] def normalize_base_url(base_url=None, region=None): """Normalize a custom base URL to the documented Lux3D API root.""" if not base_url: base_url = os.environ.get("LUX3D_BASE_URL", "").strip() if not base_url: return REGION_BASE_URLS[normalize_region(region)] normalized = str(base_url).strip().rstrip("/") if normalized == "https://api.aholo3d.com": return INTERNATIONAL_BASE_URL if normalized == CN_BASE_URL: return CN_BASE_URL return normalized ``` ```python def get_auth_headers(): """Build the Lux3D authentication headers.""" return { "Content-Type": "application/json", "Authorization": validate_api_key(), } ``` ```python def submit_task(path, payload, base_url=None, region=None): """Submit an asynchronous task and return its task ID.""" url = normalize_base_url(base_url, region) + path response = secure_request( "POST", url, headers=get_auth_headers(), data=payload ) ``` ```python parser.add_argument( "--base-url", default=None, help="Override the API root; LUX3D_BASE_URL is also supported.", ) ``` ### Technical Analysis The client permits the API root to be overridden through the `--base-url` command-line option, the `base_url` function argument, or the `LUX3D_BASE_URL` environment variable. `normalize_base_url()` does not validate the URL scheme or restrict the destination to ...[truncated 1910 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove arbitrary base URL overrides if they are not essential. 2. If overrides are required, allowlist exact approved origins, such as: - `https://api.aholo3d.com/global` - `https://api.aholo3d.cn` 3. Require HTTPS and reject URLs containing user information, fragments, unexpected ports, or unapproved hosts. 4. Compare parsed origins rather than performing string-prefix checks. 5. Construct authenticated request URLs only from trusted constants selected through the validated region setting. 6. Add a final origin check immediately before attaching the `Authorization` header. 7. Separate authenticated and unauthenticated request functions so credentials cannot be sent to arbitrary artifact or custom endpoints. 8. Add tests confirming that HTTP URLs, localhost, private IP addresses, lookalike domains, subdomains, and arbitrary external hosts are rejected. 9. Rotate any API key that may previously have been used with an untrusted `--base-url` or `LUX3D_BASE_URL` value. ]]>

T08 · Insecure Dependencies

Note
Location
SKILL.md:34
Finding
Unpinned Third-Party Dependency Installation<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:34-38` **Vulnerability Type**: Unpinned runtime dependency **Risk Level**: Low ### Vulnerable Code ```bash pip install requests ``` ### Technical Analysis The installation instructions retrieve `requests` without specifying a reviewed version or cryptographic hash. Package resolution therefore depends on the package index and metadata available when the command is executed. Although `requests` is a legitimate package, the instruction provides no reproducibility or integrity guarantee. A compromised package index, maliciously configured pip mirror, dependency compromise, or unexpectedly incompatible future release could cause unreviewed code to be installed and imported by the client. ### Attack Path 1. An attacker compromises or controls the pip index or mirror configured in the user's environment. 2. The user follows the documented installation command: ```bash pip install requests ``` 3. Pip resolves the package and transitive dependencies from the untrusted or compromised source without checking project-supplied hashes. 4. Malicious package content is installed into the user's Python environment. 5. The malicious code executes during installation or when `lux3d_client.py` imports `requests`. ### Impact Assessment The impact depends on the privileges used to run pip and the Python client. Malicious dependency code could read environment variables, including `LUX3D_API_KEY`, access files available to the current user, alter the Python environment, and perform network requests. If installation is performed with elevated privileges, the impact may extend to system-wide Python packages and files writable by that privileged account. Under normal user installation, the scope is generally limited to the user's account and accessible project data. ]]>
Remediation
<![CDATA[ ## Remediation Suggestions 1. Declare dependencies in a version-controlled requirements file. 2. Pin `requests` and all transitive dependencies to reviewed versions. 3. Include cryptographic hashes and install with: ```bash pip install --require-hashes -r requirements.txt ``` 4. Use a trusted, explicitly configured package index or an organization-managed package repository. 5. Run dependency vulnerability and provenance checks as part of continuous integration. 6. Regularly update pinned versions through a controlled review process rather than using unrestricted latest-version resolution. 7. Recommend installation in an isolated virtual environment without elevated privileges. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (8)

Direct Prompt Extraction

High
Category
System Prompt Leakage
Content
"""Validate a text-to-3D prompt."""
    if not isinstance(prompt, str) or not prompt.strip():
        raise ValueError("prompt must be non-empty text")
    return prompt.strip()


def validate_style(style):
Confidence
85% confidence
Finding
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Lp3

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding
The skill documentation describes capabilities that require environment-variable access and outbound network access, but it does not declare an explicit tool scope such as permissions or allowed-tools. This creates a governance gap: an agent/runtime may grant broader-than-necessary access or fail to enforce operator review for sensitive actions like using API keys and transmitting user-supplied URLs to a third-party service.

External Transmission

Medium
Category
Data Exfiltration
Content
CN_BASE_URL = "https://api.aholo3d.cn"
INTERNATIONAL_BASE_URL = "https://api.aholo3d.com/global"
REGION_BASE_URLS = {
    "cn": CN_BASE_URL,
    "international": INTERNATIONAL_BASE_URL,
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
CN_BASE_URL = "https://api.aholo3d.cn"
INTERNATIONAL_BASE_URL = "https://api.aholo3d.com/global"
REGION_BASE_URLS = {
    "cn": CN_BASE_URL,
    "international": INTERNATIONAL_BASE_URL,
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The client permits a caller or environment variable to override the API base URL, and authenticated requests always include the Lux3D API key in the Authorization header. That means anyone controlling invocation parameters or process environment can redirect traffic and credentials to an arbitrary host, expanding the skill beyond its stated Lux3D-only scope and enabling credential exfiltration or misuse.

Unbounded Resource Access

Medium
Category
Excessive Agency
Content
url,
    headers=None,
    data=None,
    timeout=None,
    retries=None,
    stream=False,
):
Confidence
75% confidence
Finding
Skill allows unbounded resource consumption (API calls, storage, compute). Without rate limits or quotas, a compromised or misbehaving agent can cause denial-of-service or cost overruns.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The download helper accepts any HTTP(S) URL and writes the response body directly to a caller-chosen local path. In an agent context, this can be abused to fetch non-Lux3D content and persist untrusted files locally, turning a service client into a generic remote downloader and increasing the risk of malicious file staging or overwriting expected outputs.

Missing User Warnings

Low
Confidence
82% confidence
Finding
This code performs a file download and writes arbitrary remote content to the user-supplied output path, but there is no confirmation prompt or user-facing log message when the write occurs. Although the function docstring describes the behavior for developers, the code path itself lacks runtime disclosure to the end user about creating or overwriting local files.

Static analysis

No suspicious patterns detected.