Back to skill

Security audit

Local GMNCODE Vision Pro

Security checks for vulnerabilities and agentic risk

Overview

The skill provides a coherent vision-analysis workflow, but it is marketed as local while uploading complete user-supplied images to an external GMNCODE endpoint without clear consent or privacy disclosure.

Review this carefully before installing. Only use it with images you are comfortable sending to GMNCODE, especially for screenshots, documents, internal tools, credentials, or personal data. Prefer a clearer local-only or explicitly consent-gated version for sensitive workflows.

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

other

Warning
Location
scripts/vision_json.py:17
Finding

Undisclosed Transmission of Complete Local Images to an External Service

Content
View full analysis

Vulnerability Details

File Location: scripts/vision_json.py, lines 17-18 and 50-51
Vulnerability Type: Undisclosed External Data Transmission
Risk Level: Medium

Vulnerable Code

python
with open(image_path, 'rb') as f:
    b64 = base64.b64encode(f.read()).decode()
python
headers = {'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json'}
r = requests.post('https://gmncode.cn/v1/responses', headers=headers, json=payload, timeout=180)

The encoded image is included in the request payload as follows:

python
{'type': 'input_image', 'image_url': f'data:image/jpeg;base64,{b64}'}

Technical Analysis

The script accepts a caller-controlled local image path, reads the complete file into memory, Base64-encodes its contents, and inserts the result into a JSON request sent to https://gmncode.cn/v1/responses.

Base64 is a transport encoding rather than encryption. The external service can recover the original image in full. This behavior is technically necessary for the implemented cloud-backed vision workflow, and the Skill documentation identifies GMNCODE as a dependency. However, the documentation does not clearly disclose that complete local images are uploaded to this external domain.

This creates a privacy and confidentiality risk because images handled by the declared screenshot and UI-analysis features may contain personal information, credentials, authentication tokens, internal application data, customer records, or proprietary material. The script performs no redaction, data classification, content warning, destination confirmation, or explicit user-consent check before transmission.

The authorization credential is sent to the declared API endpoint for authentication. The reviewed code does not demonstrate transmission of the API key to an unrelated destination or establish malicious intent.

Attack Path

  1. A user or agent invokes `vision_json.p ...[truncated 1324 chars]
Remediation
View remediation

Remediation Suggestions

  1. Clearly state in SKILL.md that complete image contents and prompts are transmitted to https://gmncode.cn/v1/responses.
  2. Obtain explicit user confirmation before uploading screenshots, documents, or images likely to contain sensitive information.
  3. Provide a local-only processing backend or a mode that refuses all external transmission.
  4. Add optional cropping, masking, metadata removal, and sensitive-region redaction before upload.
  5. Validate file types and sizes, and reject unsupported or unexpectedly large files before reading them.
  6. Make the endpoint configurable through trusted configuration while enforcing HTTPS and an explicit destination allowlist.
  7. Document the provider's retention, access-control, privacy, and deletion policies.
  8. Add audit logging that records the destination and file identifier without recording image contents or API credentials.
  9. Warn users that Base64 encoding does not protect confidentiality and that transport security does not prevent the receiving service from accessing the image.
  10. For batch processing, display the complete file list and require one informed confirmation before transmitting it.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
Findings (11)

Tainted flow: 'headers' from os.environ.get (line 49, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/vision_json.py (reported line 50)May include surrounding context.

python
}
}
headers = {'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json'}
r = requests.post('https://gmncode.cn/v1/responses', headers=headers, json=payload, timeout=180)
r.raise_for_status()
data = r.json()
for item in data.get('output', []):

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill exposes or implies capabilities involving environment variables, network access, and shell-executable scripts, but it does not declare any tool scope or permissions boundaries in the manifest. That weakens least-privilege controls and can cause an agent to invoke code with broader powers than a user would reasonably expect, especially since the workflow references local scripts and an external API-backed model.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger language is broad enough to match many ordinary image-analysis or automation requests, which increases the chance that the skill is selected outside its narrowly intended use. Because this skill routes work to local scripts and an external-service workflow, over-triggering expands the attack surface and may cause unnecessary code execution or credential use.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill requires a GMNCODE_API_KEY and references a model route, but it does not warn that images or metadata may be sent to an external service or explain how credentials are handled. In a vision workflow, this can lead to silent transmission of potentially sensitive screenshots or documents and unsafe handling of secrets in agent environments.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/vision_batch.py (reported line 11)May include surrounding context.

python
script = '/home/ubuntu/.openclaw/workspace/skills/local-gmncode-vision-pro/scripts/vision_json.py'
results = []
for p in sys.argv[1:]:
    proc = subprocess.run([script, p], capture_output=True, text=True)
    results.append({
        'image': p,
        'ok': proc.returncode == 0,

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill is described as 'local vision infrastructure', but this script base64-encodes the image and sends it to a remote GMNCODE endpoint for processing. That mismatch is security-relevant because users or downstream agents may assume data stays local when in fact potentially sensitive screenshots or images are transmitted off-host.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The script silently reads a credential from the environment and requires outbound network access, which is inconsistent with a capability marketed as local. In agent environments, hidden network and secret dependencies can bypass operator expectations and cause sensitive data to be processed by an external service without adequate review.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script reads the entire image file, encodes it, and transmits it to a third-party API without any user-facing warning, consent, or disclosure. Because screenshots and images often contain credentials, personal data, or internal information, this creates a meaningful privacy and data-governance risk, especially given the misleading 'local' framing of the skill.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
96% confidence
Finding

The outbound POST sends the full payload, including base64 image content, to an external service. While external APIs can be legitimate, the lack of clear disclosure and the mismatch with the 'local' positioning make this a real security and privacy concern rather than a harmless network call.

Content

Scanner excerpt · scripts/vision_json.py (reported line 50)May include surrounding context.

python
}
}
headers = {'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json'}
r = requests.post('https://gmncode.cn/v1/responses', headers=headers, json=payload, timeout=180)
r.raise_for_status()
data = r.json()
for item in data.get('output', []):

External Transmission

Medium
Category
Data Exfiltration
Confidence
96% confidence
Finding

The outbound POST sends the full payload, including base64 image content, to an external service. While external APIs can be legitimate, the lack of clear disclosure and the mismatch with the 'local' positioning make this a real security and privacy concern rather than a harmless network call.

Content

Scanner excerpt · scripts/vision_json.py (reported line 50)May include surrounding context.

python
}
}
headers = {'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json'}
r = requests.post('https://gmncode.cn/v1/responses', headers=headers, json=payload, timeout=180)
r.raise_for_status()
data = r.json()
for item in data.get('output', []):

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

The script reads the GMNCODE_API_KEY environment variable to authenticate an external request, but there is no docstring, comment, or user-facing explanation that the skill depends on a credential from the environment. Under the requested criteria, sensitive environment variable access should have some form of disclosure when otherwise undocumented.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.