Back to skill

Security audit

Watchboard Intelligence

Security checks for vulnerabilities and agentic risk

Overview

The skill appears purpose-aligned, but its shared temporary cache creates a real local file-safety and cache-poisoning risk users should review before installing.

Install only if you are comfortable with queries going to watchboard.dev and with responses being cached under /tmp/watchboard-cache. Avoid running it with elevated privileges or on shared systems unless the cache handling is changed to a private per-user directory with restrictive permissions.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/watchboard.py:27
Finding

Predictable Shared Temporary Cache Permits Symlink Attacks and Cache Poisoning

Content
View full analysis
bytes: """Fetch URL with local file cache.""" CACHE_DIR.mkdir(parents=True, exist_ok=True) safe_name = re.sub(r'[^\w\-.]', '_', url.replace('https://', '')) cache_file = CACHE_DIR / safe_name if not force and cache_file.exists(): age = time.time() - cache_file.stat().st_mtime if age < CACHE_TTL: return cache_file.read_bytes() req = urllib.request.Request(url, headers={"User-Agent": "OpenClaw-Watchboard/2.0"}) try: with urllib.request.urlopen(req, timeout=30) as resp: data = resp.read() cache_file.write_bytes(data) return data except urllib.error.HTTPError as e: print(json.dumps({"error": f"HTTP {e.code}", "url": url})) sys.exit(1) except Exception as e: print(json.dumps({"error": str(e), "url": url})) sys.exit(1) ``` ### Technical Analysis The application stores cached network responses in the fixed, predictable directory `/tmp/watchboard-cache`. It creates that directory without setting or validating restrictive permissions and does not verify that the directory is owned by the current user. Cache filenames are deterministic because they are derived from fixed, publicly documented API URLs. Although invalid filename characters are replaced, this sanitization does not address filesystem race conditions or pre-existing malicious files. The calls to `Path.exists()`, `Path.stat()`, `Path.read_bytes()`, and `Path.write_bytes()` follow symbolic links. The implementation does not reject sym ...[truncated 2749 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (2)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill advertises network access and local caching behavior but does not declare any explicit tool scope or permissions boundary. In agent environments, this can lead to overbroad execution where the skill may use file and network capabilities without clear user/admin approval, increasing the risk of unintended data exfiltration, local file interaction, or policy bypass.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The skill description does not clearly warn users that invoking it sends requests to an external service and stores fetched content locally in /tmp/watchboard-cache/. This reduces informed consent and can expose sensitive user queries or retrieved data to third-party infrastructure or other local users/processes via temporary-file caching.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.