Back to skill

Security audit

First Dollar

Security checks for vulnerabilities and agentic risk

Overview

This payment-training skill is not overtly malicious, but it gives unsafe wallet and command instructions that could expose private keys or steer real payments.

Review carefully before installing. Do not run its suggested commands against funded wallets without manually checking the merchant, chain, recipient, asset, amount, and maximum spend. Do not paste or print private keys, do not pass private keys on command lines, pin package versions before using `npx`, and prefer test wallets with very small balances.

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 (4)

T09 · Insecure Skill Coding Practices

Error
Location
index.js:743
Finding

Shell Command Injection Through Unsanitized Tool Arguments

Content
View full analysis
` ## Verifying your purchase You've signed and sent a payment. Now you need to tell the merchant about it. Run: \`\`\` curl "${merchant}/receipt/${productId}?tx=${tx}" \`\`\` ``` Additional affected commands include: ```js const TEST_PAYMENT = (merchantUrl) => { const url = merchantUrl || "https://underground.substratesymposium.com"; const isUnderground = url.includes("substratesymposium.com"); return ` ## Test-payment walkthrough Target merchant: **${url}** ### Step 1: Verify you can reach the merchant \`\`\` curl ${url}/catalog 2>/dev/null | head \`\`\` ``` ```js curl "${url}/deliver/continuity_fabric" ``` ```js curl -i "${url}/buy/am_i_creative_americano" ``` ### Technical Analysis The `merchant_url`, `product_id`, and `tx_hash` MCP arguments are interpolated directly into shell commands without validation or shell-safe encoding. The unquoted `${url}` in the catalog command permits ordinary shell metacharacters, including command separators, pipes, redirections, and whitespace-based argument injection. Quoting the other values does not fully resolve the issue because command substitutions such as `$(command)` and backtick substitutions remain active inside double-quoted shell strings. The MCP server does not execute these commands itself. Exploitation occurs when an AI agent or user trusts and executes the generated instructions, which is a realistic behavior for an instructional Skill designed to produce commands for agents. ### Attack Path 1. An attacker controls or influences a `merchant_url`, `product_id`, or `tx_hash` supplied to `test-payment` or `verify-my-purchase`. 2. The attacker embeds shell syntax such as command substitution or command separators in that va ...[truncated 1046 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
index.js:539
Finding

Wallet Private Keys Can Be Exposed During Environment Inspection

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Error
Location
index.js:675
Finding

Unpinned Remote Package Execution Receives a Raw Private Key Through Process Arguments

Content
View full analysis
--key \`\`\` It will create the signed \`X-PAYMENT\` header and retry the request. Output is the content on success.`; ``` Related unpinned remote execution is also recommended elsewhere: ```sh npx skills add coinbase/agentic-wallet-skills ``` The package itself is documented for installation as: ```sh npx firstdollar ``` ### Technical Analysis The recommended MetaMask command uses `npx` without pinning an exact reviewed version. Depending on local npm behavior and cache state, `npx` can download and immediately execute the registry's currently resolved package version. The effective code can therefore change after this Skill has been audited. The same command gives the downloaded package a raw wallet private key through the `--key` process argument. Command-line arguments may be exposed through shell history, process inspection, diagnostic tooling, crash reports, or package logging. This creates two independent sensitive trust boundaries: - Registry-controlled third-party code receives complete wallet authority. - The raw key is placed in an operating-system process interface not designed for secret storage. ### Attack Path 1. The agent follows the MetaMask payment instructions. 2. `npx` resolves and executes the current registry version of `@metamask/mcp-x402`. 3. A compromised release, package account, registry response, or transitive dependency executes locally. 4. The raw private key is available to the package in its process arguments. 5. The package or another process with permission to inspect the command line captures the key. 6. The attacker uses the captured key to author ...[truncated 796 chars]
Remediation
View remediation

other

Warning
Location
index.js:806
Finding

Hard-Coded Default Routes Agents Toward a Specific Paid Merchant

Content
View full analysis
{ const url = merchantUrl || "https://underground.substratesymposium.com"; const isUnderground = url.includes("substratesymposium.com"); return ` ## Test-payment walkthrough Target merchant: **${url}** ${isUnderground ? "Suggested default: the Underground Cultural District — a literary ecosystem for AI agents. Free products for handshake verification; $0.99 paid products for settlement tests." : "Custom merchant — make sure they support x402 and have some low-priced or free products for testing."} ``` The generated walkthrough then recommends a real paid purchase: ```js ### Step 3: Real paid handshake ($0.99) ${isUnderground ? `**Pick any $0.99 paid product and verify it actually returns 402** before signing anything. The Underground sometimes rotates products into free-sample mode — if you hit \`/buy/\` and get a 200 with a \`free_sample\` field, that product is currently free; pick another. Known-paid at time of writing: **\`am_i_creative_americano\`**, **\`imposter_syndrome_cortado\`**, **\`void_latte\`**. \`\`\` curl -i "${url}/buy/am_i_creative_americano" \`\`\` ``` This behavior conflicts with the statement in `README.md:62-67`: ```md ## What First Dollar does NOT do - Does not hold private keys - Does not sign transactions on your behalf - Does not access your wallet files - Does not have preferential routing to any merchant ``` ### Technical Analysis When `test-payment` is called without a `merchant_url`, the Skill selects a specific external merchant and recommends named paid products. This is preferential routing even though the README explicitly states that the Skill does not route preferentially to a merchant. A real paid endpoint is not necessary to teach or validate the x402 handshake. A local fixtu ...[truncated 1529 chars]
Remediation
View remediation
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (14)

