T09 · Insecure Skill Coding Practices
- Location
bankskills/wallet.py:46- Finding
Wallet Keystore Uses a Publicly Known Default Password
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is meant for banking and crypto operations, but it can move real funds and expose wallet keys with weak safeguards, so users should review it carefully before installing.
Install only in a controlled R&D environment with minimal funds and a least-privileged Wise token. Set a strong CLAWBANK_WALLET_PASSWORD before creating any wallet, avoid using wallets that may have been created with the default password, do not let agents execute transfers or swaps without a separate human confirmation process, and treat any private-key export as full wallet compromise if copied, logged, or shared.
bankskills/wallet.py:46Wallet Keystore Uses a Publicly Known Default Password
bankskills/sweeper.py:267Token Swaps Disable Minimum-Output Protection
bankskills/core/bank/transfer.py:95Wise Transfers Are Created and Funded Without a Confirmation Boundary
External input (network, user) flows to a code execution sink. This enables remote code execution or command injection.
cmd = [str(run_script)] + (args or [])
# Execute
result = subprocess.run(
cmd,
input=stdin_data.encode() if stdin_data else None,
capture_output=True,
The documented functionality includes local wallet creation, keystore storage, RPC balance queries, and private-key export, but the summary description does not foreground these especially sensitive behaviors. In a banking/crypto skill, underemphasizing secret-handling and wallet lifecycle operations can lead to unsafe deployment and misuse of privileged financial capabilities.
The documented functionality includes local wallet creation, keystore storage, RPC balance queries, and private-key export, but the summary description does not foreground these especially sensitive behaviors. In a banking/crypto skill, underemphasizing secret-handling and wallet lifecycle operations can lead to unsafe deployment and misuse of privileged financial capabilities.
The documented functionality includes local wallet creation, keystore storage, RPC balance queries, and private-key export, but the summary description does not foreground these especially sensitive behaviors. In a banking/crypto skill, underemphasizing secret-handling and wallet lifecycle operations can lead to unsafe deployment and misuse of privileged financial capabilities.
The documented functionality includes local wallet creation, keystore storage, RPC balance queries, and private-key export, but the summary description does not foreground these especially sensitive behaviors. In a banking/crypto skill, underemphasizing secret-handling and wallet lifecycle operations can lead to unsafe deployment and misuse of privileged financial capabilities.
The documented functionality includes local wallet creation, keystore storage, RPC balance queries, and private-key export, but the summary description does not foreground these especially sensitive behaviors. In a banking/crypto skill, underemphasizing secret-handling and wallet lifecycle operations can lead to unsafe deployment and misuse of privileged financial capabilities.
The documented functionality includes local wallet creation, keystore storage, RPC balance queries, and private-key export, but the summary description does not foreground these especially sensitive behaviors. In a banking/crypto skill, underemphasizing secret-handling and wallet lifecycle operations can lead to unsafe deployment and misuse of privileged financial capabilities.
The documented functionality includes local wallet creation, keystore storage, RPC balance queries, and private-key export, but the summary description does not foreground these especially sensitive behaviors. In a banking/crypto skill, underemphasizing secret-handling and wallet lifecycle operations can lead to unsafe deployment and misuse of privileged financial capabilities.
The documented functionality includes local wallet creation, keystore storage, RPC balance queries, and private-key export, but the summary description does not foreground these especially sensitive behaviors. In a banking/crypto skill, underemphasizing secret-handling and wallet lifecycle operations can lead to unsafe deployment and misuse of privileged financial capabilities.
The documented functionality includes local wallet creation, keystore storage, RPC balance queries, and private-key export, but the summary description does not foreground these especially sensitive behaviors. In a banking/crypto skill, underemphasizing secret-handling and wallet lifecycle operations can lead to unsafe deployment and misuse of privileged financial capabilities.
The documented functionality includes local wallet creation, keystore storage, RPC balance queries, and private-key export, but the summary description does not foreground these especially sensitive behaviors. In a banking/crypto skill, underemphasizing secret-handling and wallet lifecycle operations can lead to unsafe deployment and misuse of privileged financial capabilities.
The documented functionality includes local wallet creation, keystore storage, RPC balance queries, and private-key export, but the summary description does not foreground these especially sensitive behaviors. In a banking/crypto skill, underemphasizing secret-handling and wallet lifecycle operations can lead to unsafe deployment and misuse of privileged financial capabilities.
The documented functionality includes local wallet creation, keystore storage, RPC balance queries, and private-key export, but the summary description does not foreground these especially sensitive behaviors. In a banking/crypto skill, underemphasizing secret-handling and wallet lifecycle operations can lead to unsafe deployment and misuse of privileged financial capabilities.
The documented functionality includes local wallet creation, keystore storage, RPC balance queries, and private-key export, but the summary description does not foreground these especially sensitive behaviors. In a banking/crypto skill, underemphasizing secret-handling and wallet lifecycle operations can lead to unsafe deployment and misuse of privileged financial capabilities.
The documented functionality includes local wallet creation, keystore storage, RPC balance queries, and private-key export, but the summary description does not foreground these especially sensitive behaviors. In a banking/crypto skill, underemphasizing secret-handling and wallet lifecycle operations can lead to unsafe deployment and misuse of privileged financial capabilities.
Private-key export is an extremely sensitive capability that exceeds what is necessary for routine banking or token swapping. If abused by an agent, prompt injection, or compromised runtime, it enables total theft of on-chain funds and persistent wallet compromise.
The security section says private keys are never logged or exposed, but the documented export-private-key action explicitly returns the private key. This contradiction is dangerous because it can mislead reviewers and users into trusting a skill that has a direct secret-exfiltration capability.
The handler directly exposes a money-transfer action and will execute it whenever the required fields are present, with no explicit confirmation, approval gate, step-up authentication, or dry-run review in this entry point. In a banking skill, that omission is dangerous because any upstream prompt injection, accidental invocation, malformed automation, or unauthorized caller could trigger real fund movement immediately.
The function executes the full Wise transfer flow and unconditionally funds the transfer immediately after creation, with no built-in confirmation gate, dry-run mode, or explicit acknowledgment step before the irreversible payment action. In a banking skill, this is especially dangerous because upstream callers, agents, or prompt-influenced workflows can trigger real fund movement from provided parameters, increasing the risk of accidental or socially engineered transfers.
buy_token signs and submits irreversible on-chain swaps without any explicit user confirmation, preview, or secondary approval, even though it can spend wallet ETH and route through liquidity pools with no slippage protection (amount_out_min=0). In an agent-driven environment, this is especially dangerous because mistaken intent interpretation or adversarial prompting can trigger real financial loss immediately.
send_token executes ETH and ERC-20 transfers directly after basic format and balance checks, with no user-facing warning, confirmation, or authorization barrier. Because transfers are irreversible and can send the entire wallet balance to an attacker-controlled address, this is a critical risk in the context of a banking skill that has access to real assets and a loaded private key.
The module provides a direct private-key export function even though the stated purpose is banking and token swaps, not wallet recovery tooling. Returning raw secret material to callers creates an easy path for account takeover if this function is exposed through an agent tool, logged, intercepted, or invoked by an untrusted prompt.
The function returns the raw private key immediately with no confirmation, secondary approval, or contextual restriction. In an agent setting this is especially dangerous because a single prompt, tool call, or integration bug could disclose the key and irreversibly compromise all assets in the wallet.
The code documents that the decrypted private key should never be exposed to tool responses, yet export_private_key does exactly that. This contradiction indicates the intended security boundary is broken, making accidental exposure via agent responses, telemetry, or downstream integrations much more likely.
The README advertises capabilities to send money and transfer tokens but does not pair those actions with strong pre-execution confirmation, recipient verification, reversibility warnings, or approval controls. In an agent skill context, documenting high-risk financial actions as routine increases the chance that an LLM-driven agent or user will invoke irreversible transfers based on ambiguous prompts or prompt injection.
No suspicious patterns detected.