Back to skill

Security audit

Verifier

Security checks for vulnerabilities and agentic risk

Overview

This skill appears local and non-malicious, but it needs review because it advertises broad trust judgments while using simple scoring and storing potentially sensitive cases in plaintext without enforced private permissions.

Install only if you are comfortable with a lightweight local case tracker that gives rule-based trust summaries rather than independent verification. Do not store passwords, tokens, private keys, or unnecessary personal details in cases, and prefer a host where your OpenClaw memory directory is private to your user account.

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/lib/storage.py:6
Finding
Potentially Sensitive Case Data Stored Without Restrictive File Permissions## Vulnerability Details **File Location**: `scripts/lib/storage.py:6-27` and `scripts/init_storage.py:6-16` **Vulnerability Type**: Plaintext sensitive-data storage with permissions dependent on the process umask **Risk Level**: Medium ### Vulnerable Code `scripts/lib/storage.py:6-27`: ```python VERIFIER_DIR = os.path.expanduser("~/.openclaw/workspace/memory/verifier") CASES_FILE = os.path.join(VERIFIER_DIR, "cases.json") def ensure_dir(): os.makedirs(VERIFIER_DIR, exist_ok=True) def _safe_load(path, default): ensure_dir() if not os.path.exists(path): return default try: with open(path, "r", encoding="utf-8") as f: return json.load(f) except (json.JSONDecodeError, OSError): return default def _atomic_save(path, data): ensure_dir() tmp = path + ".tmp" with open(tmp, "w", encoding="utf-8") as f: json.dump(data, f, indent=2, ensure_ascii=False) os.replace(tmp, path) ``` `scripts/init_storage.py:6-16`: ```python VERIFIER_DIR = os.path.expanduser("~/.openclaw/workspace/memory/verifier") CASES_FILE = os.path.join(VERIFIER_DIR, "cases.json") def write_json_if_missing(path, payload): if not os.path.exists(path): with open(path, "w", encoding="utf-8") as f: json.dump(payload, f, indent=2, ensure_ascii=False) def main(): os.makedirs(VERIFIER_DIR, exist_ok=True) write_json_if_missing(CASES_FILE, { ``` ### Technical Analysis The Skill stores arbitrary claims, suspicious messages, profile information, offers, notes, source labels, and evidence in a plaintext JSON file under the user's home directory. This information may contain personal, confidential, or security-sensitive data. The storage directory, final JSON file, and predictable temporary file are created without explicit owner-only permissions. Their permissions consequently depend on the process umask. Under a common `022` umask, newly created directories are typically mode `0755` and files m ...[truncated 1776 chars]
Remediation
## Remediation Suggestions 1. Create the storage directory with owner-only permissions and repair permissions if it already exists: ```python def ensure_dir(): os.makedirs(VERIFIER_DIR, mode=0o700, exist_ok=True) os.chmod(VERIFIER_DIR, 0o700) ``` 2. Securely create the temporary file with mode `0600` rather than relying on the process umask: ```python def _atomic_save(path, data): ensure_dir() tmp = path + ".tmp" fd = os.open(tmp, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600) try: with os.fdopen(fd, "w", encoding="utf-8") as f: json.dump(data, f, indent=2, ensure_ascii=False) f.flush() os.fsync(f.fileno()) os.replace(tmp, path) os.chmod(path, 0o600) except Exception: try: os.unlink(tmp) except OSError: pass raise ``` 3. Prefer `tempfile.NamedTemporaryFile` in the same directory with restrictive permissions and a non-predictable name, followed by `os.replace()`. 4. During initialization, inspect and correct permissions on an existing storage directory and `cases.json`. 5. Document that case records are stored in plaintext and advise users not to include credentials, authentication tokens, private keys, or unnecessary personal data. 6. If the deployment threat model includes hostile local users or compromised backups, provide authenticated encryption at rest with keys stored separately from the case database.
Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (6)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
A second description-behavior mismatch reinforces that the skill presents itself as capable of trust, safety, and manipulation analysis while apparently only managing case data and updates. In a trust-evaluation context, this is especially dangerous because users may rely on non-existent analysis to judge scams, offers, or suspicious messages.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
A second description-behavior mismatch reinforces that the skill presents itself as capable of trust, safety, and manipulation analysis while apparently only managing case data and updates. In a trust-evaluation context, this is especially dangerous because users may rely on non-existent analysis to judge scams, offers, or suspicious messages.

Lp3

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding
The skill declares local file storage and case-management scripts but does not define any explicit tool scope or allowed-tools boundary. That creates an authorization ambiguity where an agent may infer broader read/write capability than intended, increasing the chance of unintended filesystem access or persistence beyond the expected case file.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The activation description is broad enough to trigger on many ordinary 'is this safe/true/trustworthy' requests without defining boundaries or escalation conditions. In combination with the capability mismatch, this can over-route sensitive trust decisions to a skill that may not actually verify evidence, increasing the risk of misleading guidance.

Missing User Warnings

Low
Confidence
85% confidence
Finding
The helper performs persistent writes by creating a temporary JSON file and replacing the target file under ~/.openclaw/workspace/memory/verifier, but there is no confirmation prompt, logging, or explanatory comment indicating that user data will be stored locally. This is a safety-relevant file operation, and the file itself provides no user disclosure about the persistence behavior.

Missing User Warnings

Low
Confidence
79% confidence
Finding
This script persists changes by calling save_cases(data), which modifies stored case records after scoring. Although it prints a success message afterward, there is no comment, docstring, or pre-action disclosure warning the user that running the command will overwrite stored case fields such as verdict, confidence, and timestamps.

Static analysis

No suspicious patterns detected.