Back to skill

Security audit

MistTrack Skills

Security checks for vulnerabilities and agentic risk

Overview

This is disclosed AML tooling, but its optional pay-per-use path can sign blockchain payments from local private keys with under-scoped safeguards, so it needs careful review before installation.

Prefer the read-only MISTTRACK_API_KEY mode. Do not use scripts/pay.py with a main wallet key; if x402 is necessary, use a dedicated low-balance wallet, verify the destination URL is a legitimate MistTrack x402 endpoint, review each payment, and avoid --auto or auto_pay=True in production.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/pay.py:299
Finding

Advertised Payment Cap Can Be Bypassed Through the Direct EIP-3009 Signing Command

Content
View full analysis
MAX_AMOUNT: raise ValueError( f"Payment amount {amount} exceeds hard cap {MAX_AMOUNT} " f"(${amount / 1_000_000:.2f} > ${MAX_AMOUNT / 1_000_000:.2f} USDC). " f"Signing refused — possible malicious server." ) ``` The direct signing command bypasses that function and passes the user-controlled amount directly to the signer: ```python def cmd_sign_eip3009(args): """Sign an EIP-3009 transferWithAuthorization.""" result = sign_eip3009( private_key=args.private_key, token_address=args.token, chain_id=args.chain_id, to=args.to, amount=args.amount, token_name=args.token_name, token_version=args.token_version, max_timeout=args.max_timeout, ) print(json.dumps(result, indent=2)) ``` ### Technical Analysis The project documentation states that the `$1.00 USDC` hard cap is enforced unconditionally ...[truncated 1884 chars]
Remediation
View remediation
int: amount = int(amount) if amount <= 0: raise ValueError("Payment amount must be positive") if amount > MAX_USDC_AMOUNT: raise ValueError("Payment amount exceeds the $1.00 USDC hard cap") return amount def sign_eip3009(..., amount, ...): amount = validate_payment_amount(amount) ... ``` ]]>

T09 · Insecure Skill Coding Practices

Error
Location
scripts/pay.py:245
Finding

Untrusted HTTP 402 Terms Control the Token Contract, Network, and Payment Recipient

Content
View full analysis
MAX_AMOUNT: raise ValueError( f"Payment amount {amount} exceeds hard cap {MAX_AMOUNT} " f"(${amount / 1_000_000:.2f} > ${MAX_AMOUNT / 1_000_000:.2f} USDC). " f"Signing refused — possible malicious server." ) scheme = req.get("scheme", "exact") network = req.get("network", "") payload = { "x402Version": 2, "accepted": req, } if network.startswith("eip155:"): # EVM payment cid = int(network.split(":")[1]) if not chain_id else chain_id extra = req.get("extra", {}) method = extra.get("assetTransferMethod", "eip3009") if method == "eip3009": result = sign_eip3009( private_key=private_key, token_address=req["asset"], chain_id=cid, to=req["payTo"], amount=req["amount"], token_name=extra.get("name", "USD Coin"), token_version=extra. ...[truncated 3000 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/pay.py:328
Finding

Unrestricted Payment URL Enables Server-Side Request Forgery and Data Disclosure

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (52)

Context-Inappropriate Capability

Critical
Category
Not specified by scanner
Confidence
100% confidence
Finding

The code reads private keys from disk and later uses them to generate transferable EIP-3009 and Solana payment signatures, granting the skill direct authority over user funds. For an AML/risk-analysis integration, this capability is unjustified and highly dangerous because any compromised flow, malicious 402 response, or deceptive invocation could coerce the tool into authorizing asset transfers.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The most serious mismatch is that a skill presented as analytics/investigation also supports reading private keys from local files, signing blockchain payment authorizations, partially signing Solana transactions, and performing HTTP 402 payment retries. This creates a high-risk hidden capability: an operator may authorize what appears to be read-only AML tooling, while the skill can in fact initiate value-bearing cryptographic payment operations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The most serious mismatch is that a skill presented as analytics/investigation also supports reading private keys from local files, signing blockchain payment authorizations, partially signing Solana transactions, and performing HTTP 402 payment retries. This creates a high-risk hidden capability: an operator may authorize what appears to be read-only AML tooling, while the skill can in fact initiate value-bearing cryptographic payment operations.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

