Back to skill

Security audit

openclaw-computer

Security checks for vulnerabilities and agentic risk

Overview

This desktop-control skill is broadly coherent, but it can delete files, capture screens, type into apps, launch commands, and kill processes while its documented safety controls are not actually enforced.

Install only if you are comfortable giving this skill broad control over your desktop session and user files. Treat screen capture, screen recording, keyboard input, application launch, file deletion, and process killing as sensitive actions; use a constrained test account or VM, avoid running it with elevated privileges, avoid xhost +local:, and do not rely on the documented sandbox or confirmation claims unless the implementation is changed to enforce them.

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

T09 · Insecure Skill Coding Practices

Error
Location
computer_use.py:235
Finding
Documented sandbox and authorization controls are not enforced<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:427-451`, `computer_use.py:235-243`, `computer_use_pro.py:529-543`, `computer_use_pro.py:674-679` **Vulnerability Type**: Missing authorization and path restriction enforcement **Risk Level**: High The documentation describes confirmation requirements, forbidden paths, sandboxing, and application allowlisting: ```yaml security: # Operations requiring confirmation require_confirmation: - delete - kill - sudo # Forbidden directories forbidden_paths: - /etc - /usr/bin - ~/.ssh # Allowed applications allowed_apps: - google-chrome - code - terminal - nautilus ``` However, the base implementation performs recursive deletion without consulting this configuration or requesting confirmation: ```python def delete(self, path: str): """Delete a file or directory.""" import shutil path = os.path.expanduser(path) if os.path.isdir(path): shutil.rmtree(path) else: os.remove(path) ``` The Pro implementation includes an optional prompt, but callers can explicitly disable it: ```python def delete(self, path: str, confirm: bool = True): """Delete a file or directory with optional confirmation.""" import shutil path = os.path.expanduser(path) if confirm: response = input(f"确定要删除 {path} 吗? (y/N): ") if response.lower() != 'y': print("取消删除") return if os.path.isdir(path): shutil.rmtree(path) else: os.remove(path) ``` Process termination is similarly unrestricted: ```python def kill_process(self, pid: int, force: bool = False): """Terminate a process.""" if force: subprocess.run(["kill", "-9", str(pid)], check=True) else: subprocess.run(["kill", str(pid)], check=True) ``` ### Technical Analysis The security configuration shown in the documentation is not loaded or enforced by either Python implementation. There is n ...[truncated 2152 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Implement a centralized security-policy component and require every destructive, launch, and process-control method to use it. 2. Load the documented configuration from a trusted location and fail closed if it is missing, malformed, or inaccessible. 3. Resolve paths with `Path.resolve(strict=False)` or `os.path.realpath()` before authorization checks. 4. Enforce an explicit allowlist of permitted working directories. Do not rely exclusively on a denylist. 5. Reject paths outside the allowlist after resolving symbolic links and parent-directory traversal. 6. Make approval non-bypassable for destructive operations. A public `confirm=False` parameter must not disable a security decision. 7. Bind approval to the exact canonical path, operation, and invocation so that approval cannot be reused for another target. 8. Restrict process termination to child processes recorded as having been launched by this skill. 9. Validate application names against an explicit allowlist and prefer absolute executable paths. 10. Add automated tests proving that sensitive paths, symlink escapes, unauthorized applications, and unrelated PIDs are rejected. 11. Correct the documentation so it does not claim sandboxing or enforcement until those controls are actually implemented. ]]>

T08 · Insecure Dependencies