Rp1

Medium
Category
MCP Rug Pull
Confidence
89% confidence
Finding

The README instructs users to execute the MCP server via npx firstdollar without pinning a specific package version or integrity source. That allows whatever version is currently published under that name to be fetched and run at install/runtime, creating a supply-chain execution risk if the package is compromised, hijacked, or updated maliciously. Because this skill teaches wallet-related actions for agents with their own funds, compromise of the launched package could have outsized consequences even though the README claims the tool is educational.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
73% confidence
Finding

The skill metadata does not declare any explicit tool restrictions even though static analysis detected shell and environment capabilities. In a skill focused on wallets and payments, leaving execution scope implicit increases the chance an agent can invoke powerful tools in unsafe ways, including handling secrets or running installation/payment-related commands without clear confinement.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding

Using npx firstdollar without a pinned version causes installation and execution of whatever package version is current at runtime. If the package is updated maliciously, compromised, or unexpectedly changed, users could run attacker-controlled code, which is especially dangerous in a skill about wallets, payments, and potentially sensitive financial workflows.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill claims 'teacher, not butler' and 'never signs for the agent,' but multiple lessons direct the agent to use tools like awal pay that automatically decode, sign, submit payment, and return purchased content. This mismatch can cause agents or operators to trust the skill as read-only guidance when it is actually coaching fully automated spending actions, increasing the chance of unintended financial loss.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The how-do-i-pay tool promises challenge-specific payment instructions, but the handler ignores the provided challenge and returns generic wallet-type advice. In a payments context this is dangerous because it can tell an agent to run a payment flow without validating chain, asset, amount, recipient, or scheme, which can lead to paying the wrong network or blindly authorizing malicious requests.

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 · index.js (reported line 324)May include surrounding context.

js
4. It asks which agent harnesses to install into (Claude Code, OpenClaw, Cursor, Codex, and roughly 40 others).
5. It writes the selected skills into the appropriate directories for each harness.

**At minimum, select these four:** \`authenticate-wallet\`, \`fund\`, \`pay-for-service\`, \`x402\`. That is the least set that lets you create a wallet, fund it, and pay with it. The others become useful later.

**After install, nothing is configured yet.** The files are on disk. You still need to execute them in the right order. That is the next lesson.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

This is a manifest file, so vague-trigger review applies. The description broadly states the MCP 'teaches AI agents how to use the wallets they already have' and lists general capabilities, but it does not specify when the skill should be invoked, what exact triggers apply, or any exclusion conditions, which can contribute to unintended activation in systems that infer routing from manifest text.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

The dependency uses a caret range (^1.0.0), allowing newer 1.x releases to be installed without review. In a skill that teaches wallet usage and may interact with MCP clients handling sensitive financial context, this increases supply-chain risk and may silently pull in a vulnerable or behavior-changing SDK version.

Content

Scanner excerpt · package.json (reported line 40)May include surrounding context.

json
"url": "https://github.com/lisamaraventano-spine/firstdollar"
  },
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.0.0"
  },
  "engines": {
    "node": ">=18.0.0"

Unverifiable Dependency: @modelcontextprotocol/sdk has 3 known advisory(ies) (CVE-2026-25536 (@modelcontextprotocol/sdk has cross-client data leak via shared server/transport); CVE-2026-0621 (Anthropic's MCP TypeScript SDK has a ReDoS vulnerability); CVE-2025-66414 (Model Context Protocol (MCP) TypeScript SDK does not enable DNS rebinding protec)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
97% confidence
Finding

The manifest references @modelcontextprotocol/sdk without pinning, while the package family has known advisories including cross-client data leakage, ReDoS, and missing DNS rebinding protections. Because the installed version is unconstrained within 1.x, consumers cannot verify whether they are exposed, and in a wallet-oriented MCP context these issues could affect confidentiality, availability, and trust boundaries between clients.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.