Back to skill

Security audit

Budgetly

Security checks for vulnerabilities and agentic risk

Overview

BudgetLy is a local finance logging tool with real privacy caveats, but its storage and export behavior is mostly disclosed and no deceptive, exfiltrating, or privileged behavior was found.

Install only if you are comfortable keeping finance, balance, and tax notes as local plaintext files in ~/.local/share/budgetly. Avoid entering account numbers or highly sensitive tax details, review file permissions on shared systems, and be careful opening CSV exports in spreadsheets.

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 (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/script.sh:6
Finding

Sensitive Financial Records Are Created Without Restrictive Permissions

Content
View full analysis
/dev/null || echo " No entries yet. Use: budgetly balance " else local input="$*" local ts=$(date '+%Y-%m-%d %H:%M') echo "$ts|$input" >> "$DATA_DIR/balance.log" local total=$(wc -l < "$DATA_DIR/balance.log") echo " [Budgetly] balance: $input" echo " Saved. Total balance entries: $total" _log "balance" "$input" fi ;; ``` ```bash tax-note) shift if [ $# -eq 0 ]; then echo "Recent tax-note entries:" tail -20 "$DATA_DIR/tax-note.log" 2>/dev/null || echo " No entries yet. Use: budgetly tax-note " else local input="$*" local ts=$(date '+%Y-%m-%d %H:%M') echo "$ts|$input" >> "$DATA_DIR/tax-note.log" local total=$(wc -l < "$DATA_DIR/tax-note.log") echo " [Budgetly] tax-note: $input" echo " Saved. Total tax-note entries: $total" _log "tax-note" "$input" fi ;; ``` ### Technical Analysis BudgetLy records balances, expenses, tax information, forecasts, and other potentially sensitive financial information in plaintext files under `~/.local/share/budgetly`. The script creates the directory and files without setting a restrictive `umask` or explicitly enforcing directory and file permissions. Consequently, the resulting modes depend on the environment from which the script is invoked. Under a permissive umask, the data directory, log files, and generated exports m ...[truncated 1537 chars]
Remediation
View remediation
/dev/null || true ``` 4. Create export files atomically with restrictive permissions rather than relying only on inherited defaults. 5. Document that the application stores sensitive financial information in plaintext and recommend full-disk or home-directory encryption where appropriate. 6. Consider avoiding unnecessary duplication of sensitive content in `history.log`, or provide an option to redact sensitive values from unified history. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/script.sh:55
Finding

Unescaped Export Values Permit Malformed Output and Spreadsheet Formula Injection

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" ;; csv) echo "type,time,value" > "$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 ;; txt) echo "=== Budgetly Export ===" > "$out" for f in "$DATA_DIR"/*.log; do [ -f "$f" ] || continue echo "--- $(basename "$f" .log) ---" >> "$out" cat "$f" >> "$out" echo "" >> "$out" done ;; *) echo "Formats: json, csv, txt"; return 1 ;; esac echo "Exported to $out ($(wc -c < "$out") bytes)" } ``` ### Technical Analysis The export implementation inserts stored user-controlled values directly into JSON and CSV output without applying format-specific encoding. For JSON output, characters such as double quotes, backslashes, carriage returns, and newlines must be escaped. A value containing these characters can terminate the intended JSON string or make the ...[truncated 2465 chars]
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • 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
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (7)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The skill presents itself as a budgeting and visualization tool, but the documented behavior is largely a generic local logging system that persistently stores user-provided finance and tax data, supports search/export, and maintains a unified history log. That mismatch is security-relevant because users may disclose sensitive financial information without clearly understanding the extent of retention, indexing, and export of that data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill encourages users to record expenses, balances, and tax notes, yet it does not prominently warn that this sensitive financial information is stored in plain-text files and export artifacts under a fixed local directory. Plain-text persistence increases the risk of unintended disclosure through local compromise, backups, shared accounts, endpoint telemetry, or accidental file sharing.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest describes a skill for setting category budgets, logging expenses, and visualizing spending limits. However, the implemented commands are mostly generic append-only log buckets such as record, alert, compare, tax-note, and history, with no actual budget-setting logic, category budget enforcement, or visualization behavior; the help text even labels it a broader 'finance toolkit.'

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The export feature writes aggregated financial history from all logs into a new file on disk, increasing the concentration and portability of sensitive data without any warning or confirmation. In a budgeting skill, this is more dangerous because the data likely contains spending habits, tax notes, and other personal financial details that become easier to copy, sync, or leak once bundled.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The script stores raw financial inputs in persistent plain-text log files under the user's home directory without notice, consent flow, retention limits, or access protections. Because users may enter sensitive budgeting details, account references, or tax notes, local compromise, shared accounts, backups, or shoulder-surfing of exported files could expose private financial information.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The usage examples consistently use the yen symbol and locale-specific formatting, which can imply that the skill expects or defaults to a particular regional convention. The file does not clarify that users may supply their own currency or locale format, nor that the tool is intended for a specific region.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The manifest focuses on budgeting, expense logging, and spending-limit visualization, but this function exports every .log file in the data directory into JSON/CSV/TXT, including unrelated records like tax-note, alert, compare, and history. Bulk export of all stored finance notes is broader than the narrowly described budgeting use case.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.