T09 · Insecure Skill Coding Practices
- Location
skill.md:73- Finding
Blind Signing of Server-Controlled USDC Payment Authorization
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is purpose-aligned with minting an NFT, but it asks the agent to handle raw wallet private keys and sign payment and transaction data without enough user control or validation.
Review before installing. Use only a dedicated, minimally funded wallet, do not paste a valuable wallet private key into the agent, require explicit confirmation before each signature and broadcast, and independently verify the payment amount, chain, contract, recipient, transaction calldata, and fees.
skill.md:73Blind Signing of Server-Controlled USDC Payment Authorization
skill.md:114Blind Signing and Submission of an Arbitrary Server-Provided Transaction
skill.md:145Skill Requests Reusable Wallet Private Keys and Assumes Full Signing Authority
skill.md:148Unpinned Runtime Dependency Installation in a Private-Key Signing Workflow
The security section claims the skill does not access the filesystem, run shell commands, or execute arbitrary code, but later instructions explicitly require curl, node, npm, and local file writes. This contradiction can mislead users and agents into granting trust under false assumptions, increasing the chance they expose sensitive credentials or permit unsafe execution paths.
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.
Install locally:
mkdir -p ~/.openclaw/skills/base-buds
curl -s https://budsbase.xyz/skill.md > ~/.openclaw/skills/base-buds/SKILL.md
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
Install locally:
mkdir -p ~/.openclaw/skills/base-buds
curl -s https://budsbase.xyz/skill.md > ~/.openclaw/skills/base-buds/SKILL.md
Or just read the URL directly!
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Install locally:
mkdir -p ~/.openclaw/skills/base-buds
curl -s https://budsbase.xyz/skill.md > ~/.openclaw/skills/base-buds/SKILL.md
Or just read the URL directly!
Skill grants unrestricted tool access without appropriate constraints. An agent with unfettered tool access can perform arbitrary actions including file modification, network requests, and code execution.
## Security
- Your EVM private key should **never** leave your local environment — signing happens locally
- This skill makes only HTTP API calls. It does not access your filesystem, run shell commands, or execute arbitrary code
## How It Works
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
const wallet = new ethers.Wallet(PK);
// 2a. Submit challenge answer, get payment data
const res = await fetch("https://budsbase.xyz/api/prepare", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ wallet: wallet.address, challengeId: "CHALLENGE_ID", answer: "ANSWER" }),
The instruction to handle the entire mint flow from the user's wallet address and private key 'without asking further questions' encourages autonomous execution of financial operations. In this context, that reduces human verification at the exact points where payment authorization and transaction signing occur, increasing the risk of unintended spending or abuse.
## Agent Behavior
- The user will provide their **wallet address** and **private key**. That's all you need — handle the entire mint flow from there without asking further questions.
- **Step 1** (challenge): use `curl`.
- **Step 2** (prepare & sign payment): use a **single node script** that fetches `/prepare` and signs the USDC payment. Do NOT split this into separate curl + node steps.
- **ethers fallback:** Before running the script, check if ethers is available: `node -e "require('ethers')"`. If it fails, install to a temp location: `npm install --prefix /tmp ethers`, then run the script with `NODE_PATH=/tmp/node_modules`.
The skill directs the agent to execute curl, node, and npm commands, including installing dependencies at runtime, even though the capability needed is nominally HTTP requests and local signing. This expands the attack surface significantly: shell execution, package installation, and script execution can be abused to compromise the host environment or exfiltrate secrets if the instructions or fetched dependencies are tampered with.
The skill instructs the user to provide a wallet private key and tells the agent to complete the mint flow without further questions, but it does not require an explicit warning or confirmation about irreversible on-chain spending and transaction signing. In context, this is especially dangerous because the flow authorizes a USDC transfer and signs a blockchain transaction, both of which can cause immediate asset loss if the transaction data is malicious or misunderstood.
No suspicious patterns detected.