Back to skill

Security audit

Clawdgigs

Security checks for vulnerabilities and agentic risk

Overview

This marketplace skill has a coherent purpose, but it asks for payment signing and automation powers with several under-scoped high-impact behaviors users should review carefully.

Install only if you are comfortable reviewing the scripts and using a dedicated low-balance payment wallet. Do not copy a primary Solana wallet keypair into this skill, avoid custom CLAWDGIGS_API values unless you trust the endpoint, do not expose the webhook listener publicly, and require human review before signing payments or acting on buyer-provided order text.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
Findings (8)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/hire.sh:146
Finding

Blind Signing of Server-Supplied Solana Transactions

Content
View full analysis
/dev/null) NONCE=$(echo "$INITIATE_RESPONSE" | jq -r '.nonce // ""') UNSIGNED_TX=$(echo "$INITIATE_RESPONSE" | jq -r '.unsignedTransaction // ""') PAYMENT_REQS=$(echo "$INITIATE_RESPONSE" | jq -r '.paymentRequirements // {}') SIGNED_TX=$(node -e " const fs = require('fs'); const bs58 = require('bs58').default || require('bs58'); const { Keypair, Transaction } = require('@solana/web3.js'); const keypairData = JSON.parse(fs.readFileSync('${KEYPAIR_FILE}')); const keypair = Keypair.fromSecretKey(Uint8Array.from(keypairData)); const txBuffer = Buffer.from('${UNSIGNED_TX}', 'base64'); const transaction = Transaction.from(txBuffer); transaction.partialSign(keypair); const signedBuffer = transaction.serialize({ requireAllSignatures: false }); console.log(signedBuffer.toString('base64')); " 2>&1) ``` ### Technical Analysis The script signs a serialized Solana transaction supplied entirely by the remote marketplace API. Before signing, it does not decode or validate: - Program IDs and invoked instructions - Source and destination token accounts - The expected USDC mint - The actual transferred amount - Account authority changes or approvals - Additional unexpected instructions - Fee payer and transaction fees - Whether the transaction corresponds to the displayed gig The order summary does no ...[truncated 1383 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/orders.sh:315
Finding

Unauthenticated Order Mutations and Client-Controlled Admin Role

Content
View full analysis
/dev/null) ``` Delivery is also submitted without an authorization header: ```bash RESPONSE=$(curl -sfL "$CLAWDGIGS_API/orders/$ORDER_ID/deliver" \ -X POST \ -H "Content-Type: application/json" \ -d "$PAYLOAD" 2>/dev/null) ``` The completion operation explicitly claims an administrative role from client-controlled JSON: ```bash PAYLOAD=$(jq -n \ --arg action "accept" \ --arg role "admin" \ --arg agentId "$AGENT_ID" \ '{ action: $action, role: $role, agentId: $agentId }') RESPONSE=$(curl -sfL "$CLAWDGIGS_API/orders/$ORDER_ID/transition" \ -X POST \ -H "Content-Type: application/json" \ -d "$PAYLOAD" 2>/dev/null) ``` ### Technical Analysis The script reads a local token file but does not use that token for these order mutation requests. Instead, it relies on caller-provided `agentId` and `role` properties. Identity, ownership, and administrative status must not be established through request-body fields. The `complete` command is particularly concerning because it claims `role: "admin"` even though the script states that the operation is for administrators only. Whether exploitation succeeds depends on the backend's server-side authorization. The client implementation nevertheless demonstrates an ...[truncated 1083 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
.
Finding

Bearer Credentials Can Be Redirected to an Arbitrary API Origin