This file implements a cryptocurrency payment/signing client, including HTTP 402 payment handling and blockchain transaction signing, which is materially outside the declared AML/risk-analysis purpose of the skill. In a skill that should only analyze addresses and transactions, adding payment execution capability creates an unnecessary and dangerous path to move funds or authorize transfers if the tool is invoked on attacker-controlled endpoints.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The request flow automatically interprets HTTP 402 responses, builds a payment payload from server-provided data, signs it, and retries the request with the resulting payment signature. This turns a nominal analysis skill into an active payment agent and allows attacker-controlled servers or modified endpoints to solicit signatures or payments during ordinary API usage.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
98% confidence
Finding

The code explicitly reads a private key into process memory for downstream signing operations. In the context of an AML/risk-analysis skill, credential access to blockchain private keys is unnecessary and dramatically increases the blast radius: compromise of the tool, invocation path, or adjacent code can lead directly to fund theft or unauthorized signatures.

Content

Scanner excerpt · scripts/pay.py (reported line 475)May include surrounding context.

python
)
        sys.exit(1)

    # Read private key from file; expose as args.private_key for downstream functions.
    if hasattr(args, "key_file"):
        args.private_key = _read_key_file(args.key_file)

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · README.md (reported line 10)May include surrounding context.

md
[MistTrack](https://misttrack.io/) is an AML tracking tool developed by [SlowMist](https://www.slowmist.com/en/), covering 400M+ addresses and 500K+ threat intelligence entries.

- Works with OpenClaw, Claude Code, and other major agent platforms
- Integrates with **Bitget Wallet Skill** / **Trust Wallet Skills** / **Binance Skills** / **OKX Agent Skills** - automatically runs MistTrack address security checks before any transfer
- Supports identifying and parsing multi-signature addresses
- Supports x402 Payment, allowing usage without an API key by paying via x402.

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.

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 · README.md (reported line 113)May include surrounding context.

Quick Start

  1. Log in to the MistTrack Dashboard using email verification code, then subscribe to the Standard Plan (new users can choose the limited-time trial plan for $10). After payment, you can create an API Key
  2. Set the environment variable (recommended):
    bash
    export MISTTRACK_API_KEY=your_api_key_here
    

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The README instructs users to place a raw private key into a local file for x402 payments, but it does not prominently warn that this key controls funds and must never be reused or exposed. In a cryptocurrency context, mishandling a signing key can directly lead to wallet compromise or unauthorized payment signing, making the omission materially risky.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill declares broad operational behavior, including scripts that use environment variables, local files, shell commands, and network access, but it does not define any explicit tool scope such as permissions or allowed-tools. In an agent setting, that omission increases the chance that a host platform grants overly broad capabilities, enabling risky actions like file access or payment execution beyond the intended AML lookup use case.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The document explicitly promotes autonomous AI agent payments and automatic completion of payments without any warning about spending limits, user approval, wallet segregation, or transaction review. In an agent skill context, this can normalize unsafe implementation patterns where an agent is allowed to spend funds programmatically, increasing the risk of unauthorized or excessive payments if prompts, integrations, or counterparties are manipulated.

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 · docs/x402.md (reported line 216)May include surrounding context.

md
| Environment | URL | Auth |
|-------------|-----|------|
| Testnet (Base Sepolia / Solana Devnet) | `https://x402.org/facilitator` | None |
| Production (Base / Polygon / Solana Mainnet) | `https://api.cdp.coinbase.com/platform/v2/x402` | CDP 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 · docs/x402.md (reported line 336)May include surrounding context.

md
| Environment | URL | Auth |
|-------------|-----|------|
| Testnet (Base Sepolia / Solana Devnet) | `https://x402.org/facilitator` | None |
| Production (Base / Polygon / Solana Mainnet) | `https://api.cdp.coinbase.com/platform/v2/x402` | CDP 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 · docs/x402.md (reported line 344)May include surrounding context.

md
| Environment | URL | Auth |
|-------------|-----|------|
| Testnet (Base Sepolia / Solana Devnet) | `https://x402.org/facilitator` | None |
| Production (Base / Polygon / Solana Mainnet) | `https://api.cdp.coinbase.com/platform/v2/x402` | CDP 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 · docs/x402.md (reported line 374)May include surrounding context.

md
import requests

# Step 1: Send initial request
response = requests.get("https://api.example.com/resource")

if response.status_code == 402:
    # Step 2: Parse X-Payment-Required header (base64 JSON)

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 · docs/x402.md (reported line 386)May include surrounding context.

md
import requests

# Step 1: Send initial request
response = requests.get("https://api.example.com/resource")

if response.status_code == 402:
    # Step 2: Parse X-Payment-Required header (base64 JSON)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

When --output is used, the script writes the full investigation report to disk with no warning, consent checkpoint, or guidance about handling sensitive AML/intelligence data. In this skill’s context, the output may include labels, counterparties, transaction history, social identifiers, and risk information, so silent persistence increases the chance of unintended local disclosure through shared systems, backups, logs, or weak file permissions.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% 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 · scripts/batch_risk_check.py (reported line 48)May include surrounding context.

python
else:
        raise ValueError("at least one of address or txid is required")

    response = requests.post(
        f"{BASE_URL}/v2/risk_score_create_task",
        headers={"Content-Type": "application/json"},
        json=payload,

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The script sends user-supplied blockchain addresses and the API key to the MistTrack API over the network. While the docstring explains usage, it does not clearly warn that supplied addresses and related query data will be transmitted to a third-party service, which is a privacy-relevant operation for a code file.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The script sends user-supplied EVM addresses to the Safe Transaction Service, which discloses potentially sensitive investigation targets to a third party without clearly warning the operator in the CLI help or output. In an AML/compliance skill, addresses under investigation can themselves be sensitive intelligence, so silent network exfiltration of query targets creates a real privacy and operational-security risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The TRON analysis path sends the user-provided address to the public TronGrid API without an explicit disclosure to the user. Because this skill is designed for cryptocurrency risk analysis and transaction tracing, queried addresses may correspond to sensitive investigations, making undisclosed third-party exposure operationally risky.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
88% confidence
Finding

The documentation instructs users to persist a reusable private key in a local file for later payment operations. While the file is recommended to be mode 600, persisting raw key material on disk creates long-lived secret exposure and is especially inappropriate for a skill whose declared purpose is analysis rather than payment execution.

Content

Scanner excerpt · scripts/pay.py (reported line 17)May include surrounding context.

python
Store the key in a file with restricted permissions and pass the file path:

  # Create key file (one-time setup)
  echo "your_hex_private_key" > ~/.x402_key
  chmod 600 ~/.x402_key

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
91% confidence
Finding

The --auto option allows payment without interactive confirmation, reducing a key safety barrier before authorizing a financial action. In combination with remote 402-controlled payment parameters, this makes accidental or scripted fund authorization much easier.

Content

Scanner excerpt · scripts/pay.py (reported line 457)May include surrounding context.

python
help="File containing request body JSON (use '-' for stdin)")
    p.add_argument("--header", nargs="*", help="Extra headers (key: value)")
    p.add_argument("--auto", action="store_true",
                   help="Auto-pay without confirmation (for testing only)")
    p.set_defaults(func=cmd_pay)

    args = parser.parse_args()

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The script sends the recipient address and API key to MistTrack over the network as part of transfer screening, but there is no just-in-time disclosure or consent mechanism at the point where sensitive transaction metadata is shared with a third-party service. In a wallet or exchange-transfer context, recipient addresses can reveal user relationships, counterparties, and intended transfers, so undisclosed external transmission creates a meaningful privacy and compliance risk even if the service is legitimate.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.