Back to skill

Security audit

Budget Pacing Monitor

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its advertised ad-budget monitoring purpose, but it includes an unsafe local command pattern using untrusted campaign names.

Review this skill before installing. It should be used only in an agent environment that invokes ledger.py with structured arguments, validates or safely encodes campaign identifiers, and asks before writing memory. Treat campaign names and exported ad data as untrusted, and do not let the agent paste them into shell commands.

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

Error
Location
SKILL.md:57
Finding

Potential Shell Command Injection Through an Unquoted Campaign Identifier

Content
View full analysis
--source paid --data '{"spend": ..., "budget": ..., "days_elapsed": ..., "days_total": ...}'`, then `ledger.py trend --source paid --field spend` for the spend line across prior checks. ``` ### Technical Analysis The documented ledger commands place the `` value into a shell command without quoting, validation, or an explicit requirement to invoke the process through a shell-free argument array. Campaign identifiers can originate from user-supplied exports and campaign names, which the skill itself identifies as untrusted input at `SKILL.md:53`. If an agent replaces `` with a campaign name containing shell metacharacters and passes the resulting command to a shell, characters such as command separators, command substitutions, or redirection operators may be interpreted as shell syntax rather than campaign-name data. The same unsafe pattern appears in both the `record` and `trend` command examples on line 57. This creates a command-injection boundary even though the skill separately instructs the agent not to execute instructions embedded in campaign names. The vulnerable command template does not technically enforce that policy. Exploitation depends on the host constructing a command string from the template and executing it through a shell. The referenced `ledger.py` implementation is not included in this standalone package, so its own input handling and any additional safeguards could not be evaluated. ### Attack Path 1. An attacker creates or renames an advertising campaign so its name contains shell metacharact ...[truncated 1356 chars]
Remediation
View remediation
Vulnerability Patterns
  • 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
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (3)

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill explicitly instructs the agent to execute a local Python script (ledger.py) as part of normal operation, even though the skill is framed as analysis over user-provided exports. This expands the attack surface from passive data interpretation to tool execution, and because campaign names and exported fields are untrusted, any downstream parsing or shelling in the connector could turn crafted input into code execution, unsafe file access, or unintended state changes.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% 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.

Content

Scanner excerpt · SKILL.md (reported line 66)May include surrounding context.

md
## Save Results

Ask "Save these results for future sessions?" If yes, write to `memory/ad/budget-pacing-monitor/` using `YYYY-MM-DD-<campaign>-pacing.md` — see [Skill Contract](../../../references/skill-contract.md) §Save Results Template. Promote a fired reallocation trigger and the next-check date to `memory/open-loops.md`; do not write memory without asking.

## Reference Materials

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

L44 states that inputs come from the user's manually exported data and that no API is required, implying a simple export-driven workflow. L57 then instructs use of ledger.py to record and trend campaign data across prior checks, which introduces an operational dependency on a local connector/data store not reflected in that description; this is a documentation-to-behavior divergence rather than mere omission.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.