Content
View full analysis
/dev/null || echo "") RESPONSE=$(curl -sf "$CLAWDGIGS_API/db/agents?where=id:eq:$AGENT_ID" \ -H "Authorization: Bearer ${PRESSBASE_SERVICE_KEY:-$AGENT_TOKEN}" 2>/dev/null) ``` Registration may send the broader service credential to the selected endpoint: ```bash RESPONSE=$(curl -sf "$CLAWDGIGS_API/db/agents" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${PRESSBASE_SERVICE_KEY:-public}" \ -d "$PAYLOAD" 2>/dev/null) ``` ### Technical Analysis `CLAWDGIGS_API` accepts an unrestricted URL, while the scripts automatically attach sensitive bearer credentials. There is no origin allowlist, scheme validation, certificate pinning, or explicit separation between credentials and endpoint selection. This behavior is unnecessary for normal marketplace functionality. Supporting custom API instances does not require silently sending an existing production token or a potentially broad `PRESSBASE_SERVICE_KEY` to any configured host. The default authenticated API is also hosted under `backend.benbond.dev`, while the marketplace is advertised under `clawdgigs.com`. That distinction should be clearly documented and cryptographically controlled. ### Attack Path 1. An attacker influences the process environment, wrapper script, shell profile, automation configuration, or invocation context. 2. The attacker sets `CLAWDGIGS_AP ...[truncated 767 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/watch.sh:313
Finding

Unauthenticated Public Webhook Listener Can Trigger a Local Executable

Content
View full analysis
/dev/null; then echo "❌ netcat (nc) not found - required for webhook listener" echo " Install with: brew install netcat (macOS) or apt install netcat (Linux)" exit 1 fi while true; do REQUEST=$(echo -e "HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK" | nc -l "$WEBHOOK_PORT" 2>/dev/null | head -50) if echo "$REQUEST" | grep -q "POST /webhook"; then BODY=$(echo "$REQUEST" | sed -n '/^$/,$p' | tail -n +2) echo "📬 Webhook received: $(date)" echo "$BODY" | jq . 2>/dev/null || echo "$BODY" echo "" if [[ -n "$WEBHOOK_HANDLER" && -x "$WEBHOOK_HANDLER" ]]; then echo "$BODY" | "$WEBHOOK_HANDLER" fi fi done fi ``` ### Technical Analysis The netcat listener has no authentication, webhook signature validation, shared secret, replay protection, TLS, source restriction, request-size policy, or explicit loopback binding. Any peer that can reach the listening port can submit data that is passed to a user-selected executable through standard input. The script cannot guarantee what that handler does with the data. A handler that evaluates commands, interprets templates, accesses files, or invokes an AI agent could convert the unauthenticated trigger into broader compromise. The response is also generated before the request is validated, and the listener is not a robust HTTP implementation. ### Attack Path 1. The user starts `watch.sh ...[truncated 755 chars]
Remediation
View remediation

T01 · Skill Instruction Hijacking

Error
Location
SKILL.md:166
Finding

Buyer-Controlled Order Requirements Can Hijack Autonomous Agent Instructions

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:264
Finding

Unpinned Global Installation of Signing Dependencies

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/profile.sh:155
Finding

Profile Update JSON Injection Through Manual String Construction

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/gigs.sh:211
Finding

Gig Update JSON Injection Through Manual String Construction

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (31)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The documented behavior includes fetching order data, tracking state locally, and—per the finding—potentially running webhook/listener logic and executing handler scripts, none of which is captured by the declared purpose. Undisclosed inbound/outbound network and local execution behaviors materially raise risk because they expand the attack surface and could enable remote-triggered actions.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documented behavior includes fetching order data, tracking state locally, and—per the finding—potentially running webhook/listener logic and executing handler scripts, none of which is captured by the declared purpose. Undisclosed inbound/outbound network and local execution behaviors materially raise risk because they expand the attack surface and could enable remote-triggered actions.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The documented behavior includes fetching order data, tracking state locally, and—per the finding—potentially running webhook/listener logic and executing handler scripts, none of which is captured by the declared purpose. Undisclosed inbound/outbound network and local execution behaviors materially raise risk because they expand the attack surface and could enable remote-triggered actions.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The documented behavior includes fetching order data, tracking state locally, and—per the finding—potentially running webhook/listener logic and executing handler scripts, none of which is captured by the declared purpose. Undisclosed inbound/outbound network and local execution behaviors materially raise risk because they expand the attack surface and could enable remote-triggered actions.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The webhook mode opens a local network listener and pipes attacker-controlled request bodies into an arbitrary executable specified by --handler. That creates a clear trust-boundary violation and can turn any reachable HTTP request into execution of local logic with untrusted input, which exceeds the core need of simply polling for orders.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

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.

Content

Scanner excerpt · README.md (reported line 8)May include surrounding context.

md
## What is ClawdGigs?

[ClawdGigs](https://clawdgigs.com) is a marketplace where AI agents can:
- **Sell services** — Create gigs, receive orders, get paid in USDC
- **Buy services** — Hire other agents programmatically
- **Instant payments** — No invoices, no delays, just x402 micropayments

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The README instructs users to copy their Solana private key material from the default wallet location into a skill-specific path, increasing the number of copies of a highly sensitive credential and normalizing unsafe secret handling. If that skill directory is less protected, committed, shared, or read by other tools, an attacker could steal the keypair and drain funds or impersonate the agent in payment flows.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
82% confidence
Finding

The skill clearly instructs use of multiple shell scripts, but it declares no explicit tool scope or allowed-tools boundary. That omission increases the chance an agent will execute shell commands with broader privileges than intended, especially because the skill also touches local config, tokens, and payment-related files.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

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.

Content

Scanner excerpt · SKILL.md (reported line 25)May include surrounding context.

./scripts/profile.sh set --name "My Agent" --bio "I specialize in..." --skills "coding,writing,analysis"

text

### 3. Create a Gig
```bash
./scripts/gigs.sh create --title "Code Review" --price 0.10 --category "development"

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The webhook instructions send order details, buyer wallet information, and requirements text to a public HTTPS endpoint without a clear warning about sensitivity, authenticity checks, or retention. This creates privacy and integrity risk: operators may expose customer data to third parties or trust spoofed webhook traffic if the endpoint is not properly validated.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill instructs users to copy or generate a Solana keypair for payment signing but does not clearly warn that this file contains private key material whose exposure enables direct asset theft. In the context of an agent skill, encouraging placement of signing keys in a predictable path without strong safeguards substantially increases the chance of compromise.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The export path outputs full transaction data, including payer_wallet and tx_signature, to stdout and the script provides no warning that potentially sensitive payment-history data will be exposed or suitable for redirection into files. There is no confirmation prompt or user-facing disclosure near the export behavior beyond the generic help text.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/gigs.sh (reported line 172)May include surrounding context.

sh
status: "active"
        }')

    RESPONSE=$(curl -sf "$CLAWDGIGS_API/db/gigs" \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer ${PRESSBASE_SERVICE_KEY:-$AGENT_TOKEN}" \
        -d "$PAYLOAD" 2>/dev/null) || {

External Transmission

Medium
Category
Data Exfiltration
Confidence
81% confidence
Finding

The update path builds JSON manually by concatenating unescaped user-controlled fields into PAYLOAD, then sends it to a remote API. Special characters such as quotes in --title or --desc can break JSON structure and may allow unintended field injection or malformed requests, causing integrity issues in remote updates.

Content

Scanner excerpt · scripts/gigs.sh (reported line 229)May include surrounding context.

sh
echo "🤖 Updating gig $GIG_ID..."
    
    RESPONSE=$(curl -sf "$CLAWDGIGS_API/db/gigs/$GIG_ID" \
        -X PUT \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer ${PRESSBASE_SERVICE_KEY:-$AGENT_TOKEN}" \

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/gigs.sh (reported line 258)May include surrounding context.

sh
echo "🤖 Pausing gig $GIG_ID..."
    
    RESPONSE=$(curl -sf "$CLAWDGIGS_API/db/gigs/$GIG_ID" \
        -X PUT \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer ${PRESSBASE_SERVICE_KEY:-$AGENT_TOKEN}" \

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The delete action sends an HTTP DELETE request that irreversibly removes a gig, but the script only prints a status message and proceeds immediately. There is no confirmation prompt, explicit warning about permanence, or other user-disclosure safeguard before performing the destructive operation.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/hire.sh (reported line 146)May include surrounding context.

sh
echo "🔐 Initiating payment..."

# Step 1: Call payment initiate (expect 402 response)
INITIATE_RESPONSE=$(curl -sL "$CLAWDGIGS_API/payment/initiate" \
    -H "Content-Type: application/json" \
    -d "{
        \"gigId\": \"$GIG_ID\",

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/hire.sh (reported line 216)May include surrounding context.

sh
echo "🚀 Submitting payment..."

# Step 3: Verify/settle the payment
VERIFY_RESPONSE=$(curl -sL "$CLAWDGIGS_API/payment/verify" \
    -H "Content-Type: application/json" \
    -d "{
        \"gigId\": \"$GIG_ID\",

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script sends free-form order requirements and an optional email address to a remote API, but it does not clearly warn the user that potentially sensitive content will be transmitted off-host and stored/processed by a third party. In this skill’s context, users may include private code, credentials, proprietary URLs, or personal contact details in the description/inputs fields, so the lack of explicit privacy notice and minimization creates a real confidentiality risk.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The header documents this as an agent-side management script, yet the command list includes complete, and the implementation later submits an admin role. This mismatch normalizes an unauthorized capability and may mislead users into attempting privileged actions that should never be available in this tool.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/orders.sh (reported line 327)May include surrounding context.

sh
agentId: $agentId
        }')

    RESPONSE=$(curl -sfL "$CLAWDGIGS_API/orders/$ORDER_ID/transition" \
        -X POST \
        -H "Content-Type: application/json" \
        -d "$PAYLOAD" 2>/dev/null) || {

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/orders.sh (reported line 455)May include surrounding context.

sh
+ (if $notes != "" then {notes: $notes} else {} end)')
    fi

    RESPONSE=$(curl -sfL "$CLAWDGIGS_API/orders/$ORDER_ID/deliver" \
        -X POST \
        -H "Content-Type: application/json" \
        -d "$PAYLOAD" 2>/dev/null) || {

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The deliver action sends content, file URLs, and optional notes to the ClawdGigs API via an HTTP POST. Although the script prints that it is delivering the order, it does not explicitly warn the user that arbitrary supplied text, URLs, or notes will be transmitted off-host to an external service.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The agent-side script exposes a complete command that forges an admin role in the request payload and attempts to drive an admin/client-only order transition. Even if the backend properly rejects it, embedding privilege-escalation behavior in a normal agent tool encourages unauthorized actions and becomes critical if the server trusts client-supplied roles.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

This POST sends a transition request with role: "admin" from an agent-side script to complete an order. Because it attempts a privileged state change using a client-asserted role, it represents an authorization-bypass pattern and would be highly dangerous if the backend accepts the payload at face value.

Content

Scanner excerpt · scripts/orders.sh (reported line 501)May include surrounding context.

sh
agentId: $agentId
        }')

    RESPONSE=$(curl -sfL "$CLAWDGIGS_API/orders/$ORDER_ID/transition" \
        -X POST \
        -H "Content-Type: application/json" \
        -d "$PAYLOAD" 2>/dev/null) || {

Static analysis

No suspicious patterns detected.