Back to skill

Security audit

Find missing receipts (requires plow.co)

Security checks for vulnerabilities and agentic risk

Overview

This skill has a coherent receipt-reconciliation purpose, but it combines broad Gmail access, external email forwarding, persistent financial records, and recurring scheduler control in a way users should review carefully before installing.

Install only if you intentionally want an automated Mercury receipt matcher that can search all connected Gmail accounts and forward selected receipt emails to receipts@mercury.com. Before enabling it, confirm the Gmail account scope, cron cadence, exact forwarding destination, and how to disable the job. Treat /workspace/receipts.db and exported reports as sensitive financial records and delete or protect them when no longer needed.

Vulnerability Patterns
  • System PersistenceInstalls backdoors, hooks, services, or scheduled tasks that survive the run
  • 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)

T06 · System Persistence

Error
Location
SKILL.md:57
Finding

Recurring OpenClaw Cron Execution Creates Cross-Session Persistence

Content
View full analysis
# inspect one job openclaw cron status # scheduler status openclaw cron disable # pause without deleting openclaw cron enable # resume openclaw cron edit --every 10m # change cadence openclaw cron edit --message "…" # change payload openclaw cron rm # delete entirely openclaw cron run # trigger one run (debug) ``` If a user asks to "stop / pause / disable the receipt matcher", run `openclaw cron disable ` (or `rm` if they want it gone). Confirm by re-listing. ``` ### Technical Analysis The Skill declares that it executes on a recurring five-minute OpenClaw cron schedule and provides instructions to enable the job, alter its cadence, replace its payload, and run it immediately. A scheduled job survives the individual Skill invocation and therefore creates a cross-session execution mechanism. Scheduling can be legitimate for continuous receipt reconciliation, but it is not required for the minimum functionality of matching receipts during an explicitly requested run. The capability is particularly sensitive because each scheduled invocation may search all conn ...[truncated 1696 chars]
Remediation
View remediation
--message "…"`. If payload updates are necessary, validate them against an exact approved template. 4. Scope all scheduler operations to a verified job ID and confirm that the existing payload exactly matches the expected receipt-matching task before enabling or running it. 5. Default the job to disabled and provide a manual, one-shot workflow as the least-privilege option. 6. Add an expiration time or maximum execution count so scheduling does not continue indefinitely. 7. After disabling or removing a job, re-list the scheduler state and report the verified result to the user. 8. Do not automatically create, enable, or modify a scheduled job merely because the Skill was loaded. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/receipts_db.py:126
Finding

Sensitive Financial and Identity Data Is Persisted in Plaintext

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (7)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The code implements the database and reporting/audit-trail portion of a reconciliation workflow: it initializes schema, imports CSV rows into SQLite, migrates legacy text-log statuses, computes canonical keys, deduplicates transactions, flags revisit cases, lists next batches, and exports reports. This partially aligns with the description's mention of a SQLite-backed reconciliation workflow and revisit semantics. However, the description's central promise is finding original merchant emails in Gmail and forwarding them to Mercury. Nothing in this code interacts with Gmail, email content, message APIs, connected accounts, or outbound forwarding. Because the primary declared behavior is absent and the actual code is limited to local data management, this is a material description-behavior mismatch.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
84% confidence
Finding

The skill instructs the agent to read and write local state (/workspace/receipts.db, CSV imports, reports) but does not declare an explicit tool scope or permissions boundary. In an agent system, undocumented file capabilities increase the risk of over-broad access and make it harder to audit or constrain what the skill may read or modify.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill is designed to search all connected Gmail accounts and forward matched emails to an external address (receipts@mercury.com) without requiring an explicit user-facing warning or confirmation about data disclosure. Because receipts can contain sensitive financial and personal information, silent forwarding from multiple inboxes materially raises privacy and compliance risk.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill expands beyond receipt matching into OpenClaw cron administration, including commands to disable, edit, remove, and run jobs. That introduces privileged scheduler control unrelated to the core data-processing task, creating an opportunity for abuse or accidental service disruption if a user or prompt steers the agent into modifying job schedules.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The workflow explicitly instructs the agent to forward emails from connected Gmail accounts to an external address, which is a data transfer of potentially sensitive financial and personal information. Because the workflow contains no explicit consent checkpoint, warning, or minimization gate before transmission, it creates a real privacy and compliance risk if users do not fully understand that third-party email contents will be sent outside their mailbox.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

During CSV import, the code persists cardholder name, cardholder email, last four digits, merchant, notes, and raw CSV contents into /workspace/receipts.db. This is a safety-relevant file write involving personal and financial data, but the code provides no user-facing warning beyond reporting inserted counts and contains no explanatory docstring or comment about the data retention.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The export_report function writes transaction records, including merchant, dates, amounts, and reconciliation details, to a user-specified path. While the CLI prints a completion message after writing, there is no prior disclosure, confirmation, or inline warning/comment indicating that sensitive receipt and transaction data will be persisted to a file.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.