Back to skill

Security audit

Solpaw

Security checks for vulnerabilities and agentic risk

Overview

This skill is for launching Solana tokens, but it asks for high-impact wallet/private-key authority and has inconsistent token-creator claims around a real fund-moving workflow.

Review carefully before installing. Use only a dedicated low-balance wallet, do not provide a main-wallet private key, confirm every fee payment and signed transaction manually, and verify whether the actual launch path preserves your wallet as the on-chain creator before paying the 0.1 SOL fee.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (3)

T09 · Insecure Skill Coding Practices

Warning
Location
solpaw-skill.ts:83
Finding
API Credentials Can Be Transmitted to an Arbitrary Configured Endpoint<![CDATA[ ## Vulnerability Details **File Location**: `solpaw-skill.ts`, lines 83-91 and 97-116 **Vulnerability Type**: Unrestricted credential-bearing network destination **Risk Level**: Medium ### Vulnerable Code ```typescript constructor(config: SolPawConfig) { if (!config.apiEndpoint) throw new Error("SolPaw: apiEndpoint is required"); if (!config.apiKey) throw new Error("SolPaw: apiKey is required"); if (!config.defaultCreatorWallet) throw new Error("SolPaw: defaultCreatorWallet is required"); this.config = { ...config, apiEndpoint: config.apiEndpoint.replace(/\/$/, ""), }; } ``` ```typescript private async request<T>( method: string, path: string, body?: Record<string, unknown>, headers?: Record<string, string> ): Promise<T> { const url = `${this.config.apiEndpoint}${path}`; const response = await fetch(url, { method, headers: { "Content-Type": "application/json", Authorization: `Bearer ${this.config.apiKey}`, ...headers, }, body: body ? JSON.stringify(body) : undefined, signal: AbortSignal.timeout(120000), }); ``` ### Technical Analysis The constructor accepts any nonempty `apiEndpoint` and performs no scheme, origin, or host validation. The common request function then attaches the SolPaw API key as a Bearer credential to every request made against that endpoint. Consequently, the API key can be disclosed if the endpoint is changed to an attacker-controlled server through a malicious configuration, configuration injection, deployment mistake, or compromised agent configuration. The code also does not require HTTPS, so a configured plaintext HTTP endpoint could expose credentials and request bodies to network interception. The outbound request body may additionally contain the creator wallet, payment transaction signature, CSRF token, token metadata, social links, and fee parameters. Most of those fields are necessary for the hosted launch service, but they must only be s ...[truncated 1212 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Default to a fixed, trusted SolPaw API origin and do not expose endpoint replacement unless self-hosting is explicitly enabled. 2. Parse the endpoint with `new URL()` and require the `https:` scheme. 3. Enforce an explicit hostname and port allowlist for the hosted mode, such as `api.solpaw.fun` on port 443. 4. If custom self-hosted endpoints are necessary, require a separate opt-in flag and separate credentials that are not valid against the hosted service. 5. Reject endpoints containing embedded credentials, unexpected ports, fragments, or unapproved URL schemes. 6. Before attaching the Authorization header, verify that the final URL origin exactly matches the approved origin. 7. Prevent redirects from forwarding credentials to another origin by disabling redirects or validating every redirect destination. 8. Document precisely which account and launch data is transmitted to the service. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
SKILL.md:6
Finding
Wallet Private-Key Access and Raw Command Execution Exceed Implemented Requirements<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 6-10 and 33-40; `skill.json`, lines 3-10; `SKILL.md`, lines 105-128 **Vulnerability Type**: Excessive secret access and execution privileges **Risk Level**: High ### Vulnerable Configuration and Documentation ```yaml user-invocable: true disable-model-invocation: false command-dispatch: tool command-tool: exec command-arg-mode: raw metadata: {"openclaw": {"emoji": "🐾", "requires": {"bins": ["curl"], "env": ["SOLPAW_API_KEY", "SOLPAW_CREATOR_WALLET", "SOLANA_PRIVATE_KEY"], "config": []}, "primaryEnv": "SOLPAW_API_KEY", "install": []}} ``` ```json { "name": "solpaw", "description": "Launch Solana tokens on Pump.fun via SolPaw. 0.1 SOL one-time fee. Your wallet is the onchain creator.", "env": { "SOLPAW_API_KEY": "", "SOLPAW_CREATOR_WALLET": "", "SOLANA_PRIVATE_KEY": "", "SOLPAW_API_URL": "https://api.solpaw.fun/api/v1" }, "dependencies": ["curl"] } ``` ```markdown 3. Environment variables set: - `SOLPAW_API_KEY` — your SolPaw API key - `SOLPAW_CREATOR_WALLET` — your Solana wallet public key - `SOLANA_PRIVATE_KEY` — your wallet private key (base58 encoded, for signing) ``` ```typescript import SolPawSkill from './solpaw-skill'; import { Keypair } from '@solana/web3.js'; const solpaw = new SolPawSkill({ apiEndpoint: 'https://api.solpaw.fun/api/v1', apiKey: process.env.SOLPAW_API_KEY, defaultCreatorWallet: process.env.SOLPAW_CREATOR_WALLET, }); const keypair = Keypair.fromSecretKey(bs58.decode(process.env.SOLANA_PRIVATE_KEY)); // One-call launch: pays fee + uploads + signs + submits const result = await solpaw.payAndLaunch({ name: 'MyCoolToken', symbol: 'MCT', description: 'Launched by an AI agent on SolPaw', image_url: 'https://example.com/logo.png', initial_buy_sol: 0.5, }, keypair); ``` ### Technical Analysis The Skill requests access to `SOLANA_PRIVATE_KEY` while also declaring raw `exec` command dispatch. A process or command wi ...[truncated 2473 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove `SOLANA_PRIVATE_KEY` from `SKILL.md`, `skill.json`, and all required-environment declarations. 2. Remove raw `exec` dispatch unless it is strictly necessary. Replace it with narrowly scoped, typed Skill operations. 3. Use a dedicated wallet-signing interface that never exposes raw key bytes to the agent or child processes. 4. Require a human-readable transaction preview and explicit user confirmation before every fee payment, initial purchase, or token launch. 5. Validate the recipient, amount, program IDs, account changes, slippage, and transaction instructions before asking the wallet to sign. 6. Use a dedicated low-balance wallet with only the funds needed for an approved launch. 7. Prefer hardware-backed, OS-keystore-backed, or policy-controlled signing over long-lived base58 keys in environment variables. 8. Do not advertise `payAndLaunch()` until that method exists and has been independently audited. 9. Ensure subprocesses receive an explicit minimal environment rather than inheriting all parent-process secrets. ]]>

other

Warning
Location
solpaw-skill.ts:217
Finding
Implemented Launch Mode Contradicts the Claimed On-Chain Creator Ownership<![CDATA[ ## Vulnerability Details **File Location**: `solpaw-skill.ts`, lines 217-242; `SKILL.md`, lines 3 and 105-143; `references/api-docs.md`, lines 117-121 **Vulnerability Type**: Misleading financial transaction and ownership workflow **Risk Level**: Medium ### Vulnerable Implementation ```typescript // Get fresh CSRF token const csrfToken = await this.getCsrfToken(); // Launch via Lightning API const result = await this.request<{ mint: string; signature: string; pumpfun_url: string; solscan_url: string; launch_fee: { amount_sol: number; platform_wallet: string; payment_signature: string; }; }>("POST", "/tokens/launch", { name: params.name, symbol: params.symbol.toUpperCase(), description: params.description, image_url: params.image_url, creator_wallet: params.creator_wallet || this.config.defaultCreatorWallet, twitter: params.twitter, telegram: params.telegram, website: params.website, initial_buy_sol: params.initial_buy_sol || 0, slippage: params.slippage || 10, priority_fee: params.priority_fee || 0.0005, launch_fee_signature: params.launch_fee_signature, csrf_token: csrfToken, }); ``` ### Conflicting Skill Claim ```yaml description: Launch Solana tokens on Pump.fun via the SolPaw platform. 0.1 SOL one-time fee. Your wallet is the onchain creator. ``` ```markdown ### Using the TypeScript SDK (Easier) const keypair = Keypair.fromSecretKey(bs58.decode(process.env.SOLANA_PRIVATE_KEY)); // One-call launch: pays fee + uploads + signs + submits const result = await solpaw.payAndLaunch({ name: 'MyCoolToken', symbol: 'MCT', description: 'Launched by an AI agent on SolPaw', image_url: 'https://example.com/logo.png', initial_buy_sol: 0.5, }, keypair); ``` ```markdown - ALWAYS use Local Mode (pass `signer_keypair`) so the agent's wallet is the onchain creator - The 0.1 SOL platform fee is non-refundable once the launch succeeds ``` ### Conflicting API Reference ```markdown ### POST /token ...[truncated 2545 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Implement the documented Local Mode using `/tokens/launch-local`, local transaction inspection and signing, and `/tokens/submit`. 2. Ensure the transaction is signed by the intended creator wallet and cryptographically verify that the resulting transaction assigns the expected creator before submission. 3. Display the transaction instructions, creator address, mint address, fee recipient, launch fee, initial purchase, slippage, and priority fee before requesting approval. 4. Require explicit user confirmation before both the 0.1 SOL payment and the final signed submission. 5. Remove or clearly deprecate the `/tokens/launch` fallback from the primary SDK path if it cannot preserve user creator ownership. 6. If fallback mode remains available, label it clearly and require separate explicit consent stating that the platform wallet will be the on-chain creator. 7. Remove references to `payAndLaunch()` and `signer_keypair` until those interfaces are implemented. 8. Add integration tests that verify the signer and creator recorded in the generated transaction and final on-chain launch. 9. Reconcile `README.md`, `SKILL.md`, `skill.json`, `skill.yml`, implementation comments, and the API reference so they describe one consistent ownership and payment model. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (30)

Credential Access

High
Category
Privilege Escalation
Content
```bash
git clone https://github.com/LvcidPsyche/solpaw.git
cd solpaw
cp .env.example .env
# Edit .env with your values
docker compose up -d
```
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
git clone https://github.com/LvcidPsyche/solpaw.git
cd solpaw
cp .env.example .env
# Edit .env with your values
docker compose up -d
```
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The README promotes autonomous token launches and agent-driven registration/transactions without a prominent warning that launching a token and paying the 0.1 SOL fee are irreversible on-chain actions. In an agent skill context, missing consent and risk disclosures materially increase the chance of unintended spending, unauthorized launches, or reputational harm from creating public tokens automatically.

External Transmission

Medium
Category
Data Exfiltration
Content
### 3. Register Your Agent

```bash
curl -X POST https://api.solpaw.fun/api/v1/agents/register \
  -H "Content-Type: application/json" \
  -d '{
    "agent_name": "MyCoolAgent",
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill is configured to invoke a raw exec tool and requires sensitive environment variables, including a Solana private key, while declaring no explicit tool restrictions or permission scope. In this context, missing scope boundaries is dangerous because the skill can initiate network calls and influence fund-moving operations without machine-readable guardrails limiting what tools or actions are permitted.

External Transmission

Medium
Category
Data Exfiltration
Content
### Step 1: Register (one-time)

```bash
curl -s -X POST https://api.solpaw.fun/api/v1/agents/register \
  -H "Content-Type: application/json" \
  -d '{"agent_name":"MyAgent","default_fee_wallet":"YOUR_WALLET_ADDRESS"}' | jq .
```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### Step 4: Upload token image (optional but recommended)

```bash
IMAGE_ID=$(curl -s -X POST https://api.solpaw.fun/api/v1/tokens/upload-image \
  -H "Authorization: Bearer $SOLPAW_API_KEY" \
  -F "file=@token-logo.png" | jq -r '.data.image_id')
```
Confidence
72% confidence
Finding
Uploading an image to a third-party service is expected for token metadata, but it still transmits local file contents off-host. In an agent setting using raw exec, file upload can become risky if the file path is influenced by untrusted input, potentially causing unintended disclosure of local files rather than only a token logo.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# Build unsigned transaction
TX_DATA=$(curl -s -X POST https://api.solpaw.fun/api/v1/tokens/launch-local \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SOLPAW_API_KEY" \
  -d '{
Confidence
84% confidence
Finding
The endpoint URL marks a critical trust boundary where launch parameters and credentials are sent to an external service that constructs transaction data later signed by the user's wallet. In this skill context, that dependency is more dangerous than ordinary web API use because it sits directly in the path of financial and on-chain actions.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# Build unsigned transaction
TX_DATA=$(curl -s -X POST https://api.solpaw.fun/api/v1/tokens/launch-local \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SOLPAW_API_KEY" \
  -d '{
Confidence
84% confidence
Finding
The endpoint URL marks a critical trust boundary where launch parameters and credentials are sent to an external service that constructs transaction data later signed by the user's wallet. In this skill context, that dependency is more dangerous than ordinary web API use because it sits directly in the path of financial and on-chain actions.

External Transmission

Medium
Category
Data Exfiltration
Content
# Sign the transaction with your private key, then submit
SIGNED_TX="..." # sign the base64 transaction from TX_DATA
curl -s -X POST https://api.solpaw.fun/api/v1/tokens/submit \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SOLPAW_API_KEY" \
  -d '{"signed_transaction": "'$SIGNED_TX'", "mint": "MINT_FROM_TX_DATA"}'
Confidence
88% confidence
Finding
Submitting the signed transaction to the third-party API involves transmitting a wallet-authorized transaction blob that can result in irreversible on-chain effects. Because blockchain transactions are final and value-bearing, any ambiguity about what was signed or where it is submitted creates substantial risk of unauthorized or misunderstood fund movement.

External Transmission

Medium
Category
Data Exfiltration
Content
import { Keypair } from '@solana/web3.js';

const solpaw = new SolPawSkill({
  apiEndpoint: 'https://api.solpaw.fun/api/v1',
  apiKey: process.env.SOLPAW_API_KEY,
  defaultCreatorWallet: process.env.SOLPAW_CREATOR_WALLET,
});
Confidence
90% confidence
Finding
The SDK example configures a remote API endpoint and loads a private key into process memory for a one-call flow that pays fees, signs, and submits transactions. In an agent skill, this tight coupling of remote service use and hot-wallet signing increases the blast radius of mistakes, prompt misuse, or compromised dependencies.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The one-call SDK example performs fee payment, transaction signing, and submission using the wallet private key, but the example does not prominently warn that it will spend funds and exercise direct control over signing material. In an agent skill, that omission materially increases the risk of accidental wallet use or unintended token launches by users or higher-level agents that treat the sample as safe boilerplate.

External Transmission

Medium
Category
Data Exfiltration
Content
# SolPaw API Reference

Base URL: `https://api.solpaw.fun/api/v1`

## Authentication
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# SolPaw API Reference

Base URL: `https://api.solpaw.fun/api/v1`

## Authentication
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# SolPaw API Reference

Base URL: `https://api.solpaw.fun/api/v1`

## Authentication
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# SolPaw API Reference

Base URL: `https://api.solpaw.fun/api/v1`

## Authentication
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# SolPaw API Reference

Base URL: `https://api.solpaw.fun/api/v1`

## Authentication
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# SolPaw API Reference

Base URL: `https://api.solpaw.fun/api/v1`

## Authentication
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# SolPaw API Reference

Base URL: `https://api.solpaw.fun/api/v1`

## Authentication
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# SolPaw API Reference

Base URL: `https://api.solpaw.fun/api/v1`

## Authentication
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# SolPaw API Reference

Base URL: `https://api.solpaw.fun/api/v1`

## Authentication
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# SolPaw API Reference

Base URL: `https://api.solpaw.fun/api/v1`

## Authentication
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The description advertises token launch capability and a 0.1 SOL fee, but does not clearly warn that token creation is an irreversible on-chain action and may incur additional network or platform costs. Users may invoke the skill without understanding that it can permanently create assets and spend funds, which is especially risky in an automated agent context.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The manifest explicitly requires a raw private key via the SOLANA_PRIVATE_KEY environment variable, but provides no user-facing warning about the sensitivity of that secret or safe handling expectations. In a skill that performs on-chain actions, this increases the risk of users pasting high-value wallet keys into an unvetted integration, which could lead to irreversible asset loss if the broader skill later mishandles or transmits the key.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The manifest advertises a skill that launches tokens, charges a one-time SOL fee, uses an API key, and references a creator wallet, but it provides no explicit user-facing warning that actions may spend funds, be irreversible, or create on-chain assets tied to the user's wallet. In a crypto-launch context, omission of these warnings increases the risk of accidental financial loss or unintended token deployment by operators who may treat the command like a routine automation step.

Static analysis

No suspicious patterns detected.