Warning
Location
SKILL.md:98
Finding
Python dependencies are installed without version or integrity pinning<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:98-103` **Vulnerability Type**: Unpinned third-party dependencies **Risk Level**: Medium The installation instructions install mutable package versions directly from the configured Python package index: ```bash pip install \ pyautogui \ pillow \ opencv-python \ pynput \ psutil ``` ### Technical Analysis No exact versions, lockfile, package hashes, or trusted-index restrictions are supplied. Consequently, the code installed by this command can change after the skill has been reviewed. These dependencies are particularly sensitive because they support keyboard and mouse automation, screen processing, and process inspection. Package installation and import can execute package-controlled Python code with the privileges of the user installing or running the skill. This is a supply-chain weakness rather than evidence that the named packages are currently malicious. ### Attack Path 1. A user follows the documented dependency installation instructions. 2. `pip` queries the user's configured package index and resolves the latest versions satisfying the unconstrained package names. 3. A compromised release, compromised index, malicious mirror, or unexpected future version is selected. 4. Package installation hooks or imported package code execute under the user's privileges. 5. The compromised dependency can access files, environment data, the desktop session, or network resources available to that account. ### Impact Assessment A compromised dependency could execute arbitrary code with the installing user's privileges. Depending on the environment, this could expose user files, desktop contents, input events, environment variables, application data, and process information. The repository itself does not contain evidence of a malicious dependency or dependency-confusion package. The risk arises from the absence of reproducible and integrity-verified dependency resolution. ]]>
Remediation
<![CDATA[ ## Remediation Suggestions 1. Create a reviewed dependency lockfile containing exact versions. 2. Generate and record cryptographic hashes for every package and transitive dependency. 3. Install with an integrity-enforcing command such as: ```bash python3 -m pip install --require-hashes -r requirements.txt ``` 4. Specify the intended trusted package index and prevent fallback to untrusted extra indexes. 5. Review dependency updates before changing the lockfile. 6. Use a dedicated virtual environment rather than installing into the system interpreter. 7. Add automated dependency vulnerability and provenance scanning to the release process. 8. Document supported Python versions and platform-specific dependency sets to improve reproducibility. ]]>

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
SKILL.md:484
Finding
Troubleshooting guidance grants broad local access to the X server<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:484-490` **Vulnerability Type**: Overly broad desktop-session authorization **Risk Level**: Medium The troubleshooting instructions recommend the following command: ```bash # Check permissions echo $DISPLAY # Expected output: :0 or similar # Grant permissions xhost +local: ``` ### Technical Analysis `xhost +local:` authorizes local connections broadly rather than granting access to one specifically identified user or process. On an X11 desktop, access to the X server can permit clients to observe windows, capture screen contents, monitor input under some configurations, and inject keyboard or mouse events. The command weakens the desktop-session trust boundary for all eligible local connections. This is broader than the access required for the skill and conflicts with least-privilege principles. ### Attack Path 1. A user encounters a GUI-control problem and follows the troubleshooting instructions. 2. The user executes `xhost +local:`. 3. The X server begins accepting broadly authorized local connections. 4. Another local account, compromised process, or untrusted container process with access to the X socket connects to the desktop session. 5. That process uses X11 capabilities to inspect or manipulate the session. 6. The authorization remains weakened until it is explicitly revoked or the session is reset. ### Impact Assessment An attacker already capable of running a local process may gain access to the user's graphical session. Potential consequences include: - Capturing sensitive information displayed on screen. - Injecting keyboard and mouse events into applications. - Interacting with applications under the desktop user's authority. - Observing window metadata or clipboard-related activity. - Performing actions in authenticated GUI sessions. This command does not itself provide remote code execution or root privileges, but it can expand a local attacker's access to the active desk ...[truncated 16 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the recommendation to use `xhost +local:`. 2. Use Xauthority credentials or a narrowly scoped authorization for the exact local user that requires access. 3. If `xhost` must be documented, use a user-specific authorization and provide an explicit matching revocation command. 4. Explain the security consequences before any command that changes X server access control. 5. Prefer platform-native desktop automation permission mechanisms. 6. Avoid sharing the X11 socket with untrusted containers or unrelated local accounts. 7. Add troubleshooting steps that first verify `DISPLAY`, `XAUTHORITY`, session ownership, and process identity without weakening access controls. ]]>
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
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (105)

