Back to skill

Security audit

Solpaw

Security checks for vulnerabilities and agentic risk

Overview

This skill is for real Solana token launches, but it asks for broad shell execution and wallet-key access while its implementation does not fully match its creator-control claims.

Review before installing. Use a dedicated low-balance wallet, do not expose a primary wallet private key to the agent environment, verify the exact endpoint and transaction details, and treat launches, fees, metadata uploads, and initial buys as public and irreversible. The package should ideally remove raw exec dispatch, avoid SOLANA_PRIVATE_KEY, and align its implementation with the promised local creator flow.

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

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:7
Finding
Raw Shell Execution Exceeds the Skill's Required Privileges<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:7-10` **Vulnerability Type**: Raw command execution and command-injection exposure **Risk Level**: High ### Vulnerable Code ```yaml 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": []}} ``` ### Technical Analysis The Skill configures its command interface to dispatch raw arguments to the general-purpose `exec` tool. No command-specific parser, argument allowlist, escaping layer, or typed wrapper is included in the project. Token creation requires only constrained API operations and does not inherently require unrestricted shell execution. Consequently, this configuration grants substantially broader privileges than the declared functionality requires. If untrusted token metadata, user input, or prompt-injected content is incorporated into a command, shell metacharacters may be interpreted as executable syntax rather than inert data. The exact exploitability depends on how the host OpenClaw runtime implements raw `exec` dispatch, but the project itself provides no mitigating validation. ### Attack Path 1. An attacker supplies token metadata or instructions containing shell syntax, such as command separators, substitutions, or redirections. 2. The agent constructs or invokes the Skill's `launch` command using the attacker-controlled text. 3. Because `command-arg-mode` is `raw` and the command tool is `exec`, the text may reach a shell command context without structured parsing. 4. Shell syntax is interpreted by the operating system. 5. The injected command executes with the same operating-system privileges and environment access as the OpenClaw process. ### Impact Assessment Successful exploitation could permit arbitrary command execution under the agent's account. This may expo ...[truncated 383 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove `command-tool: exec` and `command-arg-mode: raw`. 2. Expose a typed tool whose schema separately defines `name`, `symbol`, `description`, wallet address, transaction signature, and numeric launch parameters. 3. Call the API directly from TypeScript rather than constructing shell commands. 4. Apply strict validation: - Enforce documented length limits. - Restrict symbols to the documented alphanumeric format. - Validate Solana addresses and transaction signatures. - Validate numeric ranges for purchase amount, slippage, and priority fee. - Require HTTPS for user-provided URLs. 5. If a subprocess is unavoidable, invoke a fixed executable with an argument array and no shell, rather than interpolating values into a command string. 6. Run the Skill under a restricted account with a minimal environment and no wallet private key. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
solpaw-skill.ts:84
Finding
Bearer API Key Is Sent to an Unvalidated Configurable Endpoint<![CDATA[ ## Vulnerability Details **File Location**: `solpaw-skill.ts:84-116` **Vulnerability Type**: Sensitive credential transmission to an unvalidated destination **Risk Level**: High ### 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(/\/$/, ""), }; } /** * Make an authenticated request to the SolPaw API. * API key is sent in the Authorization header — never in query params or body. */ 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), // 2 min timeout for launches }); ``` ### Technical Analysis The constructor accepts any nonempty `apiEndpoint` and only removes one trailing slash. It does not enforce HTTPS, validate the hostname, reject embedded credentials, or restrict the endpoint to a trusted deployment. Every API request then attaches the configured API key in the `Authorization` header. An attacker who can influence configuration can direct authenticated requests to a server they control. A mistakenly configured plaintext HTTP endpoint would also expose the credential to network interception. In addition to the API key, launch requests transmit creator-wallet information, token metadata, a launch-fee transaction signature, and a CSRF token. Those fields are generally necessary for the ...[truncated 1320 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Use a fixed default origin such as `https://api.solpaw.fun`. 2. Parse the endpoint with the standard `URL` class before storing it. 3. Enforce `https:` and reject plaintext HTTP. 4. Reject embedded usernames or passwords, fragments, unexpected ports, and malformed paths. 5. Restrict production use to an explicit allowlist of trusted hostnames. 6. If self-hosting must remain supported, require an explicit trusted-origin setting separate from ordinary launch configuration. 7. Disable or manually validate redirects so credentials cannot be forwarded outside the approved origin. 8. Keep the API key in a secret store and provide it only to the narrow API client process. 9. Consider certificate pinning or equivalent deployment-level controls where the threat model warrants it. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
SKILL.md:10
Finding
Skill Unnecessarily Requests Full Solana Wallet Private-Key Access<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:10, 35-40, 109-127`; `skill.json:3-8` **Vulnerability Type**: Excessive secret access and violation of least privilege **Risk Level**: High ### Vulnerable Code ```yaml metadata: {"openclaw": {"emoji": "🐾", "requires": {"bins": ["curl"], "env": ["SOLPAW_API_KEY", "SOLPAW_CREATOR_WALLET", "SOLANA_PRIVATE_KEY"], "config": []}, "primaryEnv": "SOLPAW_API_KEY", "install": []}} ``` ```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 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); ``` The same requirement is declared in `skill.json`: ```json "env": { "SOLPAW_API_KEY": "", "SOLPAW_CREATOR_WALLET": "", "SOLANA_PRIVATE_KEY": "", "SOLPAW_API_URL": "https://api.solpaw.fun/api/v1" } ``` ### Technical Analysis The Skill requests a base58-encoded wallet private key as an environment variable. Possession of this secret provides wallet signing authority and is substantially more sensitive than a public creator address or an API credential. The shipped implementation in `solpaw-skill.ts` does not read the private key, perform local signing, or implement the documented `payAndLaunch` method. Its implemented `launchToken()` method only submits launch parameters and an existing fee transaction signature. Therefore, private-key access is not necessary for the functionality actually implemented by the package. Making the key available in the OpenClaw process also increases the consequences of the raw `exec` ...[truncated 1121 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove `SOLANA_PRIVATE_KEY` from `SKILL.md`, `skill.json`, installation messages, and required environment metadata. 2. Do not place wallet seed phrases or private keys in general process environment variables. 3. Use a wallet adapter, hardware wallet, external signer, operating-system key store, or isolated signing service. 4. Expose only a narrow signing interface that displays or validates transaction intent before authorization. 5. Require explicit user approval for every value-transferring transaction. 6. Restrict signing policies by destination, maximum amount, network, and transaction type where possible. 7. Ensure the Skill receives only a public wallet address and an already authorized signature unless local signing is genuinely implemented. 8. Rotate the wallet immediately if a private key has already been exposed to an untrusted Skill execution environment. ]]>

other

Warning
Location
solpaw-skill.ts:232
Finding
Documented Local-Creator Launch Flow Does Not Match the Implemented Fallback Endpoint<![CDATA[ ## Vulnerability Details **File Location**: `solpaw-skill.ts:232-250`; `SKILL.md:109-137`; `references/api-docs.md:106-116` **Vulnerability Type**: Security-relevant documentation and implementation mismatch **Risk Level**: Medium ### Conflicting Code and Documentation The shipped implementation calls the fallback endpoint: ```typescript // 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, }); ``` The API documentation describes this endpoint differently from the claimed local-creator flow: ```markdown ### POST /tokens/launch (Auth required) — Fallback Lightning mode: server signs the transaction. Platform wallet is the onchain creator (not recommended). Same body as `/tokens/launch-local` but without `signer_public_key`. ``` However, `SKILL.md` claims that the user wallet is the creator and shows a method that does not exist in `solpaw-skill.ts`: ```typescript 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); ``` The constrai ...[truncated 1876 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Implement the documented local flow: - Request an unsigned transaction from `/tokens/launch-local`. - Validate the returned transaction before signing. - Sign through an isolated wallet interface. - Submit it through `/tokens/submit`. 2. Implement and test `payAndLaunch` before documenting or exporting examples that invoke it. 3. Alternatively, remove the nonexistent example and clearly disclose that `launchToken()` uses server-signed fallback mode. 4. State precisely which wallet becomes the on-chain creator for every method. 5. Add automated integration tests that verify the endpoint used, signer identity, creator address, fee destination, and submitted transaction contents. 6. Require explicit user confirmation of creator identity, fee amount, destination wallet, and initial purchase amount before any irreversible payment or launch. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (28)

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
95% confidence
Finding
The README promotes autonomous token launches and fee-bearing on-chain actions without a prominent warning that use will spend SOL and trigger irreversible blockchain transactions. In an agent-skill context, this increases the risk that operators enable or invoke the skill without understanding that launches and related buys cannot be rolled back once submitted.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The quick start instructs users to register an agent and submit token-launch data to SolPaw and downstream services, but it does not clearly disclose what metadata is shared with third parties or that uploaded token metadata may become public and effectively permanent. This can lead to unintended disclosure of wallet identifiers, agent identifiers, and project metadata in an autonomous execution setting.

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 exposes sensitive capabilities via `command-tool: exec` and explicitly requires environment secrets and network access, but it declares no `permissions` or `allowed-tools` scope. This weakens sandboxing and review controls, making it easier for the skill to access secrets and perform networked actions beyond what a caller may expect.

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
88% confidence
Finding
This step transmits data to an external service during agent registration, including wallet-related information, without any trust boundary enforcement in the skill metadata. External transmission is expected for this skill, but it is still security-relevant because it sends operator-linked data to a third-party API and relies on that service for subsequent privileged actions.

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
88% confidence
Finding
This step transmits data to an external service during agent registration, including wallet-related information, without any trust boundary enforcement in the skill metadata. External transmission is expected for this skill, but it is still security-relevant because it sends operator-linked data to a third-party API and relies on that service for subsequent privileged actions.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
CSRF=$(curl -s -H "Authorization: Bearer $SOLPAW_API_KEY" \
  https://api.solpaw.fun/api/v1/agents/csrf | jq -r '.data.csrf_token')
```

### Step 3: Send 0.1 SOL launch fee
Confidence
86% confidence
Finding
Fetching a CSRF token from the third-party API transmits the bearer API key and establishes a privileged session with an external service. In isolation this is expected behavior, but in a skill with raw exec and env-secret access it increases exposure if logs, subprocesses, or downstream commands leak authorization material.

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
84% confidence
Finding
Uploading an image to an external API is an expected feature, but it still constitutes unscoped external data exfiltration from the agent environment. If local files are selected improperly or path inputs are influenced, the skill could transmit unintended local content to the third-party service.

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
92% confidence
Finding
The launch request sends token metadata, creator wallet, fee transaction reference, and CSRF token to an external API that constructs a transaction to be signed. In this context, the danger is not mere transmission but that the skill asks the agent to trust remote transaction-building logic, which could produce a transaction with unintended asset movement if not independently decoded and verified before signing.

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
92% confidence
Finding
The launch request sends token metadata, creator wallet, fee transaction reference, and CSRF token to an external API that constructs a transaction to be signed. In this context, the danger is not mere transmission but that the skill asks the agent to trust remote transaction-building logic, which could produce a transaction with unintended asset movement if not independently decoded and verified before signing.

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
94% confidence
Finding
Submitting a signed transaction to an external API is inherently sensitive because it finalizes blockchain actions that may spend funds irreversibly. Combined with the skill's use of a private signing key and a remotely constructed transaction flow, compromise or misbehavior by the service could result in unauthorized transfers, token launches, or loss of fees.

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
91% confidence
Finding
The SDK example normalizes a one-call flow that uses `SOLANA_PRIVATE_KEY` together with a remote API to pay fees, upload assets, build, sign, and submit transactions. This reduces visibility into intermediate checks and encourages high-trust handling of a hot private key in an agent context, increasing the chance of secret compromise or unauthorized signing.

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.

Vague Triggers

Medium
Confidence
88% confidence
Finding
This manifest describes what the skill does, but it does not define any explicit trigger phrases, activation boundaries, or exclusion conditions. For a manifest file, that can make invocation overly broad or ambiguous because there is no clear guidance on when the skill should activate versus when similar user requests should be ignored.

External Transmission

Medium
Category
Data Exfiltration
Content
"SOLPAW_API_KEY": "",
    "SOLPAW_CREATOR_WALLET": "",
    "SOLANA_PRIVATE_KEY": "",
    "SOLPAW_API_URL": "https://api.solpaw.fun/api/v1"
  },
  "dependencies": ["curl"],
  "install": {
Confidence
87% confidence
Finding
The manifest configures an external API endpoint while also requiring highly sensitive secrets including a Solana private key and API key. In the context of a token-launch skill tied to on-chain wallet authority, any downstream implementation that transmits or uses these values against the remote service can enable wallet compromise, unauthorized transactions, or exfiltration of credentials, and the manifest provides no constraints on key handling or trust boundaries.

Missing User Warnings

Medium
Confidence
87% confidence
Finding
The launchToken flow is explicitly documented to require sending 0.1 SOL before launch, and the example usage shows an actual transfer followed by token launch. While comments describe the fee, the executable path in this skill performs a state-changing token launch tied to a paid transaction without any runtime confirmation prompt or user-facing warning at the point of use.

Static analysis

No suspicious patterns detected.