Back to skill

Security audit

ClankerKit

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed wallet-automation tool, but it gives an agent broad live authority to move funds and call arbitrary contracts with limited built-in guardrails.

Install only for low-value or test wallets unless you are prepared to grant the agent live signing authority. Configure strict on-chain policies and allowlists first, avoid high-value private keys in environment variables, review every recipient/contract/calldata before use, and update dependencies before production use.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
src/index.ts:65
Finding
Ambiguous Amount Parsing Can Cause Transfers Far Larger Than Requested<![CDATA[ ## Vulnerability Details **File Location**: `src/index.ts:65-87`; related conflicting declarations in `skill.json:53-56`, `skill.json:76-79`, and `skill.json:118-121` **Vulnerability Type**: Ambiguous financial-unit handling **Risk Level**: High ### Vulnerable Code ```typescript async function parseHumanAmount(amount: string, token: string, kit?: ClankerKit): Promise<bigint> { let decimals = TOKEN_DECIMALS[token.toUpperCase()]; // For contract addresses not in TOKEN_DECIMALS, try on-chain lookup if (decimals === undefined && kit && token.startsWith('0x') && token.length === 42) { decimals = await kit.fetchTokenDecimals(token); } decimals = decimals ?? 18; // Contains a decimal point => definitely human-readable if (amount.includes('.')) { return parseUnits(amount, decimals); } // Pure integer: if it's very large (>10 digits), assume it's already in wei. // This handles backward compatibility for callers passing raw wei. if (/^\d+$/.test(amount) && amount.length > 10) { return BigInt(amount); } // Short integer like "1", "100" => treat as human-readable return parseUnits(amount, decimals); } ``` The runtime manifest describes affected parameters as raw units, for example: ```json "amount": { "type": "string", "description": "Amount in wei" } ``` The parser is used by asset-moving operations such as: ```typescript async send_tokens({ to, amount }: { to: string; amount: string }) { const kit = getClankerKit(); const amountWei = await parseHumanAmount(amount, 'MON', kit); const result = await kit.send(to as Address, amountWei); ``` ### Technical Analysis The public interface and implementation assign different meanings to integer amount strings. The manifest instructs an Agent to supply wei or the token's smallest unit, while `parseHumanAmount` treats any integer containing ten or fewer digits as a human-readable whole-token amount. For an asset with 18 decimals, the manifest-compatible input ` ...[truncated 2074 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the string-length heuristic and define one unambiguous unit for every parameter. 2. Prefer separate schema fields or tools for distinct representations, such as `amount` for human-readable values and `amountWei` for raw values. 3. If human-readable amounts are retained, always apply `parseUnits` and update every `skill.json` and `SKILL.md` description accordingly. 4. If raw units are retained, always use `BigInt(amount)` after validating that the value is a non-negative decimal integer. 5. Reject negative values, scientific notation, malformed decimal strings, excessive precision, and values exceeding configured transaction limits. 6. Require explicit confirmation that displays both the human-readable amount and raw-unit value before asset-moving operations. 7. Add tests covering `"0"`, `"1"`, `"100"`, `"10000000000"`, `"100000000000"`, decimal inputs, and tokens with non-18 decimal precision. 8. Make restrictive policies mandatory before exposing transfer, swap, staking, or arbitrary-transaction tools. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
src/index.ts:348
Finding
Caller-Controlled Payment Endpoint Enables Unrestricted Outbound Requests<![CDATA[ ## Vulnerability Details **File Location**: `src/index.ts:348-356`; endpoint exposed by `skill.json:307-323` **Vulnerability Type**: Unrestricted URL handling and potential server-side request forgery **Risk Level**: Medium ### Vulnerable Code ```typescript async pay_for_service({ endpoint, amount }: { endpoint: string; amount: number }) { const kit = getClankerKit(); const result = await kit.pay(endpoint, amount); return { success: result.success, transactionHash: result.transactionHash, error: result.error, }; }, ``` The corresponding manifest permits any string as the destination: ```json { "name": "pay_for_service", "description": "Pay for an x402-enabled API endpoint", "parameters": { "type": "object", "properties": { "endpoint": { "type": "string", "description": "The API endpoint URL" }, "amount": { "type": "number", "description": "Payment amount in USDC" } }, "required": [ "endpoint", "amount" ] } } ``` ### Technical Analysis The Skill passes a caller-controlled URL directly to the network-capable `kit.pay` routine. It performs no visible validation of the URL scheme, hostname, port, DNS resolution, redirect destination, or payment amount. Paying arbitrary x402 services is part of the declared functionality, so outbound networking itself is necessary. However, unrestricted access to every URL is broader than the minimum privilege required. Without destination controls, a crafted endpoint may target loopback addresses, private networks, link-local services, cloud metadata addresses, or attacker-controlled hosts. The precise HTTP behavior is delegated to the external `clankerkit` package and cannot be verified from the reviewed repository. Therefore, internal response disclosure and private-key exfiltration are not established by the available evidence. Nevertheless, the wrapper exposes an unrestricted outbound request prim ...[truncated 1382 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Permit only HTTPS endpoints unless another scheme is explicitly required and securely implemented. 2. Enforce a configurable allowlist of approved x402 service domains. 3. Parse URLs with a standards-compliant URL parser and reject embedded credentials, malformed hostnames, unexpected ports, and ambiguous IP encodings. 4. Resolve hostnames before connecting and reject loopback, private, link-local, multicast, reserved, and cloud-metadata address ranges for both IPv4 and IPv6. 5. Repeat destination validation after every redirect and restrict redirects to approved domains. 6. Apply strict payment limits and validate that `amount` is finite, positive, and below both per-request and cumulative spending caps. 7. Require explicit user confirmation showing the normalized destination, payment asset, amount, chain, and recipient before signing. 8. Apply connection and response-size limits and avoid returning sensitive internal response data. 9. Audit and pin the `clankerkit` payment implementation to verify redirect handling, credential handling, challenge validation, and signer isolation. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
Findings (31)

Known Vulnerable Dependency: elliptic==6.5.4 — 7 advisory(ies): CVE-2024-48949 (Elliptic's verify function omits uniqueness validation); CVE-2024-42461 (Elliptic allows BER-encoded signatures); CVE-2025-14505 (Elliptic Uses a Cryptographic Primitive with a Risky Implementation) +4 more

Critical
Category
Supply Chain
Confidence
97% confidence
Finding
The lockfile contains elliptic 6.5.4 through ethers 5.6.2, and the listed advisories affect signature validation and cryptographic robustness. For a skill performing autonomous wallet operations, cryptographic verification flaws are especially serious because malformed or non-unique signatures can undermine transaction validation, authentication, or protocol assumptions around signed messages.

Known Vulnerable Dependency: ws==8.17.1 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
93% confidence
Finding
The lockfile includes ws 8.17.1 under @x402/extensions, and the cited advisories indicate remotely triggerable memory disclosure and resource-exhaustion conditions in WebSocket handling. In a wallet-automation skill that may maintain network connections to blockchain infrastructure or external services, a vulnerable WebSocket library increases exposure to denial of service and potentially sensitive process-memory leakage.

Known Vulnerable Dependency: fast-uri==3.1.0 — 7 advisory(ies): CVE-2026-13676 (fast-uri vulnerable to host confusion via failed IDN canonicalization); CVE-2026-18446 (fast-uri vulnerable to host confusion via backslash authority introducer); CVE-2026-75975 (fast-uri vulnerable to server-side request forgery via malformed IPv6 normalizat) +4 more

High
Category
Supply Chain
Confidence
89% confidence
Finding
fast-uri 3.1.0 is present via ajv, and the advisories describe host confusion and malformed URL parsing issues that can enable SSRF or validation bypasses when attacker-controlled URLs are processed. This matters if the skill or its dependencies validate remote endpoints, callback URLs, or service locations, though the lockfile alone does not prove direct exposure in runtime paths.

Known Vulnerable Dependency: ws==8.18.3 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
94% confidence
Finding
The lockfile includes ws 8.18.3 via viem, and the cited advisories indicate information disclosure and memory exhaustion conditions in WebSocket processing. Because viem is commonly used for blockchain RPC subscriptions and real-time connections, a wallet-focused skill may realistically exercise this code path, making remote service interaction a meaningful attack surface.

Known Vulnerable Dependency: ws==7.4.6 — 2 advisory(ies): CVE-2024-37890 (ws affected by a DoS when handling a request with many HTTP headers); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
95% confidence
Finding
ws 7.4.6 is present via ethers providers and is affected by denial-of-service issues from abusive handshake headers and fragmented frames. In an autonomous wallet skill, service disruption can block transaction monitoring, signing workflows, or policy enforcement, and the networking role of blockchain clients makes the vulnerable component relevant rather than purely dormant.

Missing User Warnings

High
Confidence
96% confidence
Finding
This skill exposes many irreversible financial actions—sending tokens, staking, swapping, deploying wallets, and changing spending policies—without any user-facing warnings about loss of funds, slippage, approvals, or permanent on-chain effects. In a wallet-control skill, lack of explicit risk framing materially increases the chance of unsafe autonomous execution or prompt-induced misuse.

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Content
{
  "$schema": "https://raw.githubusercontent.com/OpenClaw/skills/main/schema.json",
  "name": "clankerkit",
  "version": "0.2.0",
  "description": "ClankerKit — Autonomous wallet operations for AI agents on Monad — swap, stake, deploy, trade memecoins, and manage spending policies",
  "author": "ClankerKit Team",
  "tools": [
    {
      "name": "get_wallet_info",
      "description": "Get current wallet information including balance and policy state",
      "parameters": {
        "type": "object",
        "properties": {},
        "required": []
      }
    },
    {
      "name": "get_token_balance",
      "description": "Get the ERC20 token balance of the agent wallet",
      "parameters": {
        "type": "object"
Confidence
80% confidence
Finding
YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Missing User Warnings

High
Confidence
97% confidence
Finding
The execute_transaction tool allows arbitrary target/value/data submission to any smart contract, effectively giving the agent a generic transaction primitive. In this context, that can be used to approve token drains, call malicious contracts, bypass intended higher-level safeguards, or permanently move assets through unreviewed calldata.

Missing User Warnings

High
Confidence
97% confidence
Finding
These tools send assets and execute transactions immediately, but the file shows no confirmation, warning, or explicit approval flow before irreversible on-chain actions occur. In an autonomous agent context, this materially increases the risk of accidental transfers, prompt-induced abuse, or acting on hallucinated instructions.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The execute_transaction tool allows arbitrary target, value, and calldata execution from the wallet, which is materially broader than the stated swap/stake/wallet-management purpose. In an agent setting, this becomes a generic signing primitive that can call any contract, approve token drains, or interact with malicious targets.

Context-Inappropriate Capability

High
Confidence
99% confidence
Finding
Arbitrary contract execution is not justified by the advertised operational scope and creates a universal escape hatch around higher-level safety assumptions. A compromised prompt, malicious user, or faulty agent plan could use this one function to perform any on-chain action available to the wallet.

Missing User Warnings

High
Confidence
95% confidence
Finding
The swap tools obtain quotes and then execute live trades without a visible consent barrier or strong user-facing disclosure that funds will be exchanged irreversibly. Given price movement, slippage, and route risk, an agent can cause immediate financial loss if it misinterprets intent or is manipulated.

Missing User Warnings

High
Confidence
94% confidence
Finding
Staking, unstaking, reward compounding, policy creation, and limit updates all mutate on-chain state yet lack visible confirmation or warning mechanisms in this code. Because these operations can lock funds, change spending controls, or affect custody behavior, silent execution is dangerous in an agent-driven environment.

Missing User Warnings

High
Confidence
97% confidence
Finding
The deployment helpers use a private key from environment variables to deploy contracts and wallets immediately, with no visible user warning or confirmation. This combines sensitive key-based authority with irreversible administrative actions, which is especially risky when callable by an AI agent.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The README tells users to export an agent private key directly into an environment variable but does not warn that this credential grants direct control over blockchain funds and may be exposed through shell history, process inspection, logs, crash reports, or misconfigured deployment environments. In the context of an autonomous wallet skill that can swap, stake, trade, and manage spending policies, compromise of this key could enable unauthorized transactions and loss of assets.

Lp3

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding
The skill exposes highly sensitive capabilities through environment variables, including a private key, but does not declare an explicit tool scope such as permissions or allowed-tools. In a wallet-management skill that can move funds, trade, and execute arbitrary transactions, this lack of scope increases the chance of unintended tool access and weakens least-privilege controls.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The environment variable section documents use of AGENT_PRIVATE_KEY and describes powerful financial operations, but it does not prominently warn users about irreversible fund loss, secret-handling risks, or the dangers of granting an AI autonomous signing authority. In this context, missing warnings materially increase the likelihood of unsafe deployment and operator misconfiguration.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
- **data**: Encoded calldata (hex)

#### `ensure_gas`
Ensure the agent EOA has enough MON for gas fees. If the EOA balance is below the minimum threshold, automatically sends MON from the AgentWallet contract to the EOA. Users only need to fund the wallet contract — the agent tops up its own gas from there.
- **minBalance**: Minimum acceptable EOA balance in MON (human-readable, default "0.01")
- **topUpAmount**: Amount of MON to send to EOA if below minimum (human-readable, default "0.05")
Confidence
92% confidence
Finding
The ensure_gas feature makes an autonomous spending decision by automatically transferring MON from the wallet contract to the agent EOA when a threshold is crossed. Although the intended purpose is operational continuity, any automatic value transfer in an agent-controlled wallet expands the attack surface for draining funds through repeated triggering, bad thresholds, or agent misuse.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
- **takeProfit**: Take-profit fraction (default: 0.3 = +30%)
- **dcaIntervals**: Number of DCA buys (default: 5)
- **momentumThreshold**: Min 24h change for momentum (default: 0.05)
- **autoExecute**: Execute trades or dry-run (default: false)

### Cross-Chain Swaps
Confidence
87% confidence
Finding
The smart_trade tool supports autoExecute for autonomous trading strategies, allowing the agent to move funds based on strategy parameters without a separate confirmation step. In a memecoin-trading context with volatile assets, this can rapidly cause real financial loss if prompts are manipulated, strategy logic is flawed, or market conditions shift unexpectedly.

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
The manifest description limits the skill's scope to 'wallet operations for AI agents on Monad,' which implies chain-specific functionality. However, the declared tools include `kyber_swap` and `zerox_swap` for Ethereum, Polygon, Arbitrum, Optimism, Base, BSC, and Avalanche, materially expanding behavior beyond Monad.

Vague Triggers

Medium
Confidence
91% confidence
Finding
The manifest advertises broad autonomous financial operations without clear invocation guardrails, approval expectations, or examples of disallowed use. In an agent ecosystem, vague high-authority tool descriptions can encourage overbroad or unsafe invocation, especially for fund-moving actions.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
"description": "For momentum strategy: minimum 24h price change fraction (0.05 = +5%)",
            "default": 0.05
          },
          "autoExecute": {
            "type": "boolean",
            "description": "If true, actually place the order. If false (default), dry-run only.",
            "default": false
Confidence
85% confidence
Finding
The smart_trade tool supports autoExecute, enabling the agent to convert a trading strategy evaluation directly into live trades. In a volatile memecoin-trading context, autonomous execution without strong confirmation and risk controls can quickly cause financial loss from prompt injection, bad data, or strategy misuse.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The ensure_gas tool automatically transfers MON from the wallet contract to the agent EOA when a threshold is met, but the description does not clearly warn that this moves funds automatically. In a delegated-agent setting, even small automatic top-ups can be abused repeatedly or normalize silent fund movement without informed consent.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
},
    {
      "name": "ensure_gas",
      "description": "Ensure the agent EOA has enough MON for gas fees. If the EOA balance is below the minimum threshold, automatically sends MON from the AgentWallet contract to the EOA. Call this before executing transactions if unsure whether the agent has gas. Users only need to fund the wallet contract address — the agent tops up its own gas from there.",
      "parameters": {
        "type": "object",
        "properties": {
Confidence
80% confidence
Finding
Automatic gas top-ups are a form of autonomous fund movement based on local conditions rather than explicit per-transfer user authorization. In a wallet skill, this increases the blast radius of prompt mistakes or repeated invocation loops because the agent can keep provisioning its own ability to transact.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The skill metadata frames the capability as Monad wallet operations, but the code also exposes cross-chain swaps through Kyber and 0x on external chains. That mismatch can mislead operators and downstream policy systems about the real transaction surface, increasing the chance of unsafe invocation or insufficient review.

Static analysis

No suspicious patterns detected.