269 lines
7.5 KiB
Markdown
269 lines
7.5 KiB
Markdown
# EU-Utility Security Audit Report
|
|
|
|
**Date:** 2026-02-14
|
|
**Auditor:** Security Auditor Agent
|
|
**Scope:** `/home/impulsivefps/.openclaw/workspace/projects/EU-Utility/`
|
|
|
|
---
|
|
|
|
## Executive Summary
|
|
|
|
The EU-Utility codebase contains **several security vulnerabilities**, primarily around **path traversal**, **insufficient input validation**, and **unsafe plugin loading**. A hardened version exists for some components (data_store_secure.py, screenshot_secure.py) but the original vulnerable versions are still in use.
|
|
|
|
**Overall Risk Level:** MEDIUM-HIGH
|
|
|
|
---
|
|
|
|
## Findings
|
|
|
|
### 🔴 CRITICAL: Path Traversal in data_store.py
|
|
|
|
**File:** `core/data_store.py`
|
|
**Severity:** HIGH
|
|
**Status:** ⚠️ VULNERABLE (Secure version exists but unused)
|
|
|
|
**Issue:** The `_get_plugin_file()` method uses simple string replacement for sanitization:
|
|
|
|
```python
|
|
def _get_plugin_file(self, plugin_id: str) -> Path:
|
|
safe_name = plugin_id.replace(".", "_").replace("/", "_").replace("\\", "_")
|
|
return self.data_dir / f"{safe_name}.json"
|
|
```
|
|
|
|
**Attack Vector:** A malicious plugin could use `plugin_id="../../../etc/passwd"` to escape the data directory.
|
|
|
|
**Fix:** Replace with `data_store_secure.py` which includes:
|
|
- Proper path validation using `PathValidator`
|
|
- Resolved path verification against base path
|
|
- Security error handling
|
|
|
|
---
|
|
|
|
### 🔴 HIGH: Path Traversal in screenshot.py
|
|
|
|
**File:** `core/screenshot.py`
|
|
**Severity:** HIGH
|
|
**Status:** ⚠️ VULNERABLE (Secure version exists but unused)
|
|
|
|
**Issue:** The `save_screenshot()` method accepts arbitrary filenames without validation:
|
|
|
|
```python
|
|
def save_screenshot(self, image: Image.Image, filename: Optional[str] = None) -> Path:
|
|
if filename is None:
|
|
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S_%f")[:-3]
|
|
filename = f"screenshot_{timestamp}.{self._format.lower()}"
|
|
|
|
# NO VALIDATION HERE
|
|
filepath = self._save_path / filename
|
|
image.save(filepath, ...)
|
|
```
|
|
|
|
**Attack Vector:** A plugin could call `save_screenshot(image, "../../../malware.exe")` to write outside the screenshots directory.
|
|
|
|
**Fix:** Replace with `screenshot_secure.py` which includes:
|
|
- `PathValidator.sanitize_filename()` usage
|
|
- Resolved path verification
|
|
- Security error handling
|
|
|
|
---
|
|
|
|
### 🟡 MEDIUM: Insufficient HTTP Client Security
|
|
|
|
**File:** `core/http_client.py`
|
|
**Severity:** MEDIUM
|
|
**Status:** ⚠️ PARTIALLY VULNERABLE
|
|
|
|
**Issues:**
|
|
1. No SSL certificate verification control
|
|
2. `post()` method allows caching of POST requests (unusual/unsafe)
|
|
3. No URL scheme validation (could allow `file://` protocol)
|
|
|
|
**Recommendations:**
|
|
- Always verify SSL certificates
|
|
- Add URL scheme whitelist (`http://`, `https://`)
|
|
- Disable caching for POST by default
|
|
|
|
---
|
|
|
|
### 🟡 MEDIUM: Unvalidated Clipboard Storage
|
|
|
|
**File:** `core/clipboard.py`
|
|
**Severity:** MEDIUM
|
|
**Status:** ⚠️ VULNERABLE
|
|
|
|
**Issues:**
|
|
1. No maximum length validation for clipboard text
|
|
2. No sanitization before saving to history file
|
|
3. History file stored without encryption
|
|
|
|
**Attack Vector:** A malicious actor could copy extremely large text (GBs) causing DoS via memory exhaustion.
|
|
|
|
**Recommendations:**
|
|
- Add max length limits (e.g., 10KB per entry, 1000 entries max)
|
|
- Sanitize text before storage
|
|
- Consider encrypting sensitive clipboard history
|
|
|
|
---
|
|
|
|
### 🟠 HIGH: Unsafe Plugin Loading
|
|
|
|
**File:** `core/plugin_manager.py`
|
|
**Severity:** HIGH
|
|
**Status:** ⚠️ VULNERABLE
|
|
|
|
**Issues:**
|
|
1. Uses `exec_module()` which executes arbitrary Python code
|
|
2. No signature verification for plugins
|
|
3. No sandboxing or permission system
|
|
4. No validation of plugin metadata
|
|
|
|
**Attack Vector:** A malicious plugin in the `user_plugins` directory could execute arbitrary code with user privileges.
|
|
|
|
**Recommendations:**
|
|
- Implement plugin signature verification
|
|
- Add permission manifest system for plugins
|
|
- Consider using restricted Python execution environment
|
|
- Validate plugin metadata against schema
|
|
|
|
---
|
|
|
|
### 🟡 LOW: Subprocess Usage
|
|
|
|
**Files:** Multiple (window_manager.py, notifications.py, spotify_controller.py, game_reader.py)
|
|
**Severity:** LOW
|
|
**Status:** ✅ GENERALLY SAFE
|
|
|
|
**Analysis:** Subprocess usage found but:
|
|
- Uses hardcoded, safe commands
|
|
- No user input passed to shell commands
|
|
- Timeout protections in place
|
|
|
|
**No immediate action required** but continue to audit any new subprocess additions.
|
|
|
|
---
|
|
|
|
### 🟢 LOW: No Hardcoded Credentials Found
|
|
|
|
**Status:** ✅ PASS
|
|
|
|
Searched for:
|
|
- API keys
|
|
- Passwords
|
|
- Authentication tokens
|
|
- Secret keys
|
|
|
|
None found in the codebase. Good security practice maintained.
|
|
|
|
---
|
|
|
|
## Security Improvements Made
|
|
|
|
### 1. data_store_secure.py (EXISTS)
|
|
- Path traversal protection via `PathValidator`
|
|
- Input validation for plugin IDs and keys
|
|
- Data structure validation
|
|
- Secure backup path validation
|
|
|
|
### 2. screenshot_secure.py (EXISTS)
|
|
- Filename sanitization
|
|
- Path resolution validation
|
|
- Region coordinate validation
|
|
- Window handle validation
|
|
|
|
### 3. security_utils.py (EXISTS)
|
|
- `PathValidator` class for path sanitization
|
|
- `InputValidator` class for input validation
|
|
- `DataValidator` class for data structure validation
|
|
- `IntegrityChecker` for HMAC/hash operations
|
|
|
|
---
|
|
|
|
## Recommendations
|
|
|
|
### Immediate Actions (High Priority)
|
|
|
|
1. **Replace vulnerable modules with secure versions:**
|
|
```bash
|
|
mv core/data_store.py core/data_store_vulnerable.py
|
|
mv core/data_store_secure.py core/data_store.py
|
|
|
|
mv core/screenshot.py core/screenshot_vulnerable.py
|
|
mv core/screenshot_secure.py core/screenshot.py
|
|
```
|
|
|
|
2. **Add clipboard validation:**
|
|
- Implement max text length limits
|
|
- Sanitize clipboard content
|
|
|
|
3. **Implement plugin security:**
|
|
- Add plugin signature verification
|
|
- Create permission manifest system
|
|
|
|
### Medium Priority
|
|
|
|
4. **Enhance HTTP client:**
|
|
- Add URL scheme validation
|
|
- Enable SSL verification by default
|
|
- Add request/response size limits
|
|
|
|
5. **Add audit logging:**
|
|
- Log all file operations outside data directories
|
|
- Log plugin loading/unloading
|
|
- Log security violations
|
|
|
|
### Low Priority
|
|
|
|
6. **Implement data encryption:**
|
|
- Encrypt sensitive plugin data at rest
|
|
- Encrypt clipboard history
|
|
|
|
7. **Add rate limiting:**
|
|
- Rate limit screenshot captures
|
|
- Rate limit API calls per plugin
|
|
|
|
---
|
|
|
|
## Security Test Cases
|
|
|
|
```python
|
|
# Test Path Traversal Protection
|
|
def test_path_traversal():
|
|
# Should raise SecurityError
|
|
try:
|
|
data_store._get_plugin_file("../../../etc/passwd")
|
|
assert False, "Path traversal not blocked!"
|
|
except SecurityError:
|
|
pass # Expected
|
|
|
|
# Test Filename Sanitization
|
|
def test_filename_sanitization():
|
|
# Should sanitize dangerous characters
|
|
safe = PathValidator.sanitize_filename("../../../test.txt")
|
|
assert ".." not in safe
|
|
assert "/" not in safe
|
|
|
|
# Test Input Validation
|
|
def test_clipboard_limits():
|
|
# Should reject oversized input
|
|
large_text = "x" * (10 * 1024 * 1024) # 10MB
|
|
result = clipboard_manager.copy(large_text)
|
|
assert result == False # Should fail
|
|
```
|
|
|
|
---
|
|
|
|
## Conclusion
|
|
|
|
The EU-Utility project has a solid security foundation with `security_utils.py` providing comprehensive validation utilities. However, the **original vulnerable modules are still in use** instead of the hardened versions.
|
|
|
|
**Priority 1:** Switch to the secure versions of data_store and screenshot modules.
|
|
|
|
**Priority 2:** Implement plugin sandboxing and signature verification.
|
|
|
|
With these changes, the project risk level can be reduced from MEDIUM-HIGH to LOW-MEDIUM.
|
|
|
|
---
|
|
|
|
*Report generated by Security Auditor Agent*
|
|
*EU-Utility Security Audit 2026*
|