Back to skill

Security audit

Desktop Gui

Security checks for vulnerabilities and agentic risk

Overview

This desktop automation skill is coherent, but it recommends sending full desktop screenshots to a hard-coded plaintext HTTP vision endpoint before performing GUI actions.

Review before installing. Use this only in an environment where desktop screenshots and automated clicks are acceptable. Replace the hard-coded HTTP vision endpoint with a user-configured trusted HTTPS or local model, crop or redact screenshots, confirm actions before clicking, delete temporary screenshots, and install dependencies in an isolated pinned environment.

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
SKILL.md:145
Finding
Full Desktop Screenshot Transmitted to a Hard-Coded Endpoint over Plaintext HTTP<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 145-174 **Vulnerability Type**: Sensitive-data exposure through insecure network transmission **Risk Level**: High ### Vulnerable Code ```python import subprocess import base64 import requests # 1. Screenshot subprocess.run(['scrot', '/tmp/screen.png']) # 2. Convert to Base64 with open('/tmp/screen.png', 'rb') as f: img_b64 = base64.b64encode(f.read()).decode() # 3. Ask the vision model prompt = """ Analyze the screenshot, locate the check-in button, and return its coordinates. Use JSON format: {"action": "click", "x": 450, "y": 320, "description": "check-in button"} """ response = requests.post( "http://10.6.207.56:8000/v1/chat/completions", headers={"Authorization": "Bearer VLLM_API_KEY"}, json={ "model": "qwen3.5-27b", "messages": [{ "role": "user", "content": [ {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{img_b64}"}}, {"type": "text", "text": prompt} ] }] } ) result = response.json()['choices'][0]['message']['content'] print(result) ``` ### Technical Analysis The documented workflow captures the entire desktop and sends the resulting image to the hard-coded endpoint `http://10.6.207.56:8000`. A full-screen capture can include credentials, authentication tokens, private messages, personal data, confidential documents, and content from applications unrelated to the automation task. Base64 conversion only encodes the image; it does not encrypt or otherwise protect it. Because the destination uses plaintext HTTP, the screenshot and authorization header lack transport confidentiality and integrity. A network-positioned attacker may observe or alter the request or response. The remote service itself also receives the complete screenshot and may log, retain, or process it outside the user's expected trust boundary. The code does not obtain explicit ...[truncated 1838 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace the hard-coded HTTP URL with an explicitly configured HTTPS endpoint. 2. Validate the endpoint against a narrowly defined allowlist and reject plaintext HTTP. 3. Require informed user approval before each screenshot is transmitted to a remote service. 4. Capture only the smallest relevant window or screen region instead of the entire desktop. 5. Apply redaction for passwords, tokens, notifications, personal information, and unrelated application content. 6. Prefer local OCR or an on-device vision model when remote processing is unnecessary. 7. Set connection and read timeouts, handle response errors safely, and verify the response schema and coordinate bounds. 8. Protect API credentials using an environment variable or secret manager rather than embedding them in examples or source files. 9. Delete temporary screenshots promptly and create them with restrictive permissions in a secure temporary directory. 10. Display the destination, transmitted data scope, and retention policy before obtaining consent. 11. Require confirmation before executing model-generated actions, especially actions that submit forms, change settings, or access sensitive applications. ]]>

T08 · Insecure Dependencies

