Back to skill

Security audit

Invoice & Expense Tracker

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent local invoice tracker, but users should understand it saves financial records as plaintext files in the current project.

Install only if you are comfortable keeping invoice and expense details in local plaintext files under the working directory. Keep ./data and ./exports out of source control and shared folders, avoid storing account numbers or tax identifiers, and review entries and CSV exports before relying on them for bookkeeping or accounting imports.

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
SKILL.md:22
Finding
Plaintext Storage and Duplication of Sensitive Financial Records<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:22`, `SKILL.md:150-151`, `SKILL.md:164`, and `SKILL.md:175` **Vulnerability Type**: Plaintext sensitive-data storage **Risk Level**: Medium ### Vulnerable Code Snippets `SKILL.md:22`: ```markdown 2. **Maintain a local JSON ledger** at `./data/ledger.json`. Create it if it doesn't exist. ``` `SKILL.md:150-151`: ```markdown ledger.json # Main ledger (append-only pattern) ledger.backup.json # Auto-backup before any write ``` `SKILL.md:164`: ```markdown 1. **Always backup** — Before writing to ledger.json, copy current state to ledger.backup.json ``` `SKILL.md:175`: ```markdown - **Ledger is plaintext JSON.** Remind users not to store this in public repos. ``` ### Technical Analysis The Skill explicitly directs the Agent to persist financial records in an unencrypted JSON file under the current working directory. The documented schema includes transaction amounts, currencies, vendors, dates, descriptions, invoice states, due dates, tags, and notes. These fields can reveal confidential personal or business activity. The required backup procedure duplicates the same information into another plaintext file. This increases the number of sensitive artifacts that must be protected and can preserve historical records after the primary ledger changes. The append-only and soft-deletion design can also retain data longer than a user expects. Using project-relative paths provides no assurance that the files receive restrictive permissions or remain outside source-control repositories, synchronized folders, shared workspaces, or broadly readable directories. The warning not to commit the ledger does not technically enforce confidentiality. ### Attack Path 1. A user invokes the Skill and submits invoice or expense information. 2. The Agent writes the transaction to `./data/ledger.json`. 3. Before a later update, the Agent copies the existing ledger to `./data/ledger.backup.json`. 4. T ...[truncated 1422 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Store ledgers in a user-specific private application-data directory rather than inside the project working directory. 2. Create ledger, backup, and export files with owner-only permissions, such as mode `0600`, and create containing directories with mode `0700` where supported. 3. Encrypt sensitive ledger and backup contents at rest using an established authenticated-encryption implementation. 4. Store encryption keys in the operating system's credential store or keychain rather than alongside the ledger. 5. Add `data/`, `exports/`, ledger filenames, backups, and temporary files to `.gitignore` and equivalent packaging exclusions. 6. Detect whether the destination resides inside a source repository or shared directory and require explicit confirmation before writing. 7. Obtain explicit consent before persisting financial information and clearly document the storage location and retention policy. 8. Provide secure deletion and configurable retention for backups instead of indefinitely retaining all historical records. 9. Avoid making a plaintext backup before every write. Use encrypted, permission-restricted backups and atomic file replacement. 10. Minimize collected data and reject unnecessary secrets, payment-card data, bank-account numbers, government identifiers, or credentials. 11. Add startup checks that verify file ownership and permissions, refusing to operate when sensitive files are accessible to unintended users. ]]>
Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (4)

Vague Triggers

Medium
Confidence
91% confidence
Finding
The README presents very broad natural-language commands such as payments, invoicing, reporting, and export requests without defining clear trigger boundaries, confirmation requirements, or exclusion conditions. In a conversational assistant, this can cause accidental invocation or misinterpretation of ordinary discussion as bookkeeping actions, leading to unintended financial record creation, modification, or export.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The skill handles sensitive financial data and can generate/export accounting records, but the description does not warn users about privacy, data accuracy, or the risks of exporting records for downstream accounting systems. This omission increases the chance users will supply sensitive business data without understanding retention, exposure, or the need to verify generated records before relying on them for bookkeeping.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The skill is designed to trigger on very broad natural-language cues like 'spending, paying, receiving, or invoicing,' which can cause it to capture and persist financial information from ordinary conversation without sufficiently explicit user intent. In a finance skill that writes to disk, this increases the risk of unintended ledger entries, privacy issues, and accidental retention of sensitive business data.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill stores financial records in local plaintext JSON and exports CSVs, but it does not provide a clear up-front warning at activation time that user financial data will be persistently written to disk. Because this includes vendor names, amounts, dates, and potentially sensitive business records, users may disclose data without realizing it will be retained in unencrypted local files.

Static analysis

No suspicious patterns detected.