Back to skill

Security audit

Minimax API

Security checks for vulnerabilities and agentic risk

Overview

The skill does what it claims, but its image client can upload arbitrary local files or fetched internal URLs to MiniMax without strong limits or consent checks.

Install only if you are comfortable sending prompts, search queries, and selected image contents to MiniMax. Do not give it sensitive local file paths, private intranet URLs, metadata-service URLs, screenshots containing secrets, or confidential documents unless you intend to upload them. Prefer a revised version that reads the API key from a safer source, validates actual image files, blocks private/internal URLs, enforces size limits, and asks before uploading local files.

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

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/minimax_image.py:42
Finding

Unrestricted Local File Upload to an External API

Content
View full analysis
str: """Read local image file and return base64 data URL.""" if not os.path.exists(path): # Try expanding path for Windows paths like D:\... if sys.platform == 'win32' and ':' in path: # Try as-is pass print(f"Error: File not found: {path}", file=sys.stderr) sys.exit(1) # Detect format from extension lower_path = path.lower() if lower_path.endswith('.png'): fmt = 'png' elif lower_path.endswith('.webp'): fmt = 'webp' elif lower_path.endswith('.jpg') or lower_path.endswith('.jpeg'): fmt = 'jpeg' else: fmt = 'jpeg' # default try: with open(path, 'rb') as f: image_data = f.read() b64_data = base64.b64encode(image_data).decode('utf-8') return f"data:image/{fmt};base64,{b64_data}" except IOError as e: print(f"Error reading file: {e}", file=sys.stderr) sys.exit(1) def process_image_url(image_url: str) -> str: """ Process image input and convert to base64 data URL. Handles: - HTTP/HTTPS URLs: downloads and converts to base64 - Local file paths: reads file and converts to base64 - Base64 data URLs: passes through as-is """ if image_url.startswith('data:'): # Already a data URL return image_url elif image_url.startswith(('http://', 'https://')): return download_image_as_base64(image_url) else: # Local file path return local_file_to_base64(image_url) def call_vlm_api(api_key: str, prompt: str, image_url: str) -> dict: """Call MiniMax VLM API.""" # Process image (convert to base64 if needed) processed_image_url = proces ...[truncated 2477 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/minimax_image.py:18
Finding

Server-Side Request Forgery and Internal Resource Exfiltration

Content
View full analysis
str: """Download HTTP/HTTPS image and return base64 data URL.""" try: with urllib.request.urlopen(url, timeout=30) as response: image_data = response.read() content_type = response.headers.get('Content-Type', 'image/jpeg').lower() # Detect format if 'png' in content_type: fmt = 'png' elif 'webp' in content_type: fmt = 'webp' elif 'jpeg' in content_type or 'jpg' in content_type: fmt = 'jpeg' else: fmt = 'jpeg' # default b64_data = base64.b64encode(image_data).decode('utf-8') return f"data:image/{fmt};base64,{b64_data}" except urllib.error.URLError as e: print(f"Error downloading image: {e}", file=sys.stderr) sys.exit(1) def process_image_url(image_url: str) -> str: """ Process image input and convert to base64 data URL. Handles: - HTTP/HTTPS URLs: downloads and converts to base64 - Local file paths: reads file and converts to base64 - Base64 data URLs: passes through as-is """ if image_url.startswith('data:'): # Already a data URL return image_url elif image_url.startswith(('http://', 'https://')): return download_image_as_base64(image_url) else: # Local file path return local_file_to_base64(image_url) def call_vlm_api(api_key: str, prompt: str, image_url: str) -> dict: """Call MiniMax VLM API.""" # Process image (convert to base64 if needed) processed_image_url = process_image_url(image_url) url = "https://api.minimaxi.com/v1/coding_plan/vlm" ...[truncated 2485 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/minimax_image.py:130
Finding

MiniMax API Key Exposed Through Image Client Command-Line Arguments

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/minimax_search.py:88
Finding

MiniMax API Key Exposed Through Search Client Command-Line Arguments

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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (8)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger list includes broad phrases such as "look up" and "search the web for," which can cause the skill to activate in routine conversation without sufficiently clear user intent for external web access. This increases the chance of unintended network actions and data disclosure through overbroad invocation, especially in environments where tool use should be narrowly scoped.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill explicitly supports absolute local file paths for image analysis but does not clearly warn that those files may be uploaded to MiniMax's external API. A user could provide sensitive local documents, receipts, or screenshots assuming analysis is local, resulting in unintended exfiltration of private data to a third party.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The spec documents that image inputs may be provided as external URLs or base64 data and sent to the MiniMax API, but it does not warn users that potentially sensitive image contents will leave the local environment and be transmitted to a third-party service. In an agent skill context, this omission can cause unintentional disclosure of screenshots, documents, or embedded secrets because users or downstream implementers may assume image handling is local.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The search endpoint description explains how to submit queries but does not clearly warn that search terms are transmitted to an external search service. In a skill setting, search queries may include proprietary project details, internal identifiers, or personal data, so failing to disclose this outbound transmission creates a meaningful risk of unintended data exposure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script accepts either a local file path or a remote image URL, converts the image to base64, and sends it to a third-party API without any explicit warning, consent prompt, or restriction. This creates a real data disclosure risk because users may unintentionally upload sensitive local images or intranet-accessible content to an external service.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

The code is designed to transmit user-supplied prompt and image data to https://api.minimaxi.com/, which is an external service. While this is core functionality rather than obviously malicious behavior, it is still a genuine security/privacy concern in a skill context because sensitive user data and local file contents leave the local environment.

Content

Scanner excerpt · scripts/minimax_image.py (reported line 98)May include surrounding context.

python
# Process image (convert to base64 if needed)
    processed_image_url = process_image_url(image_url)
    
    url = "https://api.minimaxi.com/v1/coding_plan/vlm"
    
    payload = {
        "prompt": prompt,

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

python
def call_search_api(api_key: str, query: str) -> dict:
    """Call MiniMax Search API."""
    url = "https://api.minimaxi.com/v1/coding_plan/search"
    
    payload = {
        "q": query

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script requires the API key to be passed as a command-line argument, which can expose the secret through shell history, process listings, audit logs, and orchestration tooling. This is a real credential-handling weakness even though the script appears intended for legitimate use, because other local users or monitoring systems may capture the key.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.