Warning
Location
SKILL.md:21
Finding
Unpinned Third-Party Dependencies Installed from a Mutable Package Index<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, line 21 **Vulnerability Type**: Uncontrolled third-party dependency installation **Risk Level**: Medium ### Vulnerable Code ```bash pip3 install pyautogui pygetwindow pymsgbox opencv-python-headless pillow pytesseract ``` ### Technical Analysis The installation command retrieves multiple Python packages without fixed versions or cryptographic hash verification. Package resolution therefore depends on the latest releases available from the configured package index at installation time. The effective code installed by the Skill can change after the Skill has been reviewed. Python package installation can execute package build and installation logic. If an upstream project, maintainer account, package index, or dependency is compromised, malicious code may run during installation or when the package is imported. Unpinned versions also create reproducibility and compatibility risks that can alter the security behavior of the automation environment. No evidence indicates that the named packages are intentionally malicious or typosquatted. The issue is the absence of supply-chain controls rather than a confirmed malicious dependency. ### Attack Path 1. An attacker compromises an upstream package, maintainer account, transitive dependency, or package-distribution channel. 2. A malicious release becomes the version selected by the unpinned `pip3 install` command. 3. A user runs the documented command after the malicious release is available. 4. Pip downloads and installs the altered package or dependency. 5. Malicious build hooks, installation logic, or imported runtime code executes with the privileges of the user running the command. 6. The compromised package can access files, environment variables, GUI sessions, screenshots, and network resources available to that user. ### Impact Assessment Code supplied through a compromised dependency could execute with the installing user's privileges. ...[truncated 450 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin every direct dependency to a specifically reviewed version. 2. Generate and maintain a lock file that also fixes transitive dependencies. 3. Require cryptographic hashes, for example through a hash-locked requirements file and `pip install --require-hashes`. 4. Install packages inside an isolated virtual environment rather than the system Python environment. 5. Use an explicitly configured and trusted package index or an internally controlled package mirror. 6. Review dependency provenance, release history, maintainers, and known vulnerabilities before updating versions. 7. Automate dependency vulnerability scanning and controlled update testing. 8. Avoid running package installation as root or through `sudo`. 9. Document a repeatable update and approval process so dependency changes receive security review before deployment. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (8)

Context-Inappropriate Capability

High
Confidence
99% confidence
Finding
The example code captures the full desktop and transmits it to a remote HTTP API, which constitutes direct exfiltration of potentially sensitive on-screen information. This is especially risky because the stated purpose is desktop automation, not off-host data sharing, and users may run the snippet without understanding that their screen contents leave the machine.

Missing User Warnings

High
Confidence
98% confidence
Finding
The skill demonstrates transmitting screenshots to a vision endpoint without warning that desktop contents may include highly sensitive personal or corporate data. Omitting this privacy notice makes unsafe use more likely and increases the chance of unintentional disclosure.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The file consistently uses Chinese for the description, headings, warnings, and example prompts, which effectively forces a single language for use of the skill. There is no indication that the skill is region-specific or that users may choose another language, so this creates a natural-language locale policy concern.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The documentation broadens a local desktop automation skill into a workflow that can send screenshots to a remote vision service. Desktop screenshots routinely contain sensitive data such as emails, credentials, tokens, documents, and chat content, so this scope expansion materially changes the trust boundary and data exposure profile.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
pip3 install pyautogui pygetwindow pymsgbox opencv-python-headless pillow pytesseract

# 系统工具
sudo apt-get install -y xdotool scrot tesseract-ocr tesseract-ocr-chi-sim tesseract-ocr-chi-tra
```

## 核心功能
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

External Transmission

Medium
Category
Data Exfiltration
Content
用 JSON 格式:{"action": "click", "x": 450, "y": 320, "description": "打卡按钮"}
"""

response = requests.post(
    "http://10.6.207.56:8000/v1/chat/completions",
    headers={"Authorization": "Bearer VLLM_API_KEY"},
    json={
Confidence
98% confidence
Finding
This duplicate finding points to the same behavior: a network request to a remote service as part of screenshot analysis. Because the skill controls the user's real desktop, any outbound transfer of screen contents is particularly dangerous and should be treated as sensitive data exfiltration.

External Transmission

Medium
Category
Data Exfiltration
Content
用 JSON 格式:{"action": "click", "x": 450, "y": 320, "description": "打卡按钮"}
"""

response = requests.post(
    "http://10.6.207.56:8000/v1/chat/completions",
    headers={"Authorization": "Bearer VLLM_API_KEY"},
    json={
Confidence
98% confidence
Finding
This duplicate finding points to the same behavior: a network request to a remote service as part of screenshot analysis. Because the skill controls the user's real desktop, any outbound transfer of screen contents is particularly dangerous and should be treated as sensitive data exfiltration.

Internal Network Request

Medium
Category
Server-Side Request Forgery
Content
用 JSON 格式:{"action": "click", "x": 450, "y": 320, "description": "打卡按钮"}
"""

response = requests.post(
    "http://10.6.207.56:8000/v1/chat/completions",
    headers={"Authorization": "Bearer VLLM_API_KEY"},
    json={
Confidence
88% confidence
Finding
The example posts data to an internal-network IP address, which introduces additional risk because internal services are often assumed to be more trusted and less monitored. Even though this is not classic attacker-controlled SSRF, documenting direct access to an internal endpoint can facilitate unintended data leakage into a private network service and bypass normal external review controls.

Static analysis

No suspicious patterns detected.