T09 · Insecure Skill Coding Practices
- Location
SKILL.md:7- Finding
Raw Shell Execution Exceeds the Skill's Required Privileges
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
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.
SKILL.md:7Raw Shell Execution Exceeds the Skill's Required Privileges
solpaw-skill.ts:84Bearer API Key Is Sent to an Unvalidated Configurable Endpoint
SKILL.md:10Skill Unnecessarily Requests Full Solana Wallet Private-Key Access
solpaw-skill.ts:232Documented Local-Creator Launch Flow Does Not Match the Implemented Fallback Endpoint
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
git clone https://github.com/LvcidPsyche/solpaw.git
cd solpaw
cp .env.example .env
# Edit .env with your values
docker compose up -d
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
git clone https://github.com/LvcidPsyche/solpaw.git cd solpaw cp .env.example .env
docker compose up -d
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.
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.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -X POST https://api.solpaw.fun/api/v1/agents/register \
-H "Content-Type: application/json" \
-d '{
"agent_name": "MyCoolAgent",
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.
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.
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 .
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.
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 .
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.
CSRF=$(curl -s -H "Authorization: Bearer $SOLPAW_API_KEY" \
https://api.solpaw.fun/api/v1/agents/csrf | jq -r '.data.csrf_token')
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.
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')
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.
# 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 '{
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.
# 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 '{
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.
# 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"}'
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.
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,
});
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# SolPaw API Reference
Base URL: `https://api.solpaw.fun/api/v1`
## Authentication
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# SolPaw API Reference
Base URL: `https://api.solpaw.fun/api/v1`
## Authentication
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# SolPaw API Reference
Base URL: `https://api.solpaw.fun/api/v1`
## Authentication
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# SolPaw API Reference
Base URL: `https://api.solpaw.fun/api/v1`
## Authentication
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# SolPaw API Reference
Base URL: `https://api.solpaw.fun/api/v1`
## Authentication
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# SolPaw API Reference
Base URL: `https://api.solpaw.fun/api/v1`
## Authentication
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# SolPaw API Reference
Base URL: `https://api.solpaw.fun/api/v1`
## Authentication
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# SolPaw API Reference
Base URL: `https://api.solpaw.fun/api/v1`
## Authentication
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.
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.
"SOLPAW_API_KEY": "",
"SOLPAW_CREATOR_WALLET": "",
"SOLANA_PRIVATE_KEY": "",
"SOLPAW_API_URL": "https://api.solpaw.fun/api/v1"
},
"dependencies": ["curl"],
"install": {
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.
No suspicious patterns detected.