Back to skill

Security audit

Fiscal

Security checks for vulnerabilities and agentic risk

Overview

This skill matches its budgeting purpose, but it handles highly sensitive financial data and credentials with several under-scoped or unsafe examples users should review before installing.

Review this skill carefully before installing. Prefer local-only mode unless you intentionally use an Actual Budget server, avoid pasting real passwords into chat or command-line flags, require HTTPS for non-local servers, preview imports/rules/categories before committing, back up your budget before bulk edits or deletes, and pin/verify fscl and skill installer versions instead of running unpinned npx commands.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:27
Finding
Actual Budget credentials may be exposed through command-line arguments and plaintext HTTP<![CDATA[ ## Vulnerability Details **File Location**: - `SKILL.md:27` - `references/commands.md:13` - `references/commands.md:152-159` - `references/command-reference.md:76` - `references/command-reference.md:97-106` **Vulnerability Type**: Credential exposure and insecure transport **Risk Level**: Medium ### Vulnerable Code Snippets `SKILL.md:27`: ```text - If a command returns `{ code: "not-logged-in" }`, ask for the server password, run `fscl login [server-url] --password <pw>`, then retry the original command. ``` `references/commands.md:152-159`: ```bash # Pull existing remote budget fscl login http://actual.local:5006 --password secret fscl init --non-interactive --mode remote \ --server-url http://actual.local:5006 --sync-id <id> # Create local, then upload to server fscl init --non-interactive --mode local --budget-name "My Budget" fscl login http://actual.local:5006 --password secret fscl budgets push --server-url http://actual.local:5006 ``` `references/command-reference.md:97-106`: ```text ## login `fscl login [server-url] [--password <pw>]` Authenticates with the Actual server and stores `serverURL` + `token` in config. If `--password` is omitted in a TTY, fscl prompts securely. Server URL resolution: 1. Positional arg (`[server-url]`) 2. `FISCAL_SERVER_URL` 3. Config `serverURL` ``` ### Technical Analysis The primary Skill instruction tells the Agent to request the user's server password and place it directly in the `fscl` process arguments. Command-line secrets can be exposed through: - Shell history - Process enumeration facilities - Terminal transcripts - Agent tool-call logs - Debugging and telemetry systems - Error reports that record the complete command The command reference expressly documents that omitting `--password` causes `fscl` to prompt securely in a TTY. The Skill nevertheless directs the Agent to use the less secure command-line option. The examples also authenticate and upload financial data through an `http://` UR ...[truncated 1940 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove `--password <pw>` from Agent-facing login instructions. 2. Use the documented secure TTY prompt: ```bash fscl login <verified-https-server-url> ``` 3. If non-interactive authentication is required, implement a protected stdin or operating-system secret-store integration that does not expose the password in process arguments. 4. Do not ask users to submit reusable passwords in ordinary chat when a secure prompt is available. 5. Require HTTPS for every non-loopback server. Reject unsupported schemes and warn before connecting to plaintext HTTP endpoints. 6. Before login, synchronization, or upload, show the normalized destination URL and obtain explicit user confirmation. 7. Default to local-only mode unless the user expressly chooses remote synchronization. 8. Ensure stored session tokens have restrictive filesystem permissions, are excluded from logs and backups where appropriate, and can be revoked through logout or server-side session management. 9. Redact passwords, tokens, server URLs containing credentials, and authentication commands from Agent logs and error messages. ]]>

T08 · Insecure Dependencies

Warning
Location
references/command-reference.md:81
Finding
Unpinned npm packages may be downloaded and executed during installation<![CDATA[ ## Vulnerability Details **File Location**: - `references/command-reference.md:81-83` - `references/commands.md:162-163` **Vulnerability Type**: Unpinned third-party dependency retrieval and execution **Risk Level**: Medium ### Vulnerable Code Snippets `references/command-reference.md:81-83`: ```text When `init` is launched through `npx fscl init`, interactive mode asks whether to install fscl globally (`npm install -g fscl`) so the `fscl` command is available afterward. Interactive `fscl init` also asks whether to install the Fiscal agent skill by running `npx skills add fiscal-sh/fscl`. ``` `references/commands.md:162-163`: ```text Interactive `fscl init` asks whether to install the Fiscal skill (`npx skills add fiscal-sh/fscl`) at the end. In non-interactive mode, run that command manually when needed. If init is run as `npx fscl init`, interactive mode also asks whether to install fscl globally with `npm install -g fscl`. ``` ### Technical Analysis The installation instructions use mutable npm package identifiers without a pinned version, lockfile, integrity hash, or signature verification. `npx` can retrieve a package from the configured registry and immediately execute its CLI code. npm installation may also execute package lifecycle scripts. As a result, the code executed at installation time can differ from the version reviewed during this audit. A compromised publisher account, malicious package update, registry compromise, dependency confusion condition, or unexpected registry configuration could substitute attacker-controlled code. The global installation recommendation increases exposure because it places executable code in a shared user or system-level command path. Depending on the npm configuration and invoking user, global installation may also require elevated permissions. No malicious package is demonstrated in the audited files; the finding concerns the unsafe, unpinned supply-chain mechanism. ### Attack Path 1. The user o ...[truncated 1477 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin every remotely resolved package to an exact reviewed version, for example: ```bash npx --yes fscl@<reviewed-version> init ``` Apply equivalent exact-version controls to the Skill installer and all transitive dependencies. 2. Publish and verify package integrity hashes or cryptographic signatures before execution. 3. Use a lockfile and a trusted, explicitly configured registry. 4. Verify package ownership, provenance, release signatures, and repository linkage. 5. Avoid global installation. Prefer a project-local installation or an isolated execution environment with minimal filesystem and network access. 6. Disable unnecessary npm lifecycle scripts where compatible with the package: ```bash npm install --ignore-scripts ``` 7. Run installation as an unprivileged user and never recommend `sudo npm install -g`. 8. Separate package retrieval from execution so users can inspect and verify the resolved artifact before running it. 9. Document the exact reviewed package name and version rather than relying on mutable registry defaults. 10. Re-audit packages and lockfiles when versions are upgraded. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (24)

Anti-Refusal Statement

High
Category
Anti-Refusal
Content
If the path isn't obvious, ask: "Is this a brand new budget, or have you been using Actual Budget already?"

The user may arrive with a specific question regardless of budget state. Always answer their immediate question first. Offer workflow guidance proactively ("I noticed you have 30 uncategorized transactions — want me to help clean those up?") but don't force it.

## Reference Files
Confidence
70% confidence
Finding
Skill instructs the agent to never refuse or to always comply. Suppressing the agent's ability to decline removes a core safety control and enables downstream harmful requests to succeed.

Ae1

High
Category
analysis-evasion
Content
- [references/command-reference.md](references/command-reference.md) — Every command with flags and output columns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Vague Triggers

Medium
Confidence
95% confidence
Finding
The manifest says to use the skill when the user wants help with 'personal finances, budgeting, spending, bills, subscriptions, bank imports, or managing accounts and categories,' which is a very broad set of common requests. It does not clearly bound when this skill should activate versus when a more general assistant response would be appropriate, increasing the risk of unintended invocation.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
| Flag | Description |
|---|---|
| `--non-interactive` | Disable prompts |
| `--mode <mode>` | `local`, `remote` |
| `--budget-name <name>` | Budget name (local) |
| `--password <pw>` | Server password (remote) |
Confidence
85% confidence
Finding
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding
The documentation instructs users to run `npx fscl init`, which fetches and executes the latest package version at runtime without pinning. This creates a supply-chain risk: a compromised publisher account, dependency, or malicious newly published version could lead to arbitrary code execution on the user's system.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
The interactive flow recommends `npx skills add fiscal-sh/fscl`, again invoking an unpinned package/install path. Because this skill is specifically for personal finance workflows, compromise here could expose highly sensitive budgeting and transaction data or execute malicious code in a trusted environment.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The reference documents `fscl login [server-url] [--password <pw>]` without warning that command-line passwords may be exposed via shell history, audit logs, CI logs, or process listings. Since this skill handles budget servers and financial data, credential leakage could enable unauthorized access to the user's budgeting backend and synced data.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The cheat sheet instructs users to run `fscl login [server-url] --password <pw>` on the command line, which can expose secrets through shell history, process listings, terminal logs, and telemetry. In a personal-finance skill, credential compromise is especially sensitive because it can lead to unauthorized access to budget data and potentially connected financial systems.

Missing User Warnings

Medium
Confidence
85% confidence
Finding
The import pipeline and rule application steps at L056-L080 include `transactions import`, `rules run --and-commit`, and `transactions categorize apply`, all of which can change persisted financial data. Although some preview steps are shown, the markdown does not explicitly warn users that these commands will commit changes and should be reviewed carefully before execution.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
Lines L148-L149 show `fscl budgets delete <id> --yes`, which is clearly destructive. While `--yes` signals confirmation bypass, the markdown itself does not warn that deleting a local budget copy may be irreversible or remove user data.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The examples include a literal password (`--password secret`) in login commands, normalizing insecure secret handling and encouraging users to paste real credentials into shell history and logs. In the context of a finance-management skill, this is more dangerous because exposed credentials may grant access to sensitive budgeting and account data.

Rp1

Medium
Category
MCP Rug Pull
Confidence
82% confidence
Finding
The documentation recommends running `npx skills add fiscal-sh/fscl` without pinning an exact package version. This can cause users to execute whatever package version is current at install time, increasing supply-chain risk if a malicious or compromised update is published. In a skill-install context, this is more dangerous because the command directly installs code into the user's environment.

Rp1

Medium
Category
MCP Rug Pull
Confidence
78% confidence
Finding
The example `npx fscl init` references an unpinned package, so users may execute a different version than the author tested. This exposes users to dependency drift and supply-chain compromise if the package or one of its transient dependencies is maliciously updated. Because the command is presented as part of initialization flow, it is likely to be copied and executed verbatim.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The guide explicitly encourages use of `--show-rows`, which prints full imported transaction rows including dates, amounts, payees, categories, and notes. In a personal finance skill, those fields are highly sensitive financial data, and the documentation does not clearly warn that this output may expose private information in terminal logs, transcripts, screenshots, or shared agent sessions.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The documentation presents retroactive rule execution commands that can bulk-modify existing transactions, but it does not prominently warn that running the non-dry-run variants will change transaction data across the budget. In a personal finance skill, this can lead to accidental mass recategorization, payee rewrites, amount/date changes, or transfer creation errors if a rule is too broad or incorrect.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The example `fscl rules run --and-commit` is especially risky because it signals an irreversible bulk-apply operation without an adjacent warning about committing changes to many existing transactions. Since rules can alter categories, payees, dates, amounts, and cleared state, an overly broad or mistaken rule could silently corrupt financial records at scale.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The monthly cycle is framed as something to run whenever the user imports transactions or at the start of a new month, which is broad enough to trigger a multi-step workflow with state-changing commands from relatively routine prompts. In a personal finance skill, ambiguous activation is risky because it can cascade into imports, rule execution, categorization, and budget changes without a narrowly scoped user request for each action.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The workflow includes `fscl rules run --and-commit`, which applies transaction rules and commits changes, but it does not require an explicit warning or confirmation before execution. In financial software, misapplied rules can bulk-modify transaction categorization or related records at scale, making mistakes difficult to detect and potentially corrupting the user's budget history.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The budget adjustment section provides direct commands to move money between categories and apply monthly edits, but it does not instruct the agent to warn the user that these actions alter the user's financial plan. Because these commands change allocations and can affect overspending coverage, savings goals, and future budgeting decisions, unconfirmed execution can have material financial consequences.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The proactive monitoring section instructs the agent to flag and potentially act on issues without being asked, creating a risk of unsolicited invocation and drift from user intent. In a finance-management context, this is more dangerous because autonomous surfacing of issues can lead to follow-on recommendations or changes involving sensitive financial data and account state.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The workflow instructs users to collect and import OFX/QFX/CSV bank export files, which commonly contain highly sensitive financial data such as account numbers, balances, merchants, and transaction history, but it provides no privacy or data-handling warning. In a budgeting skill that actively solicits and processes personal finance records, omission of guidance about minimizing exposure, confirming file provenance, and avoiding unnecessary sharing increases the chance of unsafe handling of sensitive data.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The workflow instructs deletion and merge operations on budget categories, including a force-style `--yes` flag, without requiring a clear user-facing warning about irreversible or hard-to-reverse data changes. In a personal finance context, category merges and deletions can silently rewrite historical organization and impair reporting accuracy if the wrong target is chosen.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The payee cleanup step directs renaming and merging payees without warning that these actions can relabel historical transactions in bulk and change search/reporting behavior. In budgeting software, mistaken payee consolidation can corrupt spending attribution across many records, especially when merchants with similar names are incorrectly merged.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The workflow instructs applying categorization drafts and running rules with `--and-commit`, which can perform bulk automated modifications, without an explicit warning about the breadth of the changes or the need for review before commit. In a financial recordkeeping skill, erroneous categorization or rules can propagate across many transactions and degrade budget integrity quickly.

Static analysis

No suspicious patterns detected.