Back to skill

Security audit

Personal Bookkeeper

Security checks for vulnerabilities and agentic risk

Overview

This is a local finance logger, but it overstates its bookkeeping capability and persists sensitive financial text without built-in protection.

Treat this as a simple plaintext note logger, not a real double-entry accounting tool. Install only if you are comfortable storing financial notes under ~/.local/share/personal-bookkeeper and managing file permissions, exports, deletion, and spreadsheet-import safety 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 (3)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/script.sh:6
Finding

Sensitive financial records are created without restrictive filesystem permissions

Content
View full analysis
> "$DATA_DIR/history.log"; } ``` Representative financial-record write: ```bash echo "$ts|$input" >> "$DATA_DIR/record.log" ``` Equivalent writes are used for categorization, balances, forecasts, reports, budget checks, summaries, alerts, history, comparisons, and tax notes. ### Technical Analysis The script stores personal financial information in plaintext but does not establish a restrictive `umask` or explicitly set permissions on the data directory, log files, or export files. Consequently, their permissions depend on the environment from which the script is invoked. For example, under a permissive `umask`, newly created files could be readable by other local users. The affected information can include account balances, expenses, income, transaction history, forecasts, and tax notes. Export files created by the same program inherit the same weakness. The documented use of plaintext storage is not inherently malicious, but failing to enforce least-privilege permissions for sensitive financial records creates a local confidentiality vulnerability. ### Attack Path 1. A user invokes the bookkeeping tool in an environment with a permissive `umask`. 2. The script creates `~/.local/share/personal-bookkeeper` and its log or export files without explicit restrictive modes. 3. The resulting permissions allow another local account or process operating under a different identity to traverse the directory or read its files. 4. The local attacker reads the stored financial records or generated exports. This attack requires local access and filesyste ...[truncated 559 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/script.sh:74
Finding

CSV export allows spreadsheet formula injection

Content
View full analysis
"$out" for f in "$DATA_DIR"/*.log; do [ -f "$f" ] || continue local name=$(basename "$f" .log) while IFS='|' read -r ts val; do echo "$name,$ts,$val" >> "$out" done < "$f" done ;; ``` ### Technical Analysis The `value` field originates from user-controlled bookkeeping input and is copied directly into a CSV row. The implementation neither applies standards-compliant CSV quoting nor neutralizes values beginning with spreadsheet formula indicators such as `=`, `+`, `-`, or `@`. When the resulting export is opened in spreadsheet software, a crafted value may be interpreted as a formula rather than inert text. Embedded commas, quotation marks, carriage returns, or newlines can also alter the intended column or row structure. This is especially relevant because `SKILL.md` explicitly presents CSV export as a file that can be handed to an accountant for use in spreadsheet software. ### Attack Path 1. An attacker supplies, imports through human interaction, or persuades the user to record a value beginning with a formula marker. For example, the input could begin with `=HYPERLINK(...)` or another spreadsheet expression. 2. The application saves the value unchanged in a log file. 3. The user runs `personal-bookkeeper export csv`. 4. The export routine writes the crafted value directly into a CSV cell without quoting or formula neutralization. 5. The user or an accountant opens the CSV file in spreadsheet software. 6. If that software evaluates formulas from imported CSV files, the attacker-controlled expression executes in the spreadsheet context. Actual effects depend on spreadsheet security settings and supported formula features. ### Impact Assessment A successful exploit can cause m ...[truncated 477 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
scripts/script.sh:60
Finding

JSON export inserts unescaped user-controlled data

Content
View full analysis
"$out" local first=1 for f in "$DATA_DIR"/*.log; do [ -f "$f" ] || continue local name=$(basename "$f" .log) while IFS='|' read -r ts val; do [ $first -eq 1 ] && first=0 || echo "," >> "$out" printf ' {"type":"%s","time":"%s","value":"%s"}' "$name" "$ts" "$val" >> "$out" done < "$f" done echo "" >> "$out" echo "]" >> "$out" ;; ``` ### Technical Analysis The script constructs JSON by interpolating values into a JSON template. It does not escape quotation marks, backslashes, control characters, or line breaks according to JSON string-encoding rules. Because `val` derives from user-controlled financial entries, crafted input can terminate the intended string, add JSON tokens, or make the entire document invalid. Even ordinary input containing a quotation mark or backslash can corrupt the export. The exact downstream effect depends on how a consumer handles the generated file. Strict parsers will generally reject malformed output, while permissive or unsafe downstream processing may interpret attacker-influenced structure. ### Attack Path 1. An attacker causes a crafted bookkeeping value containing quotation marks, backslashes, control characters, or JSON syntax to be recorded. 2. The user runs `personal-bookkeeper export json`. 3. The export function places the crafted value directly between JSON quotation marks. 4. The generated file becomes malformed or contains unintended attacker-controlled JSON structure. 5. A downstream program parses or otherwise trusts the export. 6. The downstream process may fail, import incorrect data, or act on fields that were not intended by the exporter. This issue does not independently execute shell commands because `printf` receives t ...[truncated 508 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (5)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The skill is presented as a bookkeeping tool, but the documented behavior is largely generic plaintext note-taking with broad persistent storage, search, export, and history capabilities. That mismatch can mislead users and higher-level agents into supplying sensitive financial data under the assumption of structured accounting behavior, while the skill instead stores and re-exposes raw data in local files without any declared permission model or privacy boundaries.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The script silently creates a persistent data directory under the user's home directory and logs user-supplied content there, including likely financial information. In the context of a personal finance tool, silent persistence of sensitive data without an explicit warning, consent flow, retention policy, or file-permission hardening creates a real privacy and confidentiality risk.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The advertised capability is double-entry bookkeeping and finance analysis, but the implementation is only a generic append-only logger with many arbitrary labels. This mismatch is dangerous because users may trust the tool with sensitive financial records expecting accounting controls, validation, balancing, and structured handling that do not exist, leading to misuse, data integrity issues, and overcollection of private data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The export function consolidates all log data into a single disk file in JSON, CSV, or TXT format, which materially increases the sensitivity and portability of the stored financial data. Without a clear warning, consent, destination control, or protective permissions, this makes accidental disclosure or secondary exfiltration much easier.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The search and recent commands enable broad retrieval of previously stored financial notes, which expands the skill from transaction logging into generic local data discovery. In a finance context, that increases exposure of sensitive records to anyone or any agent invoking the script and is not clearly necessary for the stated bookkeeping function.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.