Back to skill

Security audit

Manage PocketSmith transactions, categories, budgets and financial data

Security checks for vulnerabilities and agentic risk

Overview

The skill is a legitimate PocketSmith finance integration, but it needs Review because it can change or delete financial records and its advertised write protection is not enforced across its public API.

Install only if you are comfortable giving the agent access to PocketSmith financial data. Keep POCKETSMITH_ALLOW_WRITES unset for read-only use, and if you enable it, require manual confirmation before any create, update, delete, category deletion, or forecast refresh action. Prefer a locked dependency install and avoid letting agents import the Python API directly for write operations until write protection is enforced at the client/API layer.

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
src/pocketsmith/cli.py:24
Finding

Write Protection Is Bypassable Through the Public Python API

Content
View full analysis
Callable: """Decorator that checks if write operations are allowed before executing.""" @functools.wraps(func) def wrapper(*args, **kwargs): if os.environ.get("POCKETSMITH_ALLOW_WRITES", "").lower() != "true": raise WritesDisabledError() return func(*args, **kwargs) return wrapper ``` However, public API methods perform mutating requests without applying an equivalent check: ```python def delete_transaction(self, transaction_id: int) -> None: """Delete a transaction. Args: transaction_id: The transaction ID. """ self._client.delete(f"/transactions/{transaction_id}") ``` ```python def delete_category(self, category_id: int) -> None: """Delete a category. Note: This deletes all budgets within the category and uncategorizes all transactions assigned to it. Args: category_id: The category ID. """ self._client.delete(f"/categories/{category_id}") ``` ```python def delete_forecast_cache(self, user_id: int) -> None: """Delete and refresh the forecast cache for a user. This recalculates and refreshes the user's cached forecast. Args: user_id: The user ID. """ self._client.delete(f"/users/{user_id}/forecast_cache") ``` The same issue affects the public transaction and category create and update methods. ### Technical Analysis The project advertises write operations as disabled by default unless `POCKETSMITH_ALLOW_WRITES=true`. This restriction is enforced only by decorators attached to CLI handlers. It is not enforced by `Po ...[truncated 1963 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
pyproject.toml:6
Finding

Mutable Dependency Resolution Without a Committed Lockfile

Content
View full analysis
=0.27.0", ] ``` The build dependency is also unconstrained: ```toml [build-system] requires = ["hatchling"] build-backend = "hatchling.build" ``` The documented installation process resolves these dependencies dynamically: ```bash # Install dependencies cd pocketsmith uv sync ``` No dependency lockfile is present in the audited project. ### Technical Analysis The project uses a lower-bound-only constraint for `httpx` and no version constraint for `hatchling`. Without a committed and reviewed lockfile, an initial `uv sync` can install dependency versions that were not included in this audit. This creates a mutable software supply chain. A future incompatible or compromised dependency release could be selected automatically. Build-system dependencies are particularly sensitive because they may execute during package installation, while runtime HTTP dependencies operate in the same process that has access to the PocketSmith developer key and sensitive financial responses. No evidence was found that the currently named packages are malicious or typosquatted. The finding concerns the absence of reproducible, reviewed dependency resolution rather than confirmed malicious package contents. ### Attack Path 1. A user follows the documented installation instructions and runs `uv sync`. 2. Because no audited lockfile constrains resolution, the package manager queries configured package indexes for matching releases. 3. A future compromised, malicious, or unexpectedly incompatible release satisfies the declared version constraints. 4. The dependency is downloaded and installed. 5. Build dependency code m ...[truncated 1038 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (25)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · IMPLEMENTATION_NOTES.md (reported line 34)May include surrounding context.

md
- [x] **Transactions**
  - `GET /transactions/{id}` - Get single transaction
  - `PUT /transactions/{id}` - Update transaction
  - `DELETE /transactions/{id}` - Delete transaction
  - `GET /users/{id}/transactions` - List by user
  - `GET /accounts/{id}/transactions` - List by account
  - `GET /categories/{id}/transactions` - List by categories

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · IMPLEMENTATION_NOTES.md (reported line 46)May include surrounding context.

md
- `GET /users/{id}/categories` - List categories
  - `POST /users/{id}/categories` - Create category
  - `PUT /categories/{id}` - Update category
  - `DELETE /categories/{id}` - Delete category

- [x] **Labels**
  - `GET /users/{id}/labels` - List labels

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · IMPLEMENTATION_NOTES.md (reported line 55)May include surrounding context.

md
- `GET /users/{id}/budget` - List budget (per-category analysis)
  - `GET /users/{id}/budget_summary` - Get budget summary
  - `GET /users/{id}/trend_analysis` - Get trend analysis
  - `DELETE /users/{id}/forecast_cache` - Refresh forecast cache

### To Do

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · IMPLEMENTATION_NOTES.md (reported line 64)May include surrounding context.

md
- `GET /category_rules/{id}` - Get category rule
  - `POST /categories/{id}/category_rules` - Create category rule
  - `PUT /category_rules/{id}` - Update category rule
  - `DELETE /category_rules/{id}` - Delete category rule

- [ ] **Events**
  - `GET /users/{id}/events` - List events

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · IMPLEMENTATION_NOTES.md (reported line 71)May include surrounding context.

md
- `GET /events/{id}` - Get event
  - `POST /users/{id}/events` - Create event
  - `PUT /events/{id}` - Update event
  - `DELETE /events/{id}` - Delete event

- [ ] **Institutions**
  - `GET /users/{id}/institutions` - List institutions

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · IMPLEMENTATION_NOTES.md (reported line 78)May include surrounding context.

md
- `GET /institutions/{id}` - Get institution
  - `POST /users/{id}/institutions` - Create institution
  - `PUT /institutions/{id}` - Update institution
  - `DELETE /institutions/{id}` - Delete institution

- [ ] **Accounts**
  - `GET /users/{id}/accounts` - List accounts

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · IMPLEMENTATION_NOTES.md (reported line 85)May include surrounding context.

md
- `GET /accounts/{id}` - Get account
  - `POST /users/{id}/accounts` - Create account
  - `PUT /accounts/{id}` - Update account
  - `DELETE /accounts/{id}` - Delete account

- [ ] **Transaction Accounts**
  - `GET /users/{id}/transaction_accounts` - List transaction accounts

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · IMPLEMENTATION_NOTES.md (reported line 97)May include surrounding context.

md
- `GET /attachments/{id}` - Get attachment
  - `POST /transactions/{id}/attachments` - Create attachment
  - `PUT /attachments/{id}` - Update attachment
  - `DELETE /attachments/{id}` - Delete attachment

## Architecture

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
90% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · README.md (reported line 95)May include surrounding context.

2. Set Environment Variables

For Claude Code (~/.claude/settings.json):

json
{

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
90% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · README.md (reported line 132)May include surrounding context.

2. Set Environment Variables

For Claude Code (~/.claude/settings.json):

json
{

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · README.md (reported line 12)May include surrounding context.

md
- **Transactions** - List, view, create, update, and delete transactions
- **Categories** - Full CRUD for spending categories
- **User Info** - View authenticated user details
- **Write Protection** - Safe by default, write operations require explicit opt-in

## Installation

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

Scanner excerpt · README.md (reported line 24)May include surrounding context.

bash
# Clone into your personal skills directory
mkdir -p ~/.claude/skills
cd ~/.claude/skills
git clone https://github.com/lextoumbourou/pocketsmith-skill.git pocketsmith

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Content

Scanner excerpt · README.md (reported line 37)May include surrounding context.

bash
# Clone into your project's skills directory
mkdir -p .claude/skills
cd .claude/skills
git clone https://github.com/lextoumbourou/pocketsmith-skill.git pocketsmith

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The README states that Claude Code will 'automatically load the skill when relevant' without defining narrow trigger conditions or requiring explicit user confirmation. In an agent environment, broad relevance matching can cause the skill to be invoked on loosely related prompts, increasing the chance of unintended access to financial data or execution of account-modifying commands if writes are enabled.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The natural-language examples encourage the agent to act on broad requests like 'Show me my PocketSmith transactions' or 'Categorize transaction 123456' without stating that explicit invocation or confirmation may be required. This makes it more likely an agent will infer permission and perform sensitive reads or writes based solely on conversational similarity.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill accesses sensitive environment data and performs networked API operations, but it does not declare an explicit tool scope such as permissions or allowed-tools. This creates ambiguity about what capabilities the skill is expected to use and weakens least-privilege controls, increasing the risk of unintended secret exposure or unauthorized external API access in agent runtimes that rely on manifest-declared scope.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This code file performs an irreversible delete operation on a transaction, but the method only contains a brief technical docstring and no confirmation prompt, warning text, or user-facing disclosure. Under the code-file criteria, destructive operations should include some visible warning unless the risk is clearly disclosed.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

Although the docstring notes that deleting a category also deletes all budgets within it and uncategorizes assigned transactions, there is no visible confirmation prompt or stronger user-facing safeguard in the code for this irreversible action. This is a safety-critical destructive operation with cascading effects on user data.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The manifest says the skill manages PocketSmith transactions, categories, and financial data via the API, which naturally covers transaction/category CRUD and data retrieval. However, this file also exposes broader budgeting, trend analysis, and forecast-cache deletion operations that go beyond the specifically described transactions/categories scope and add administrative-style financial analysis capabilities.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · IMPLEMENTATION_NOTES.md (reported line 7)May include surrounding context.

md
from .auth import get_developer_key

BASE_URL = "https://api.pocketsmith.com/v2"


class PocketSmithClient:

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · src/pocketsmith/client.py (reported line 9)May include surrounding context.

python
from .auth import get_developer_key

BASE_URL = "https://api.pocketsmith.com/v2"


class PocketSmithClient:

Unverifiable Dependency: httpx has 2 known advisory(ies) (CVE-2021-41945 (Improper Input Validation in httpx); CVE-2021-41945 (Encode OSS httpx <=1.0.0.beta0 is affected by improper input validation in `http)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: pytest has 2 known advisory(ies) (CVE-2025-71176 (pytest has vulnerable tmpdir handling); CVE-2025-71176 (pytest has vulnerable tmpdir handling)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

The method issues a delete request that invalidates and refreshes cached forecast data, but there is no visible confirmation, prompt, or user-facing disclosure in the code. While less severe than deleting primary records, it still changes user-visible system state and may have unexpected effects.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

This code sends HTTP requests to an external API using an X-Developer-Key header and optional request parameters/body, which may include user financial data or credentials. Although the module docstrings describe authentication, there is no user-facing warning, confirmation, or visible disclosure in this file that data is being transmitted off-system.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.