Back to skill

Security audit

8917 Minimax Toolkit

Security checks for vulnerabilities and agentic risk

Overview

This is a real MiniMax media-generation wrapper, but it needs review because it can upload sensitive media and write/download files without enough containment safeguards.

Install only if you are comfortable sending prompts, images, audio, and voice samples to MiniMax using your API key. Do not use voice cloning without clear permission from the speaker, and avoid untrusted project names or sensitive output locations until path and download validation are hardened.

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

Warning
Location
scripts/minimax_client.py:184
Finding

Unsanitized Project Name Allows Output-Directory Traversal

Content
View full analysis
Remediation
View remediation
str: if not project: raise ValueError("Project name cannot be empty") if Path(project).is_absolute(): raise ValueError("Absolute project paths are not allowed") if "/" in project or "\\" in project: raise ValueError("Project name must not contain path separators") if project in {".", ".."}: raise ValueError("Invalid project name") if not re.fullmatch(r"[A-Za-z0-9._-]+", project): raise ValueError("Project name contains unsupported characters") return project root = output_hub.expanduser().resolve() if project: project = validate_project(project) target_dir = (root / project / sub_folder).resolve() else: target_dir = (root / sub_folder).resolve() if target_dir != root and root not in target_dir.parents: raise ValueError("Output path escapes the configured output root") target_dir.mkdir(parents=True, exist_ok=True) ``` Where symbolic links inside the output tree are a concern, avoid following pre-existing symlinks or perform secure descriptor-based file creation appropriate to the target operating system. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
scripts/executor_common.py:20
Finding

Provider-Controlled Media URLs Are Downloaded Without Destination or Resource Validation

Content
View full analysis
bool: """Download content from URL and save to filepath.""" try: data = requests.get(url).content with open(filepath, 'wb') as f: f.write(data) return True except Exception as e: print(f"Download failed: {e}", file=sys.stderr) return False ``` The unified CLI also directly downloads a URL returned by the voice-cloning API: ```python if audio_url.startswith('http'): import requests resp = requests.get(audio_url, timeout=60) resp.raise_for_status() with open(filepath, 'wb') as f: f.write(resp.content) ``` A representative legacy wrapper performs the same operation without status or size checks: ```python img_data = requests.get(url).content with open(filepath, 'wb') as f: f.write(img_data) ``` ### Technical Analysis The URLs are obtained from authenticated MiniMax API responses rather than directly from ordinary command-line input. This substantially reduces direct exploitability, but the client still treats remote response values as trusted network destinations. The shared helper does not: - Restrict the URL scheme to HTTPS. - Restrict destinations to approved MiniMax or provider CDN hostnames. - Reject loopback, link-local, private, or otherwise sensitive network destinations. - Apply connection or read timeouts. - Call `raise_for_status()`. - Stream the response. - Limit the response size. - Validate the returned media type. The unified voice-clo ...[truncated 2279 chars]
Remediation
View remediation
max_bytes: raise ValueError("Download exceeds configured size limit") output.write(chunk) os.replace(temp_path, filepath) except Exception: if os.path.exists(temp_path): os.unlink(temp_ ...[truncated 148 chars]

T09 · Insecure Skill Coding Practices

Note
Location
scripts/mm.py:117
Finding

Offline Estimate Mode Unnecessarily Reads API Credentials

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (24)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The skill description promises a full multimodal generation toolkit, but the analyzed behavior appears centered on quota/remains checks and documentation validation rather than the declared end-user functionality. This mismatch is dangerous because security review, user consent, and runtime policy may be based on the declared purpose while the actual behavior performs different network/file operations, making unauthorized data handling or misleading execution paths harder to detect.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

Voice-clone audio samples and optional prompt audio are uploaded to a remote endpoint, but the code only mentions model-side deletion timing and does not clearly warn that biometric voice data is being transmitted off-host. Biometric data is especially sensitive; silent or under-disclosed upload can create serious privacy, consent, and regulatory exposure.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill advertises behavior that requires environment access, filesystem reads/writes, and network access, but it does not declare an explicit tool scope such as permissions or allowed-tools. This weakens least-privilege controls and can cause an agent runtime to grant broader capabilities than reviewers or users expect, especially since the skill handles API keys, uploads user media to a third party, and writes files to disk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The documentation explicitly exposes a voice-cloning workflow but provides no warning about consent, impersonation risk, or the biometric sensitivity of voice samples. In a multimodal generation toolkit, this omission can normalize unsafe use and materially increase the chance of privacy abuse, fraud, or non-consensual cloning by downstream users.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This markdown file includes suggested user-facing output entirely in Chinese, but does not indicate that the language should match user preference or be optional. That creates a natural-language locale policy concern because it implicitly forces a specific language on users.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This function sends the loaded MINIMAX API key in an Authorization header to a remote endpoint, which is a safety-relevant network operation involving credentials. The file contains no confirmation prompt, user-facing log, or explanatory comment/docstring warning that credentials will be used for an outbound request.

Content

No source excerpt is available for this finding.

Tainted flow: 'url' from requests.post (line 463, network input) → requests.get (network output)

Medium
Category
Data Flow
Confidence
93% confidence
Finding

The helper downloads arbitrary URLs returned by the remote service and writes the response body to disk without validating the destination host, content type, size, or using a timeout. If the upstream API or its responses are compromised, this can enable SSRF-like access from the agent environment, unexpected large downloads, or storage of malicious content in the workspace.

Content

Scanner excerpt · scripts/executor_common.py (reported line 23)May include surrounding context.

python
def _download_and_save(url: str, filepath: str) -> bool:
    """Download content from URL and save to filepath."""
    try:
        data = requests.get(url).content
        with open(filepath, 'wb') as f:
            f.write(data)
        return True

Tainted flow: 'data' from requests.get (line 23, network input) → requests.post (network output)

Medium
Category
Data Flow
Confidence
65% confidence
Finding

Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.

Content

Scanner excerpt · scripts/executor_common.py (reported line 44)May include surrounding context.

python
data = {"purpose": purpose} if purpose else None
    with open(file_path, "rb") as f:
        files = {"file": (os.path.basename(file_path), f)}
        resp = requests.post(
            f"{client.base_url}/files/upload",
            headers={"Authorization": f"Bearer {client.api_key}"},
            data=data,

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The image-to-image path converts a local reference image into a data URL and sends it to the remote service, but the function gives no explicit user-facing notice that local image content is being uploaded. In a multimodal tool that may process sensitive personal or proprietary images, 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
92% confidence
Finding

Template media files are encoded and sent to the external API without an explicit warning that local media content is leaving the machine. Because templates may involve personal photos or business assets, this is a real privacy/data-handling issue even if the transmission is functionally intended.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% 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/executor_common.py (reported line 397)May include surrounding context.

python
clone_data["text"] = preview_text
        clone_data["model"] = model or "speech-2.8-hd"

    resp = requests.post(
        f"{client.base_url}/voice_clone",
        headers={"Authorization": f"Bearer {client.api_key}", "Content-Type": "application/json"},
        json=clone_data,

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% 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/executor_common.py (reported line 428)May include surrounding context.

python
if voice_id:
        data["voice_id"] = voice_id

    resp = requests.post(
        f"{client.base_url}/voice_design",
        headers={"Authorization": f"Bearer {client.api_key}", "Content-Type": "application/json"},
        json=data,

Tainted flow: 'data' from requests.get (line 23, network input) → requests.post (network output)

Medium
Category
Data Flow
Confidence
65% confidence
Finding

Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.

Content

Scanner excerpt · scripts/executor_common.py (reported line 428)May include surrounding context.

python
if voice_id:
        data["voice_id"] = voice_id

    resp = requests.post(
        f"{client.base_url}/voice_design",
        headers={"Authorization": f"Bearer {client.api_key}", "Content-Type": "application/json"},
        json=data,

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

This code accesses sensitive credentials from MINIMAX_API_KEY and from ~/.openclaw/openclaw.json, then uses them to authenticate requests to external MiniMax endpoints. Although the code performs the operation as intended, there is no user-facing warning, prompt, or logging here disclosing that stored credentials will be read and transmitted.

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/minimax_client.py (reported line 22)May include surrounding context.

python
"MiniMax Token Plan API Key not found. Configure MINIMAX_API_KEY or add the MiniMax Token Plan key to ~/.openclaw/openclaw.json."
            )

        self.base_url = "https://api.minimaxi.com/v1"
        self.headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% 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/minimax_client.py (reported line 45)May include surrounding context.

python
def post(self, endpoint, data):
        url = f"{self.base_url}/{endpoint}"
        response = requests.post(url, headers=self.headers, json=data)
        return response.json()

    def get(self, endpoint):

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Several returned report strings are hard-coded in Chinese, which imposes a specific language on users without any opt-in or locale selection mechanism. Under the policy, fixed language behavior is a natural-language policy violation unless the skill offers a choice or clearly documents a justified regional constraint.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The budget and error reporting strings in this section are presented only in Chinese, again forcing a specific language for normal user interaction. There is no indication of a configurable locale or a documented region-specific limitation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The script downloads audio from a remote URL returned by the MiniMax API and immediately writes it to disk without any user-facing warning or confirmation that generated content will be fetched over the network and persisted locally. In this skill context, network transfer and local storage are expected functionality, but the lack of disclosure can still cause unintentional transmission of sensitive text and silent retention of generated media in the workspace.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The script prints a warning message only in Chinese, which imposes a specific language on users regardless of their locale or preferences. The file does not indicate that this skill is intended only for a Chinese-speaking or region-specific audience, nor does it offer an alternative language.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This output message is also exclusively in Chinese and does not provide an English or configurable alternative. That creates a language-policy issue because users may be unable to understand an operational warning affecting data handling and retention.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

This file primarily uses English, but includes a Chinese example utterance and a Chinese explanatory sentence without indicating that the skill is intentionally Chinese-specific or allowing user language choice. That can amount to an implicit language/locale constraint in natural-language guidance without documented opt-in or justification.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

This code downloads generated audio and writes it to a local MP3 file, but the only user-facing message is about generation, not that a file will be saved to disk at a computed path. For code files, file writes should have some visible disclosure unless already clearly warned elsewhere in code or documentation, and no such warning is present in this file before the write occurs.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

This code fetches remote content from a returned URL and saves it as an .mp4 on the local filesystem. While the CLI arguments imply video generation, there is no nearby disclosure, confirmation, or comment warning the user that the script will automatically download and write the resulting file to disk.

Content

No source excerpt is available for this finding.