Back to skill

Security audit

Botcoin Miner

Security checks for vulnerabilities and agentic risk

Overview

The skill is coherent with BOTCOIN mining, but it gives an agent broad wallet and transaction authority without enough mandatory safeguards.

Install only after reviewing the wallet risks. Use a dedicated low-balance wallet, avoid passing private keys on command lines, disable raw token logging, pin reviewed skill versions, restrict Bankr API key IPs and permissions where possible, and require explicit confirmation plus decoded transaction details before any swap, bridge, approval, stake, claim, or receipt/vouch broadcast.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
Findings (4)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:268
Finding

Bearer Authentication Token Exposed Through Raw Response Logging

Content
View full analysis
` on `GET /v1/challenge` and `POST /v1/submit` when auth is enabled. - Build sign/verify JSON with `jq --arg` — never use manual string interpolation of the multi-line message. - Use the nonce message exactly as returned; no edits, trimming, or reformatting. - Do not reuse an auth nonce — each handshake gets a fresh nonce from `/v1/auth/nonce`. - Log raw HTTP status and response body for `/v1/auth/nonce`, `/v1/auth/verify`, and `/v1/challenge` to classify failures quickly. ``` The authentication flow stores the token directly from the verification response: ```bash VERIFY_RESPONSE=$(curl -s -X POST "${COORDINATOR_URL:-https://coordinator.agentmoney.net}/v1/auth/verify" \ -H "Content-Type: application/json" \ -d "...") TOKEN=$(echo "$VERIFY_RESPONSE" | jq -r '.token') ``` ### Technical Analysis The Skill instructs the Agent to log the complete response body returned by `/v1/auth/verify`. That response contains the reusable bearer token later placed in the `Authorization` header for challenge and submission requests. Consequently, the token can be copied into terminal transcripts, CI logs, shell diagnostics, Agent telemetry, centralized logging systems, or other storage with a broader audience and longer retention period than the token itself requires. The instruction conflicts with least-privilege credential handling because troubleshooting only requires status codes and sanitized error fields, n ...[truncated 1359 chars]
Remediation
View remediation

T03 · Remote Payload Retrieval and Execution

Error
Location
SKILL.md:169
Finding

Opaque Coordinator-Supplied Transaction Calldata Is Executed Without Mandatory Local Validation

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:197
Finding

Wallet Private Key Is Passed Through Process Command-Line Arguments

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
README.txt:5
Finding

Installation Instructions Use Unpinned Mutable Third-Party Sources

Content
View full analysis
Remediation
View remediation
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
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (20)

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
98% confidence
Finding

The skill explicitly tells the agent to treat externally returned solveInstructions as authoritative and to place final formatting instructions from that payload last in the model prompt. That is a direct prompt-injection sink: untrusted challenge content can steer model behavior, potentially overriding safer local policies or causing disclosure/manipulation of outputs and downstream actions.

Content

Scanner excerpt · SKILL.md (reported line 314)May include surrounding context.

md
- `creditsPerSolve` — 100, 205, 520, 1,075, or 2,200 depending on miner's staked balance
- `challengeManifestHash` — **save this value**; you must echo it back in your submit payload
- `challengeDomain` — the domain actually served for this challenge
- `solveInstructions` — the authoritative challenge-specific solve and output instructions
- `traceSubmission` — metadata about reasoning trace requirements, when present:
  - `required` — boolean; if `true`, you **must** include a `reasoningTrace` to pass
  - `schemaVersion` — currently `3`

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding

The README instructs users to run npx skills add botcoinmoney/botcoin-miner-skill without pinning a specific package or skill version. That allows a future compromised or malicious upstream release to be fetched and executed at install time, which is especially concerning for an agent skill tied to wallets, API keys, on-chain actions, and staking.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding

The README also tells users to install the bankr skill via npx skills add BankrBot/openclaw-skills --skill bankr without a pinned version. Because this dependency handles banking or wallet-related functionality and is a prerequisite for mining, an attacker controlling or poisoning the referenced skill version could gain code execution or manipulate financial operations.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The activation trigger is phrased broadly: 'When the user asks to mine BOTCOIN, follow these steps in order.' That can cause an agent to initiate wallet discovery, balance checks, staking, signing, swaps, bridging, and transaction submission from a high-level user request without explicit per-action confirmation, increasing the risk of unsafe autonomous financial actions.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 72)May include surrounding context.

