Back to skill

Security audit

Solpaw Interaction Skill

Security checks for vulnerabilities and agentic risk

Overview

This skill is for a real Solana token-launch service, but it asks for wallet-level secrets and broad command execution in a way that needs careful review before installation.

Install only after reviewing the wallet and endpoint risks. Use a dedicated low-balance wallet, avoid exposing a main wallet private key as an environment variable, keep the API endpoint pinned to the intended SolPaw host, and require explicit human confirmation plus transaction review before paying fees, signing, submitting, or making any initial buy.

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

T09 · Insecure Skill Coding Practices

Warning
Location
solpaw-skill.ts:83
Finding
API Credential Disclosure Through an Unrestricted Configurable Endpoint<![CDATA[ ## Vulnerability Details **File Location**: `solpaw-skill.ts:83-117` **Vulnerability Type**: Credential disclosure through an unvalidated 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(/\/$/, ""), }; } /** * 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), }); ``` ### Technical Analysis The constructor accepts any nonempty `apiEndpoint` and performs no scheme, hostname, port, or origin validation. The common request function subsequently sends the configured API key in an `Authorization: Bearer` header to that endpoint on every request. As a result, configuration manipulation can redirect credentials and request data to an unrelated server. The implementation also does not require HTTPS, so a configuration using plain HTTP could expose credentials to network interception. Depending on the invoked method, transmitted information can include: - The SolPaw API key - Creator wallet addresses - Launch-fee transaction signatures - Token names, symbols, descriptions, and social links - CSRF tokens - Account-spec ...[truncated 1796 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Parse the endpoint with the standard `URL` class and reject malformed values. 2. Require `https:` for all authenticated remote endpoints. 3. For the hosted version, allowlist the expected origin: ```typescript const endpoint = new URL(config.apiEndpoint); const allowedOrigin = "https://api.solpaw.fun"; if (endpoint.protocol !== "https:" || endpoint.origin !== allowedOrigin) { throw new Error("SolPaw: untrusted API endpoint"); } ``` 4. If self-hosting support is required, make custom origins an explicit advanced option and require separate user approval before sending credentials. 5. Use separate credentials for each origin; never reuse the hosted SolPaw key with a self-hosted endpoint. 6. Ensure credentials are not forwarded across cross-origin redirects. Prefer redirect rejection for authenticated requests. 7. Add tests confirming that HTTP, alternate domains, deceptive subdomains, embedded credentials, and unexpected ports are rejected. 8. Document exactly which fields leave the host and which service receives them. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
SKILL.md:1
Finding
Raw Command Execution Is Combined With Access to a Wallet Private Key<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:1-10` **Vulnerability Type**: Excessive execution and secret-access privileges **Risk Level**: High ### Vulnerable Code ```yaml --- name: solpaw description: Launch Solana tokens on Pump.fun via the SolPaw platform. 0.1 SOL one-time fee. Your wallet is the onchain creator. homepage: https://solpaw.fun 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": []}} --- ``` The private-key requirement is also described explicitly at `SKILL.md:37-40`: ```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) ``` ### Technical Analysis The Skill declares `exec` as its command tool and passes arguments in raw mode. At the same time, it requests that `SOLANA_PRIVATE_KEY` be made available in the Skill environment. This places a high-value wallet credential in a context capable of executing general shell commands. The packaged TypeScript implementation does not read or require `SOLANA_PRIVATE_KEY`. Its implemented `launchToken()` method accepts an already-created launch-fee transaction signature and calls the server-side `/tokens/launch` endpoint. Therefore, private-key exposure to the general Skill environment exceeds the minimum privileges required by the implementation that was actually shipped. The documentation describes local transaction signing, but the shown `payAndLaunch()` method does not exist in `solpaw-skill.ts`. Consequently, the requested private-key privilege is not paired with an implemented, constrained signing interface. Raw command execution is materiall ...[truncated 2227 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove `command-tool: exec` and `command-arg-mode: raw`. 2. Expose narrowly typed operations such as: - `getPlatformInfo` - `buildLaunchTransaction` - `approveLaunchPayment` - `signValidatedTransaction` - `submitLaunchTransaction` 3. Do not expose `SOLANA_PRIVATE_KEY` as an environment variable available to the agent or shell. 4. Integrate with a dedicated wallet, hardware wallet, operating-system keystore, or isolated signing service that never returns private-key material. 5. Before signing, decode and validate every transaction instruction. Confirm: - Network and recent blockhash - Fee payer - Recipient addresses - Transfer amounts - Pump.fun program IDs - Mint and creator authorities - Initial purchase amount - Priority fee and slippage 6. Require explicit user approval immediately before paying the 0.1 SOL platform fee and before signing the final launch transaction. 7. Display a human-readable transaction preview and reject any extra or unknown instructions. 8. Use a dedicated low-balance wallet with only the funds and authorities required for a single launch. 9. Implement the documented local-mode flow using `/tokens/launch-local`; do not rely on the server-signed `/tokens/launch` fallback when claiming the user's wallet will be the on-chain creator. 10. Remove or correct the nonexistent `payAndLaunch()` documentation so users are not encouraged to build ad hoc private-key handling around an API that is not present in the package. ]]>
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 (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
92% confidence
Finding
The README promotes autonomous token launches and optional initial buys, both of which are irreversible on-chain financial actions, but it does not prominently warn users about fund loss, inability to reverse transactions, or the legal/financial risks of automated token issuance. In an agent skill context, this omission is dangerous because operators may enable the skill without understanding that an autonomous agent can spend SOL and create public blockchain assets with lasting consequences.

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
96% confidence
Finding
The skill exposes powerful capabilities via `command-tool: exec`, raw argument mode, environment-variable access, and outbound network use, but does not declare any explicit tool scope such as `permissions` or `allowed-tools`. In practice this weakens least-privilege controls and makes it easier for the skill to access secrets and perform sensitive external actions without clear policy boundaries.

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
```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 `launch-local` request sends token metadata, wallet identifiers, a CSRF token, and a launch-fee transaction reference to an external service that returns a transaction for local signing. In this context the remote service is participating in construction of a blockchain transaction that will later be signed with the user's private key, so a compromised or malicious service could craft unexpected transaction contents and induce fund loss or unauthorized on-chain actions if the client does not independently verify the transaction 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
84% confidence
Finding
The `launch-local` request sends token metadata, wallet identifiers, a CSRF token, and a launch-fee transaction reference to an external service that returns a transaction for local signing. In this context the remote service is participating in construction of a blockchain transaction that will later be signed with the user's private key, so a compromised or malicious service could craft unexpected transaction contents and induce fund loss or unauthorized on-chain actions if the client does not independently verify the transaction 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
86% confidence
Finding
Submitting a locally signed transaction to the external API is inherently sensitive because the skill is orchestrating irreversible blockchain actions involving the user's wallet and funds. In combination with required access to `SOLANA_PRIVATE_KEY`, this creates a high-risk path where insufficient validation, weak user confirmation, or compromised upstream transaction generation could result in unauthorized token launches or financial loss.

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 TypeScript example directly loads `SOLANA_PRIVATE_KEY` from environment variables and constructs a keypair in process memory for one-call fee payment, upload, signing, and submission. This concentrates secret handling and high-value financial actions in a single skill flow, increasing the blast radius if the skill, runtime, logs, or dependencies are compromised.

Vague Triggers

Medium
Confidence
81% confidence
Finding
This is a manifest file, so vague-trigger checks apply. The description says the skill is for "launching tokens on Solana via Pump.fun" but does not define specific trigger phrases, activation scope, or exclusion conditions, making invocation criteria ambiguous rather than narrowly bounded.

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
93% confidence
Finding
The documentation exposes a fallback mode where the server signs the launch transaction, meaning users must trust the platform with transaction construction and signing behavior. Even though it notes this mode is 'not recommended,' it does not clearly explain the custody, impersonation, creator attribution, and transaction-integrity risks, so integrators may use a materially less safe path without informed consent.

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
93% confidence
Finding
The manifest defines an external API endpoint and requires highly sensitive secrets including a Solana private key, indicating the skill is designed to transmit privileged data to a remote service context. In a wallet-linked token-launching skill, this is especially dangerous because compromise, misuse, or unclear handling of the private key could lead to unauthorized transactions, wallet drain, or irreversible onchain actions.

External Transmission

Medium
Category
Data Exfiltration
Content
- name: api_endpoint
    type: string
    required: true
    default: https://api.solpaw.fun/api/v1
    description: SolPaw API endpoint
  - name: api_key
    type: string
Confidence
79% confidence
Finding
The skill is configured to send data to an external API endpoint and requires a secret API key, which creates a real data-exfiltration and trust boundary risk. In this case the transmission appears necessary for the skill's advertised functionality, but it still exposes credentials and possibly transaction metadata to a third-party service outside the agent runtime.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The manifest exposes a command that launches tokens on Pump.fun but provides no warning about irreversible blockchain actions, fees, or financial risk. In an agent context, users may trigger token creation without understanding that funds can be spent and on-chain actions cannot be undone, increasing the chance of harmful or unintended transactions.

External Transmission

Medium
Category
Data Exfiltration
Content
*   skills:
 *     - name: solpaw-launcher
 *       config:
 *         api_endpoint: https://api.solpaw.fun/api/v1
 *         api_key: ${SOLPAW_API_KEY}
 *         default_creator_wallet: ${CREATOR_WALLET}
 *
Confidence
85% confidence
Finding
The skill is explicitly designed to send authenticated requests to an external API using a bearer API key and to drive on-chain payments to a platform-controlled wallet. In the context of an agent skill that can trigger financial actions, this is security-relevant because a compromised, malicious, or spoofed endpoint could induce fund transfers, misuse the API key, or manipulate launch parameters/results.

Static analysis

No suspicious patterns detected.