Back to skill

Security audit

Divorce

Security checks for vulnerabilities and agentic risk

Overview

The skill is purpose-aligned and local-only, but it handles very sensitive divorce and financial information with under-scoped plaintext storage and output behavior users should review before installing.

Review this skill carefully before installing. It appears local-only and not malicious, but it may store sensitive divorce and financial details in plaintext and show them in logs or terminal output. Use it only in an encrypted, private environment, avoid entering details you would not want retained locally, and check file permissions and deletion practices yourself.

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/financial_inventory.py:10
Finding
Sensitive Divorce and Financial Data Stored and Exposed in Plaintext<![CDATA[ ## Vulnerability Details **File Location**: `scripts/financial_inventory.py`, lines 10-57 **Vulnerability Type**: Plaintext sensitive-data storage and exposure through command-line arguments and standard output **Risk Level**: Medium ### Vulnerable Code ```python DIVORCE_DIR = os.path.expanduser("~/.openclaw/workspace/memory/divorce") def ensure_dir(): os.makedirs(DIVORCE_DIR, exist_ok=True) def main(): parser = argparse.ArgumentParser(description='Build financial inventory') parser.add_argument('--type', required=True, choices=['asset', 'debt', 'account', 'property', 'retirement'], help='Type of financial item') parser.add_argument('--description', required=True, help='Description') parser.add_argument('--value', type=float, help='Current value') parser.add_argument('--joint', action='store_true', help='Jointly owned') args = parser.parse_args() item_id = f"FIN-{str(uuid.uuid4())[:6].upper()}" item = { "id": item_id, "type": args.type, "description": args.description, "value": args.value, "joint": args.joint, "added_at": datetime.now().isoformat() } # Load and save inventory_file = os.path.join(DIVORCE_DIR, "financial_inventory.json") data = {"items": []} if os.path.exists(inventory_file): with open(inventory_file, 'r') as f: data = json.load(f) data['items'].append(item) ensure_dir() with open(inventory_file, 'w') as f: json.dump(data, f, indent=2) print(f"✓ Financial item logged: {item_id}") print(f" Type: {args.type}") print(f" Description: {args.description}") if args.value: print(f" Value: ${args.value:,.2f}") print(f" Joint: {'Yes' if args.joint else 'No'}") ``` ### Technical Analysis The script processes highly sensitive divorce and financial information, including asset description ...[truncated 2702 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Enforce restrictive filesystem permissions** - Create the storage directory with owner-only permissions such as `0700`. - Create the inventory file with mode `0600`. - Inspect and correct permissions on existing directories and files rather than relying on the current umask. - Reject symbolic links and verify that the resolved destination remains inside the expected storage directory. 2. **Encrypt sensitive records** - Protect the JSON content with authenticated encryption. - Store encryption keys in an operating-system keychain or another dedicated secret store, not alongside the encrypted data. - If encrypted filesystem storage remains an external prerequisite, clearly disclose that limitation and verify the protection where practical rather than claiming it is enforced by the skill. 3. **Avoid command-line exposure** - Collect sensitive descriptions and values through protected interactive input, standard input, or a file descriptor with restrictive permissions. - Do not place private financial information in command-line arguments that may be retained in shell history or exposed through process inspection. 4. **Minimize output disclosure** - Do not print descriptions or exact values by default. - Return only the generated record identifier and a success message. - Require an explicit option to display sensitive details and warn that output may be logged. 5. **Use atomic, secure file updates** - Write updates to an owner-only temporary file in the same protected directory. - Flush and synchronize the content before atomically replacing the destination. - Preserve restrictive permissions during replacement and safely handle malformed or corrupted existing data. 6. **Reduce stored data** - Collect only fields required for the stated workflow. - Provide documented retention, export, and secure-deletion controls appropriate for sensitive divorce records. ]]>
Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (2)

Lp3

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The skill describes file read/write behavior by storing and updating sensitive divorce records under `memory/divorce/`, but it does not declare an explicit tool scope such as `permissions` or `allowed-tools`. In a highly sensitive context involving financial, custody, and legal-preparation data, undeclared file capabilities weaken least-privilege controls and can allow broader-than-intended filesystem access or ambiguous runtime authorization.

Vague Triggers

Medium
Confidence
90% confidence
Finding
The description says to use the skill when the user mentions "separation," which is a broad term that can refer to many non-divorce contexts such as relationship difficulties, physical separation, or general emotional distress. The trigger guidance does not include exclusion conditions or negative examples to clarify when the skill should not activate.

Static analysis

No suspicious patterns detected.