Tp4

High
Category
MCP Tool Poisoning
Confidence
89% confidence
Finding
This mismatch is security-relevant because the skill description understates destructive and surveillance-capable actions such as file deletion, renaming, process termination, and clipboard extraction. Users or orchestrators may invoke the skill believing it only performs benign visual management, when it can actually alter the filesystem and terminate processes.

Tp4

High
Category
MCP Tool Poisoning
Confidence
89% confidence
Finding
This mismatch is security-relevant because the skill description understates destructive and surveillance-capable actions such as file deletion, renaming, process termination, and clipboard extraction. Users or orchestrators may invoke the skill believing it only performs benign visual management, when it can actually alter the filesystem and terminate processes.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
This mismatch is security-relevant because the skill description understates destructive and surveillance-capable actions such as file deletion, renaming, process termination, and clipboard extraction. Users or orchestrators may invoke the skill believing it only performs benign visual management, when it can actually alter the filesystem and terminate processes.

Intent-Code Divergence

High
Confidence
99% confidence
Finding
The launch handler accepts a value documented as an application name but executes it directly via `$name &`, which allows arbitrary shell command execution rather than constrained app launching. In a computer-control skill, this is especially dangerous because an upstream agent or user prompt can turn 'launch app' into execution of any program or shell payload with the current user's privileges.

Missing User Warnings

High
Confidence
97% confidence
Finding
Copy, move, and especially delete operations can irreversibly alter user data, yet they occur with no confirmation, safety checks, or sandboxing. In a computer-control skill, unrestricted file mutation is highly dangerous because it enables destructive actions and data loss on the host filesystem.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The README advertises GUI automation, file management, screenshot/recording, application control, and process management without any guidance about user consent, confirmation prompts, scope limits, or handling of sensitive data. In a computer-control skill, these capabilities directly enable destructive actions and privacy-invasive collection, so omission of safeguards materially increases the risk of misuse or unsafe deployment.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
```bash
# Ubuntu/Debian
sudo apt-get install -y scrot xdotool wmctrl xclip ffmpeg

# macOS
brew install imagemagick cliclick ffmpeg
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
```bash
# Ubuntu/Debian
sudo apt-get install -y scrot xdotool wmctrl xclip ffmpeg

# macOS
brew install imagemagick cliclick ffmpeg
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
```bash
# Ubuntu/Debian
sudo apt-get install -y scrot xdotool wmctrl xclip ffmpeg

# macOS
brew install imagemagick cliclick ffmpeg
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
```bash
# Ubuntu/Debian
sudo apt-get install -y scrot xdotool wmctrl xclip ffmpeg

# macOS
brew install imagemagick cliclick ffmpeg
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Lp3

Medium
Category
MCP Least Privilege
Confidence
86% confidence
Finding
The skill advertises broad computer-control behavior and includes examples that imply shell, file read, and file write capabilities, but it does not declare any explicit tool scope or permission boundaries. For a desktop-control skill, missing scope is dangerous because it can silently expand into filesystem manipulation and command execution without policy enforcement or user visibility.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The main heading and introductory marketing text are presented in Chinese, and the rest of the skill documentation continues primarily in Chinese despite the manifest metadata being in English. This creates a language/locale constraint without any explicit user choice or justification, which matches the policy category for forced language without opt-in.

Intent-Code Divergence

Medium
Confidence
92% confidence
Finding
The skill promises confirmation before sensitive actions, but the documented commands perform destructive operations directly with no visible approval workflow. This creates a deceptive safety model where users may believe deletes or kills require consent when they may execute immediately.

Intent-Code Divergence

