Back to skill

Security audit

Pilot Expense Tracker Setup

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent expense-tracking setup, but it handles sensitive business data and makes persistent multi-agent trust/configuration changes with insufficient scoping and safety guidance.

Review this skill before installing in any real expense workflow. Use only a simple hostname-safe prefix, verify every peer agent identity before handshakes, restrict Slack/webhook destinations, avoid sending unnecessary employee or receipt details, and pin or otherwise verify all dependent skills and Pilot tooling before production use.

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

Error
Location
SKILL.md:44
Finding

Command Injection Through Unquoted User-Controlled Hostname Prefix

Content
View full analysis
- ``` ``` `SKILL.md:112-118`: ```bash # collector <-> categorizer: pilotctl --json handshake -categorizer "setup: expense-tracker" pilotctl --json handshake -collector "setup: expense-tracker" # categorizer <-> reporter: pilotctl --json handshake -reporter "setup: expense-tracker" pilotctl --json handshake -categorizer "setup: expense-tracker" ``` `SKILL.md:124-127`: ```bash # On categorizer -- subscribe to raw expenses: pilotctl --json subscribe -collector raw-expense # On reporter -- subscribe to categorized expenses: pilotctl --json subscribe -categorizer categorized-expense ``` The same unsafe pattern appears in the README, including: ```bash pilotctl set-hostname -collector pilotctl handshake -categorizer "setup: expense-tracker" pilotctl subscribe -collector raw-expense ``` ### Technical Analysis The setup procedure explicitly asks the user to provide a deployment prefix and subsequently interpolates that value into shell commands without quoting or validation. If an agent implements these examples through a shell after direct textual substitution, shell metacharacters ...[truncated 2173 chars]
Remediation
View remediation
&2 exit 1 fi ``` 2. Reject whitespace, shell metacharacters, control characters, path separators, substitutions, and values beginning with `-`. 3. Pass the prefix as a separately quoted argument rather than building a command string: ```bash pilotctl --json set-hostname -- "${prefix}-collector" ``` Use `--` only if `pilotctl` supports an end-of-options marker. 4. Do not execute commands using `eval`, `bash -c`, or string concatenation. 5. Apply the same validation to the selected role, or map the user's choice to a fixed allowlist containing only `collector`, `categorizer`, and `reporter`. 6. Update every setup, handshake, subscribe, and publish example in both `SKILL.md` and `README.md`. 7. Display the normalized hostname and request confirmation before making configuration or trust changes. ]]>

T08 · Insecure Dependencies

Warning
Location
SKILL.md:53
Finding

Unpinned Third-Party Skill Installation Without Integrity Verification

Content
View full analysis
-collector # On server 2 (expense categorizer) clawhub install pilot-task-router pilot-event-filter pilot-metrics pilotctl set-hostname -categorizer # On server 3 (expense reporter) clawhub install pilot-webhook-bridge pilot-announce pilot-slack-bridge pilotctl set-hostname -reporter ``` ### Technical Analysis The project directs users or agents to install nine executable Skill dependencies using mutable package names. It does not specify versions, immutable content digests, package signatures, a trusted registry, or publisher-verification requirements. Consequently, the code or instructions installed by these commands may differ from what the project author originally reviewed. The dependencies are not included in the audited project, so their implementation and effective permissions cannot be assessed from the available files. This is a supply-chain weakness rather than evidence that any named dependency is currently malicious. Risk arises if a package, publisher account, registry, name-resolut ...[truncated 1646 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (5)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The README explicitly describes sending expense reports to external systems and Slack, and the sample payloads include employee-identifying financial data. In an expense-tracking context, this is sensitive business and personal information; omitting privacy, retention, minimization, and access-control guidance creates a realistic risk of unnecessary disclosure or policy noncompliance.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

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

Content

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

2. Establish trust

Agents are private by default. Each pair that communicates must exchange handshakes. When both sides send a handshake, trust is auto-approved -- no manual step needed.

bash
# collector <-> categorizer

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The trust model auto-approves communication once both sides exchange handshakes, but the README presents this as frictionless setup without warning users to verify peer identity or protect handshake initiation. In a multi-agent deployment, mistaken or spoofed trust establishment can expose internal expense data flows to unauthorized agents and enable downstream abuse.

Content

No source excerpt is available for this finding.

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 · SKILL.md (reported line 68)May include surrounding context.

pilotctl --json set-hostname -

text

**Step 4:** Write the setup manifest:
```bash
mkdir -p ~/.pilot/setups
cat > ~/.pilot/setups/expense-tracker.json << 'MANIFEST'

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill explicitly routes expense information to external approval systems and Slack, but it provides no warning or controls around handling sensitive financial and employee data. Even if the examples are operationally valid, sending expense details to third-party endpoints without guidance on minimization, redaction, consent, or access control can lead to data leakage or policy violations.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.