Back to skill

Security audit

Send Token

Security checks for vulnerabilities and agentic risk

Overview

The skill does what it says, but it would run a live-downloaded wallet CLI for irreversible crypto transfers, which needs careful review before use.

Install only if you accept the risk of using a dynamically resolved CLI for wallet operations. Prefer a version-pinned, reviewed OpenAnt CLI and verify the final recipient, chain, token, amount, and signer prompt independently before approving any transfer.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:5
Finding
Mutable npm Package Executed with Cryptocurrency Wallet Authority<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 5, 11, 18–19, and 27 **Vulnerability Type**: Supply-chain risk caused by runtime execution of an unpinned dependency **Risk Level**: Medium ### Vulnerable Code ```yaml allowed-tools: ["Bash(npx @openant-ai/cli@latest wallet send *)", "Bash(npx @openant-ai/cli@latest wallet balance*)", "Bash(npx @openant-ai/cli@latest wallet addr*)", "Bash(npx @openant-ai/cli@latest status*)"] ``` ```markdown Use the `npx @openant-ai/cli@latest` CLI to transfer tokens on Solana or Base. ``` ```bash npx @openant-ai/cli@latest status --json npx @openant-ai/cli@latest wallet balance --json ``` ```bash npx @openant-ai/cli@latest wallet send <chain> <token> <amount> <to> [--json] [--rpc <url>] ``` ### Technical Analysis The Skill directs the agent to execute `@openant-ai/cli@latest` through `npx`. The `latest` npm distribution tag is mutable and does not identify a fixed, previously audited package version. Depending on the local npm cache and configuration, `npx` may retrieve and execute the package at invocation time. Consequently, the effective executable code can change after the Skill has been reviewed. Compromise of the package publisher account, npm package, or upstream dependency chain could cause a future invocation to execute attacker-controlled code. This is particularly sensitive because the CLI operates in an authenticated cryptocurrency-wallet context. It can inspect wallet state and submit irreversible transfers. Although the Skill includes appropriate user-confirmation and address-verification instructions, those procedural controls cannot reliably constrain malicious code inside the CLI itself. A compromised CLI could modify transaction parameters after confirmation, access credentials available to its process, or perform unrelated actions using the process's local permissions. No evidence establishes that the current package is malicious. The vulnerability is the unsafe trust and updat ...[truncated 1754 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace `@latest` with an exact, audited package version, for example: ```bash npx --yes @openant-ai/cli@1.2.3 wallet balance --json ``` The example version must be replaced with a real version that has been independently reviewed. 2. Prefer installing the approved package during a controlled deployment or build phase rather than downloading executable code when a wallet operation is requested. 3. Commit and enforce a lockfile with package integrity hashes. Use deterministic installation such as `npm ci` and reject unexpected lockfile changes. 4. Verify package provenance, publisher identity, signatures or attestations, and registry source before approving upgrades. 5. Re-audit each proposed package update and its transitive dependency changes before changing the pinned version. 6. Run the CLI in an isolated environment with the minimum required filesystem, environment-variable, and network access. Do not expose unrelated secrets to the process. 7. Separate read-only wallet operations from transaction-signing authority where supported. Require transaction signing to validate the chain, token, amount, and complete recipient address independently of values returned by the CLI. 8. Add an out-of-band transaction preview or signer-level confirmation that displays the final serialized transaction destination and amount. This helps detect parameter substitution inside a compromised CLI. 9. Restrict network egress to required blockchain RPC and approved OpenAnt endpoints where operationally feasible. 10. Preserve the existing explicit-confirmation, address-validation, balance, and gas-reserve checks, but do not treat them as substitutes for dependency pinning and execution isolation. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (13)

Rp1

Medium
Category
MCP Rug Pull
Confidence
99% confidence
Finding
This manifest occurrence again permits an unpinned npm package in the allowed tool list, creating a mutable execution target. In the context of blockchain asset transfers, that materially raises the blast radius from generic supply-chain risk to potential immediate theft or transaction tampering.

Rp1

Medium
Category
MCP Rug Pull
Confidence
99% confidence
Finding
The manifest grants access to a package resolved dynamically with `@latest`, which is a classic software supply-chain weakness. In this context the danger is amplified because the command surface includes wallet send operations, so unreviewed upstream changes could directly affect asset custody.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The documentation instructs use of `npx @openant-ai/cli@latest`, normalizing execution of an unpinned package. While this line is descriptive rather than the permission boundary itself, it encourages operators and downstream systems to run mutable code in a wallet-transfer workflow.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
This example command uses `@latest`, meaning the authentication/status check would run whatever package version is currently published. Although read-only on its face, a compromised package could execute arbitrary logic before returning status and becomes part of a trusted operational workflow.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
This balance-check command also relies on `@latest`, exposing the workflow to silent upstream code changes. In a financial skill, even preparatory read-only steps are sensitive because users and agents may trust their output when deciding whether to perform irreversible transfers.

Rp1

Medium
Category
MCP Rug Pull
Confidence
98% confidence
Finding
The documented send syntax explicitly uses `npx @openant-ai/cli@latest` for value-transfer operations. Because token transfers are irreversible, executing mutable upstream code here creates a direct path from package compromise to theft, redirection, or manipulation of transactions.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
This SOL transfer example includes the unpinned package reference, reinforcing unsafe runtime package resolution in a high-risk context. Example commands often get copied directly into tooling or automation, so the mutable dependency remains exploitable in practice.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
This USDC-on-Solana example relies on `@latest`, again exposing financial operations to unreviewed package changes. Because users may paste example commands verbatim, a supply-chain compromise could propagate directly into real token transfer execution.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The ETH-on-Base example continues the pattern of invoking an unpinned package for asset movement. This is dangerous because attackers commonly target popular npm packages, and a wallet-enabled skill magnifies the consequences of any compromise.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
This Base USDC transfer example also executes mutable package code via `@latest`. In the context of a transfer skill, this materially increases risk of financial loss compared with a non-sensitive utility command because the package participates in constructing and submitting transactions.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The arbitrary SPL token example uses `@latest`, extending the same supply-chain exposure to less-common token operations. Arbitrary-token support may be harder for users to validate manually, so compromised tooling here could be especially hard to notice before funds move.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
This arbitrary ERC20 example likewise references an unpinned package, enabling silent upstream behavior changes during transfer execution. Because arbitrary contract addresses are user-supplied, combining that complexity with mutable tooling increases operational and security risk.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The prerequisites section instructs running `status` through `@latest`, continuing to normalize mutable runtime dependencies. Even though this specific command is not a transfer, it conditions agents and users to trust and execute live-downloaded code in a wallet context.

Static analysis

No suspicious patterns detected.