Path A (Bankr): Look up the user's Base EVM wallet from their API key:

bash
curl -s https://api.bankr.bot/agent/me \
  -H "X-API-Key: $BANKR_API_KEY"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 113)May include surrounding context.

Path A (Bankr): Look up the user's Base EVM wallet from their API key:

bash
curl -s https://api.bankr.bot/agent/me \
  -H "X-API-Key: $BANKR_API_KEY"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 119)May include surrounding context.

Path A (Bankr): Look up the user's Base EVM wallet from their API key:

bash
curl -s https://api.bankr.bot/agent/me \
  -H "X-API-Key: $BANKR_API_KEY"

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 113)May include surrounding context.

bash
# Check balances
curl -s -X POST https://api.bankr.bot/agent/prompt \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $BANKR_API_KEY" \
  -d '{"prompt": "what are my balances on base?"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This natural-language prompt instructs an external custodial service to perform a token swap. In context, it can spend user funds based on skill logic and broad activation, and natural-language transaction intents are harder to validate than structured allowlisted actions, increasing the chance of unintended or manipulated financial operations.

Content

Scanner excerpt · SKILL.md (reported line 124)May include surrounding context.

If BOTCOIN is below 5M, swap into it (Bankr uses Uniswap pools, not Clanker):

bash
curl -s -X POST https://api.bankr.bot/agent/prompt \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $BANKR_API_KEY" \
  -d '{"prompt": "swap $10 of ETH to 0xA601877977340862Ca67f816eb079958E5bd0BA3 on base"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

This prompt asks an external service to bridge funds to Base, a state-changing financial action. In the skill context, bridging can move assets across chains and incur fees or loss if parameters are wrong, so initiating it from agent logic without explicit confirmation is dangerous.

Content

Scanner excerpt · SKILL.md (reported line 133)May include surrounding context.

If ETH is zero or below ~0.001:

bash
curl -s -X POST https://api.bankr.bot/agent/prompt \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $BANKR_API_KEY" \
  -d '{"prompt": "bridge $2 of ETH to base"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
96% confidence
Finding

This Bankr submission is used for staking-related contract calls with coordinator-supplied calldata. That can approve token spending and lock assets into staking based on externally supplied transaction data, so blindly forwarding it creates a high-risk path to unauthorized approvals or asset immobilization.

Content

Scanner excerpt · SKILL.md (reported line 180)May include surrounding context.

Path A — Bankr: Use POST /wallet/submit (the old /agent/submit route was retired and now returns 404):

bash
curl -s -X POST https://api.bankr.bot/wallet/submit \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $BANKR_API_KEY" \
  -d '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

This is a duplicate signing finding. External signing of upstream-provided messages is sensitive because signatures can authorize access or bind identity, and the agent is instructed to proceed programmatically.

Content

Scanner excerpt · SKILL.md (reported line 233)May include surrounding context.

md
MESSAGE=$(echo "$NONCE_RESPONSE" | jq -r '.message')

# Step 2A: Sign via Bankr — use /wallet/sign (the old /agent/sign route returns 404)
SIGN_RESPONSE=$(curl -s -X POST https://api.bankr.bot/wallet/sign \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $BANKR_API_KEY" \
  -d "$(jq -n --arg msg "$MESSAGE" '{signatureType: "personal_sign", message: $msg}')")

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

This is a duplicate signing finding. External signing of upstream-provided messages is sensitive because signatures can authorize access or bind identity, and the agent is instructed to proceed programmatically.

Content

Scanner excerpt · SKILL.md (reported line 233)May include surrounding context.

md
MESSAGE=$(echo "$NONCE_RESPONSE" | jq -r '.message')

