Back to skill

Security audit

Check Wallet

Security checks for vulnerabilities and agentic risk

Overview

This wallet-checking skill is read-only and purpose-aligned, but it runs an unpinned remote CLI in an authenticated wallet context and displays sensitive wallet data automatically.

Review this before installing if you use OpenAnt wallets on the same machine. Prefer a version that pins @openant-ai/cli to a reviewed release, asks before showing full addresses or balances, and runs with minimal filesystem, environment, and network access. There is no artifact evidence of theft, transfers, destructive behavior, or persistence, but the current dynamic CLI execution model is too broad for sensitive wallet data.

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:7
Finding
Execution of an Unpinned npm Package Through a Mutable Latest Tag<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:7`, `SKILL.md:12-20`, `SKILL.md:26`, `SKILL.md:44`, `SKILL.md:68-69`, `SKILL.md:86-89`, `SKILL.md:96-106`, and `SKILL.md:113` **Vulnerability Type**: Supply-chain risk caused by runtime execution of an unpinned third-party dependency **Risk Level**: Medium ### Vulnerable Code ```yaml allowed-tools: ["Bash(npx @openant-ai/cli@latest wallet *)", "Bash(npx @openant-ai/cli@latest status*)"] ``` ```markdown Use the `npx @openant-ai/cli@latest` CLI to query your wallet addresses and on-chain balances. ```bash npx @openant-ai/cli@latest status --json ``` ```bash npx @openant-ai/cli@latest wallet addresses --json ``` ```bash npx @openant-ai/cli@latest wallet balance --json ``` ```bash npx @openant-ai/cli@latest wallet balance --solana-rpc https://api.mainnet-beta.solana.com --json npx @openant-ai/cli@latest wallet balance --evm-rpc https://mainnet.base.org --json ``` ``` ### Technical Analysis The skill authorizes and repeatedly instructs the agent to run `npx @openant-ai/cli@latest`. The npm `latest` tag is mutable and does not identify a specific reviewed package version. Depending on the local npm cache and configuration, `npx` can retrieve the currently published package and execute its lifecycle or CLI code at invocation time. As a result, the effective executable can change after this skill has been reviewed without any modification to `SKILL.md`. The skill provides neither an exact version pin nor integrity verification. Although the documented wallet commands are read-only, that restriction applies only to the intended CLI interface and does not constrain arbitrary code contained in a compromised package release. No evidence establishes that the current package is malicious. The vulnerability is the unsafe dependency acquisition and execution model, which exposes users to a future compromised maintainer account, malicious release, or npm supply-chain incident. ### Attack Path 1. An att ...[truncated 1528 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace `@latest` with an exact, reviewed version, for example: ```bash npx --yes @openant-ai/cli@1.2.3 wallet balance --json ``` 2. Prefer installing the approved package during a controlled build or deployment stage instead of downloading executable code at skill invocation time. 3. Commit a lockfile and verify package integrity through npm integrity hashes or an equivalent trusted artifact-verification mechanism. 4. Review the exact package release, its transitive dependencies, CLI entry point, and lifecycle scripts before approval. 5. Update the `allowed-tools` declaration so it permits only the pinned executable version and the required read-only subcommands. 6. Disable or reject unexpected npm lifecycle scripts where operationally possible, and execute the CLI in a sandbox with: - Minimal filesystem access. - No unnecessary environment secrets. - Restricted outbound network access. - No elevated operating-system privileges. 7. Establish a controlled upgrade process in which version changes require dependency review, integrity verification, and security testing before deployment. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (20)

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The manifest's `allowed-tools` whitelist includes `Bash(npx @openant-ai/cli@latest wallet *)` and `Bash(npx @openant-ai/cli@latest status*)`, explicitly authorizing dynamic execution of the latest published package. Because this is the enforcement layer for what the agent may run, the unpinned reference materially expands the attack surface and could enable compromise of wallet data or auth state across all permitted commands.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The skill description uses broad trigger phrases such as 'check my wallet', 'what's my address', and 'check funds', making accidental invocation more likely in ordinary conversation. Because invocation exposes financial metadata and may run authenticated tooling automatically, unintended activation can disclose sensitive wallet addresses and balances without sufficiently deliberate user intent.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding
The skill executes `npx @openant-ai/cli@latest`, which fetches and runs whatever code is currently published under that package name rather than a reviewed, immutable version. In a wallet-related skill, this creates a software supply-chain risk: a compromised upstream package or malicious update could access local credentials, wallet metadata, or manipulate outputs at runtime.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding
This command again relies on `@latest`, so the agent would execute unpinned remote code each time the status check runs. Because the skill explicitly depends on locally stored authentication, any malicious package update could inspect or exfiltrate auth state or influence subsequent wallet operations.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The skill is designed to reveal wallet addresses and balances, but it does not present a clear user-facing privacy warning about exposing sensitive financial metadata. Even if the actions are read-only, addresses and balances can be highly sensitive and may enable tracking, profiling, or accidental sharing in chats or logs.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding
Listing wallet addresses via an unpinned `npx` package exposes a supply-chain execution path in a sensitive context. Even though the documented action is read-only, the invoked package code runs with local user permissions and can access wallet-related state before returning address data.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding
Balance queries are presented as routine and safe, but the implementation still executes unreviewed remote code because of `@latest`. In a financial skill, that is dangerous because a malicious update could harvest wallet balances, addresses, or local credentials and mislead the model about available funds.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding
Custom-RPC examples still use the unpinned package, so users or agents following documented fallback flows would continue to execute mutable remote code. The ability to specify alternate RPC endpoints does not mitigate the core risk that the executable itself is not fixed.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding
The example balance check repeats execution of `@latest`, normalizing a supply-chain unsafe practice throughout the skill. Frequent read-only invocations in authenticated contexts increase exposure because the package may run many times and observe sensitive wallet state.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding
This address-query example also executes mutable remote code through `@latest`. Because the command reveals receiving addresses, a compromised package could silently exfiltrate them or substitute attacker-controlled addresses in output presented to the user.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding
This example again instructs use of `@latest` in a wallet-balance context. Even when only token holdings are queried, the package has an opportunity to access local environment data and misreport balances, which could affect later financial decisions.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding
The repeated command on this line carries the same unpinned-package risk and reinforces insecure operator behavior. In a skill designed for agents, repetition matters because the model may copy any of these examples into live execution paths.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding
Although this line is a comment/instruction rather than an executable command, it is part of a sequence teaching use of the unpinned balance command and contributes to unsafe invocation patterns. In agentic settings, instructional context can directly shape tool execution behavior.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding
This multi-line balance example still anchors on `@latest`, preserving the same supply-chain exposure in a mainnet-check scenario. The financial context makes the risk more severe because users may trust the result to make payment or trading decisions.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding
The prerequisites section uses `@latest` for the auth-status check, which again means mutable code runs before sensitive wallet queries. Any compromise here could enumerate whether credentials are present and pivot to collecting or abusing them.

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding
The error-handling guidance references `login` with `@latest`, extending the same supply-chain risk into authentication flows. Login paths are especially sensitive because malicious code could capture credentials or tokens at the moment they are entered or refreshed.

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.

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.

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.

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.

Static analysis

No suspicious patterns detected.