Back to skill

Security audit

openclaw-plus

Security checks for vulnerabilities and agentic risk

Overview

This skill openly provides broad developer automation powers, but the combination of code execution, package installation, network calls, commits, file/process actions, sub-agents, and webhooks is under-scoped for normal installation.

Review this skill carefully before installing. Use it only in a disposable workspace, container, or virtual environment, and do not let it run untrusted code, install arbitrary packages, commit changes, delete files, start background work, or send API/webhook messages without reviewing the exact action and any secrets involved.

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)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/implementation.py:43
Finding
Unisolated Python Execution with Inherited Host Access<![CDATA[ ## Vulnerability Details **File Location**: `scripts/implementation.py:43-58` **Vulnerability Type**: Unrestricted code execution without isolation **Risk Level**: High ### Vulnerable Code ```python if filename: # Save code to file with open(filename, 'w') as f: f.write(code) cmd = [sys.executable, filename] else: # Execute directly cmd = [sys.executable, '-c', code] try: result = subprocess.run( cmd, capture_output=True, text=True, timeout=30 ) ``` The corresponding documentation explicitly states that executed code has environment-variable access: ```markdown **Features:** - Multi-line code support - Exception handling - Timeout protection (30s) - Access to installed packages - Environment variable access ``` ### Technical Analysis The `run_python` method executes caller-supplied Python directly under the identity and environment of the parent process. No container, restricted interpreter, reduced environment, filesystem boundary, network restriction, system-call filter, or unprivileged execution account is used. Using an argument array instead of a shell prevents conventional shell metacharacter injection, but it does not constrain the Python program itself. Python code can directly import modules such as `os`, `subprocess`, `socket`, and `pathlib`, read inherited environment variables, inspect accessible files, open network connections, modify repositories, or launch additional processes. The 30-second timeout only limits the lifetime of the immediate child process. It is not a security boundary and does not prevent the child from creating detached processes, modifying files, reading secrets, or transmitting data before termination. ### Attack Path 1. An untrusted task, compromised prompt, or malicious generated workflow supplies Python code to `run_python`. 2. The implementation launches that code with the host Python interpreter. 3. The code inherits the process envi ...[truncated 884 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Execute generated code inside a disposable container, microVM, or equivalent sandbox. - Use a dedicated unprivileged identity with no access to the Agent's credentials or unrelated files. - Construct a minimal environment instead of inheriting the complete parent environment. - Mount only explicitly approved working files into the sandbox and make other mounts read-only. - Disable outbound network access by default; enable it only for destinations explicitly approved for the task. - Apply CPU, memory, process-count, file-size, and execution-time limits. - Prevent detached child processes and terminate the entire process group when a timeout occurs. - Require explicit user confirmation before executing code derived from untrusted content. - Validate and constrain optional output filenames to an approved workspace. - Clearly document that the method performs arbitrary code execution rather than describing the timeout as sufficient protection. ]]>

T08 · Insecure Dependencies

Error
Location
scripts/implementation.py:89
Finding
Unsafe Global and Privileged Package Installation<![CDATA[ ## Vulnerability Details **File Location**: `scripts/implementation.py:89-105` **Vulnerability Type**: Untrusted dependency installation and excessive installation privileges **Risk Level**: High ### Vulnerable Code ```python if system: self.log(f"Installing system package: {package}") # Attempt apt-get for Debian/Ubuntu systems cmd = ['sudo', 'apt-get', 'install', '-y', package] else: self.log(f"Installing Python package: {package}") # Always use --break-system-packages in this environment cmd = [sys.executable, '-m', 'pip', 'install', package, '--break-system-packages'] try: result = subprocess.run( cmd, capture_output=True, text=True, timeout=120 ) ``` The reference also encourages requirements-file and system-level installation: ```python result = install_package("-r requirements.txt") ``` ```bash # Python packages pip install <package> --break-system-packages # System packages (Ubuntu/Debian) sudo apt-get install -y <package> ``` ### Technical Analysis The method accepts a package specification and installs it from configured package repositories without enforcing an allowlist, version pinning, cryptographic hashes, trusted repository restrictions, or manual approval. Python package installation can execute package build logic and installation hooks. A malicious, compromised, dependency-confused, or typosquatted package can therefore execute code during installation. Requirements files expand this exposure because they may select multiple dependencies, alternate indexes, direct URLs, or unexpected versions. The `--break-system-packages` option deliberately bypasses protections intended to prevent pip from modifying a distribution-managed Python environment. This can corrupt or replace shared packages used by other applications. For system packages, the implementation invokes `sudo apt-get`. If passwordless or otherwise non-interactive sudo is available, packa ...[truncated 1468 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Remove `sudo`-based system package installation from the default capability. - Remove `--break-system-packages` and install Python dependencies in a dedicated virtual environment or disposable container. - Require explicit user confirmation for every new dependency and display its exact name, version, source, and transitive dependency plan. - Allow only approved package indexes and reject direct URLs or alternate indexes unless separately authorized. - Require pinned versions and cryptographic hashes, such as pip hash-checking mode with a reviewed lock file. - Validate package names against an allowlist or organization-controlled dependency catalog. - Treat requirements files as untrusted input and inspect their options and sources before installation. - Run installation under a non-privileged identity with minimal filesystem and network access. - Prefer prebuilt, scanned environments over runtime package installation. - Record installed package provenance and verify signatures or attestations where the ecosystem supports them. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:380
Finding
Potential Sensitive-Data Disclosure Through Webhook Error Notifications<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:380-386` **Vulnerability Type**: Unredacted process logs transmitted to an external webhook **Risk Level**: Medium ### Vulnerable Code ```python # Process management result = process("wait", pid, timeout=60) if result["exit_code"] != 0: logs = process("logs", pid) notify("slack", webhook_url=SLACK_URL, message=f"❌ Process failed:\n{logs[-500:]}") raise RuntimeError(f"Process exited {result['exit_code']}") ``` A second documented pattern sends raw exception text: ```python try: run_pipeline() notify("slack", webhook_url=SLACK_URL, message="✅ Pipeline complete") except Exception as e: notify("slack", webhook_url=SLACK_URL, message=f"❌ Pipeline failed: {e}") raise ``` The evaluation criteria reinforce this behavior: ```json "Discord webhook notification is sent with the error details" ``` ### Technical Analysis The documented failure-handling pattern copies raw process-log content or exception messages into outbound Slack or Discord webhook notifications. Logs and exceptions frequently contain sensitive material, including authorization headers, API tokens, signed URLs, request bodies, personal information, database connection strings, filesystem paths, and environment-derived values. Truncating output to the final 500 characters is not sanitization. Secrets may appear anywhere within that range. Reading the webhook URL from an environment variable prevents hardcoding but does not validate the recipient, ensure that the destination is approved for the affected data, or prevent an incorrectly configured webhook from routing information to an attacker-controlled endpoint. The Skill also supports generic custom webhooks, increasing the set of possible external destinations. No redaction, data classification, destination allowlist, user preview, or consent step is required before transmission. ### Attack Path 1. A process fails and emits a credential or other sensi ...[truncated 1124 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Send a generic failure message and a local correlation identifier instead of raw logs or exception text. - Store detailed diagnostics locally with restrictive permissions. - Implement centralized redaction for bearer tokens, API keys, passwords, cookies, authorization headers, signed URLs, connection strings, and personal data. - Apply allowlists to notification schemes and hostnames, and enforce HTTPS. - Require explicit user approval before transmitting diagnostic details externally. - Show the exact redacted message and destination before sending it. - Classify workflow data and prohibit external notifications for sensitive workloads unless specifically authorized. - Limit webhook credentials to narrowly scoped channels and rotate them regularly. - Add tests verifying that representative secrets are removed from exception and log notifications. - Document that environment-variable storage protects webhook configuration but does not make arbitrary diagnostic content safe to transmit. ]]>
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
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (54)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The description broadly claims a multi-capability dev skill covering Python execution, package management, git, HTTP requests, file operations, process management, sub-agents, and webhook notifications. The actual code substantially matches the core developer-oriented purpose for Python execution, package management, git inspection/commit, HTTP fetch/API calls, and some supporting file/process behavior via file writes and subprocess usage. However, several declared capabilities are absent as concrete implemented features: there is no sub-agent support, no webhook notification function, and no general-purpose file-operations or process-management interface beyond internal support for execution and package/git commands. Because the declared description presents these as available capabilities of the skill, the code does not fully and accurately represent that breadth. This is a partial mismatch rather than a totally different purpose.

Missing User Warnings

High
Confidence
99% confidence
Finding
The skill exposes arbitrary Python execution with only a generic log message and no explicit safety barrier, confirmation, or sandboxing. In this skill’s multi-capability context, executed code can combine filesystem, process, network, and package-management capabilities, making compromise substantially more dangerous than a narrow single-purpose tool.

Missing User Warnings

High
Confidence
98% confidence
Finding
The package installation feature modifies the runtime environment and explicitly uses `--break-system-packages` without warning the caller about integrity and stability risks. In practice, installing an attacker-chosen or typo-squatted package can trigger arbitrary code execution during installation and corrupt the host environment used by the agent.

Missing User Warnings

High
Confidence
97% confidence
Finding
This API helper can send arbitrary JSON and bearer tokens to caller-specified endpoints without warning about data disclosure, token leakage, or SSRF-style access to internal services. In a powerful agent environment, this can be abused to exfiltrate secrets or interact with sensitive internal network resources under the agent’s identity.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The guide encourages package installation and later notes pip may use --break-system-packages, but it does not warn that this can alter or destabilize the local Python environment. Because this skill is designed to orchestrate installation plus execution, users may unintentionally contaminate system interpreters or break existing dependencies.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The quick start normalizes creating files and committing changes without clearly warning that these actions modify the user's working tree and permanently affect repository history. In a multi-capability automation skill, users may follow examples casually and trigger unintended writes or commits, especially when chaining operations.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The network/API examples encourage fetching URLs and calling external services without warning that prompts, data, headers, or tokens may be transmitted to third parties. In this skill context, network access is a core capability and can easily be combined with local file access or API tokens, increasing the risk of accidental data disclosure.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Data Pipeline
```python
install_package("pandas requests")
data = call_api("https://api.example.com/dataset")
run_python("process_data.py")
git_commit("feat: add cleaned dataset")
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Static analysis

No suspicious patterns detected.