# Step 2A: Sign via Bankr — use /wallet/sign (the old /agent/sign route returns 404)
SIGN_RESPONSE=$(curl -s -X POST https://api.bankr.bot/wallet/sign \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $BANKR_API_KEY" \
  -d "$(jq -n --arg msg "$MESSAGE" '{signatureType: "personal_sign", message: $msg}')")

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 244)May include surrounding context.

md
SIGNATURE=$(cast wallet sign --private-key "$MINER_PRIVATE_KEY" "$MESSAGE")

# Step 3: Verify and obtain token (and auto-bind if available)
VERIFY_RESPONSE=$(curl -s -X POST "${COORDINATOR_URL:-https://coordinator.agentmoney.net}/v1/auth/verify" \
  -H "Content-Type: application/json" \
  -d "$(jq -n \
    --arg miner "$MINER_ADDRESS" \

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 294)May include surrounding context.

bash
NONCE=$(openssl rand -hex 16)   # or uuidgen, or any unique string per request
curl -s "${COORDINATOR_URL:-https://coordinator.agentmoney.net}/v1/challenge?miner=$MINER_ADDRESS&nonce=$NONCE" \
  -H "Authorization: Bearer $TOKEN"

External Transmission

Medium
Category
Data Exfiltration
Confidence
97% confidence
Finding

This is a duplicate of the raw transaction submission finding. Posting receipt transactions via a custodial submit API can cause irreversible on-chain effects if calldata is malicious or mistaken.

Content

Scanner excerpt · SKILL.md (reported line 595)May include surrounding context.

Path A — Bankr (POST /wallet/submit; the old /agent/submit route is gone). First the receipt:

bash
curl -s -X POST https://api.bankr.bot/wallet/submit \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $BANKR_API_KEY" \
  -d '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
97% confidence
Finding

This is a duplicate of the raw transaction submission finding. Posting receipt transactions via a custodial submit API can cause irreversible on-chain effects if calldata is malicious or mistaken.

Content

Scanner excerpt · SKILL.md (reported line 595)May include surrounding context.

Path A — Bankr (POST /wallet/submit; the old /agent/submit route is gone). First the receipt:

bash
curl -s -X POST https://api.bankr.bot/wallet/submit \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $BANKR_API_KEY" \
  -d '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
92% confidence
Finding

The skill also submits a second on-chain vouch transaction from coordinator-provided data. Even if described as non-gating and fire-and-forget, it still authorizes an irreversible state change and should not be blindly executed.

Content

Scanner excerpt · SKILL.md (reported line 613)May include surrounding context.

Then the vouch transaction (same pattern, fields from vouchTransaction):

bash
curl -s -X POST https://api.bankr.bot/wallet/submit \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $BANKR_API_KEY" \
  -d '{

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

Claim transactions are state-changing on-chain actions that may move rewards and incur gas costs. Because the skill instructs the agent to fetch calldata from an external coordinator and submit it directly, a compromised dependency or logic error could lead to unauthorized or malformed claims and other contract interactions.

Content

Scanner excerpt · SKILL.md (reported line 711)May include surrounding context.

Path A — Bankr (POST /wallet/submit, synchronous, no job polling):

bash
curl -s -X POST https://api.bankr.bot/wallet/submit \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $BANKR_API_KEY" \
  -d '{

Unbounded Resource Access

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill allows unbounded resource consumption (API calls, storage, compute). Without rate limits or quotas, a compromised or misbehaving agent can cause denial-of-service or cost overruns.

Content

Scanner excerpt · SKILL.md (reported line 822)May include surrounding context.

md
- **Nonce mismatch on submit**: If you get "ChallengeId mismatch", ensure you're sending the same nonce you used when requesting the challenge.
- **Manifest mismatch (409)**: The `challengeManifestHash` does not match. Fetch a new challenge and use the fresh manifest hash.
- **Consistent failures across many challenges**: If the LLM fails repeatedly after many different challenges, stop and inform the user. Suggest adjusting model selection or thinking budget — see the configuration notes in Step B.
- **Do NOT** loop indefinitely. Each attempt costs LLM credits.

### LLM provider errors (stop immediately, do not retry)
- **401 / 403 from LLM API**: Authentication or permissions issue. Stop and tell the user to check their API key.

Static analysis

No suspicious patterns detected.