Medium
Confidence
94% confidence
Finding
The documentation claims sandboxing and protection of critical files, yet the examples show system-wide file and process operations with no demonstrated enforcement. That discrepancy can cause operators to trust the skill in sensitive environments, leading to unrestricted deletion, movement, process control, or data exposure.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The manifest description says the skill can record the screen and schedule system tasks, and the help output also advertises `computer-record`. However, this script only dispatches screenshot, mouse, keyboard, app, file, and monitor commands, with no recording or scheduling implementation present.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The keyboard function sends arbitrary keystrokes to the active window with no confirmation, preview, target validation, or safety boundary. In a GUI automation skill, this can cause unintended commands, credential entry into the wrong window, destructive actions, or social-engineering style abuse if invoked by an untrusted agent workflow.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
Launching a user-supplied command without warning or confirmation is unsafe in a desktop-control skill because it can immediately execute arbitrary local programs and chained shell commands. The skill context makes this more dangerous, not less, since the stated purpose is to automate system interaction and users may assume 'app launch' is a constrained action rather than arbitrary execution.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
Full-screen and window screenshot capture occur without any user-facing notice or confirmation, enabling silent collection of sensitive on-screen information. In a computer-use skill, that context makes the issue more dangerous because screen content often includes credentials, personal messages, and confidential documents.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
# 尝试不同的截图工具
        if self._command_exists("scrot"):
            subprocess.run(["scrot", save_path], check=True)
        elif self._command_exists("gnome-screenshot"):
            subprocess.run(["gnome-screenshot", "-f", save_path], check=True)
        elif self._command_exists("import"):  # ImageMagick
Confidence
87% confidence
Finding
Full-screen screenshots can capture secrets, credentials, personal data, tokens, and other sensitive content from any visible application. The method performs this capture without any user-facing warning, scope restriction, or consent check, which is risky in a computer-control skill.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
if self._command_exists("scrot"):
            subprocess.run(["scrot", save_path], check=True)
        elif self._command_exists("gnome-screenshot"):
            subprocess.run(["gnome-screenshot", "-f", save_path], check=True)
        elif self._command_exists("import"):  # ImageMagick
            subprocess.run(["import", "-window", "root", save_path], check=True)
        else:
Confidence
87% confidence
Finding
Like the scrot-based path, this captures the entire screen and may collect secrets or private data from unrelated applications. The lack of consent, visibility, and capture scoping makes it risky in a general-purpose computer-control skill.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
elif self._command_exists("gnome-screenshot"):
            subprocess.run(["gnome-screenshot", "-f", save_path], check=True)
        elif self._command_exists("import"):  # ImageMagick
            subprocess.run(["import", "-window", "root", save_path], check=True)
        else:
            raise RuntimeError("未找到截图工具,请安装 scrot 或 ImageMagick")
Confidence
87% confidence
Finding
This alternate full-screen capture path has the same privacy risk as the other screenshot implementations: it silently captures everything visible on the desktop. In this skill context, unrestricted screenshotting is sensitive because it enables collection of user data across applications.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
if self._command_exists("scrot"):
            # 使用 scrot 的选区模式
            subprocess.run(["scrot", "-s", save_path], check=True)
        else:
            raise RuntimeError("区域截图需要 scrot")
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
save_path = os.path.join(self.save_dir, filename)
        
        if self._command_exists("scrot"):
            subprocess.run(["scrot", "-u", save_path], check=True)
        else:
            raise RuntimeError("窗口截图需要 scrot")
Confidence
86% confidence
Finding
Window capture can expose sensitive contents from the active or targeted window without any confirmation or visibility to the user. In a desktop-control skill, silent collection of application contents materially increases privacy and data-exfiltration risk.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
@staticmethod
    def _command_exists(cmd: str) -> bool:
        return subprocess.run(["which", cmd], 
                            capture_output=True).returncode == 0
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

subprocess module call

Medium
Category
Dangerous Code Execution
Content
@staticmethod
    def _command_exists(cmd: str) -> bool:
        return subprocess.run(["which", cmd], 
                            capture_output=True).returncode == 0
Confidence
70% confidence
Finding
subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Static analysis

No suspicious patterns detected.