Back to skill

Security audit

A2a Market

Security checks for vulnerabilities and agentic risk

Overview

This marketplace skill fits its stated purpose, but it gives agents payment, account, and skill-installation workflows with weak confirmation and verification safeguards.

Review carefully before installing. Use a dedicated low-balance wallet, do not enable auto-buy or auto-list behavior, require explicit approval for every paid or credits purchase, inspect any purchased skill package before installation, restrict the API endpoint to a trusted HTTPS host, and protect or remove the saved agent ID files. Avoid the quick publish/public GitHub commands until tracked files have been reviewed for secrets.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (7)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/a2a_client.py:185
Finding

Credits Purchases Bypass Spending, Reputation, and Confirmation Controls

Content
View full analysis
Dict[str, Any]: """ Purchase a skill using credits instead of USDC. Args: skill_id: ID of the skill to purchase Returns: Skill content and payment details """ headers = self._agent_headers() headers["Content-Type"] = "application/json" response = requests.post( f"{self.api_url}/v1/listings/{skill_id}/pay", headers=headers, data=json.dumps({"payment_method": "credits"}) ) response.raise_for_status() return response.json() ``` ### Technical Analysis The `purchase()` method immediately delegates credits purchases to `purchase_with_credits()`. This happens before the listing is retrieved and before the following controls used by the x402 path are applied: - Seller reputation validation - Per-transaction budget validation - Daily budget validation - Human confirmation above the automatic approval threshold The credits purchase method itself does not independently implement any of these controls. This contradicts the documented decision flow, which states that reputation, budget, payment method, and approval should be checked before purchase. ### Attack Path 1. An attacker or low-reputation seller publishes a misleading or malicious listing. 2. The Agent selects the credits payment method, either autonomously or due to user input. 3. `purchase()` returns directly into `purchase_with_credits()`. 4. The client submits the credits payment using the stored agent identifier. 5. No price, reputation, budget, or confirmation policy is evaluated. 6. Credits are spent and attacker-controlled Skill content may ...[truncated 372 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/a2a_client.py:69
Finding

Daily Spending Limit Resets Whenever the Client Process Restarts

Content
View full analysis
tuple[bool, str]: """Check if purchase is within budget rules.""" if price > self.rules.max_per_transaction: return False, f"Price ${price} exceeds max per transaction ${self.rules.max_per_transaction}" if self.daily_spent + price > self.rules.daily_budget: return False, f"Would exceed daily budget (spent: ${self.daily_spent}, limit: ${self.rules.daily_budget})" return True, "OK" ``` ```python # Update daily spent self.daily_spent += price ``` ### Technical Analysis The purported daily budget is maintained only in the `daily_spent` instance variable. Every new `A2AClient` instance initializes that value to zero. No date-keyed state is persisted, and existing marketplace purchases are not reconciled before authorizing another payment. Consequently, this is only a per-process or per-object limit, not a daily limit. A restart, crash, parallel process, or creation of another client instance bypasses it. ### Attack Path 1. The Agent makes purchases up to or near the configured daily limit. 2. The process restarts, crashes, or constructs another `A2AClient`. 3. `daily_spent` is reset to `0.0`. 4. The new client considers the full daily budget available. 5. Additional payments are signed and submitted. 6. Repeating this cycle permits spending beyond the configured daily maximum. ### Impact Assessment The affected wallet can authorize significantly more USDC spending than the owner intended. Parallel Agent processes can also independently spend up to the full nominal limit. The maximum loss is not bounded by `daily_budget`; it is instead limited by wallet funds, other on-chain controls, or ex ...[truncated 29 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/a2a_client.py:215
Finding

Server-Controlled Payment Requirements Are Signed Without Sufficient Validation

Content
View full analysis
str: """ Sign x402 payment. Note: Simplified implementation. Real x402 uses ERC-3009 TransferWithAuthorization. """ # In production, this would create an ERC-3009 signature # allowing the facilitator to transfer USDC on your behalf payment_data = { "from": self.wallet_address, "to": payment_info.get("accepts", [{}])[0].get("resource", ""), "amount": int(price * 1_000_000), # USDC has 6 decimals "nonce": int(time.time() * 1000), "deadline": int(time.time()) + 3600 # 1 hour validity } message = json.dumps(payment_data, sort_keys=True) signed = self.account.sign_message(encode_defunct(text=message)) return json.dumps({ "payment": payment_data, "signature": signed.signature.hex() }) ``` ### Technical Analysis The payment recipient is copied from the first `accepts` entry in an API-controlled response header. The client does not verify: - The x402 protocol version - The payment scheme - The Base network or chain identifier - The expected USDC token contract - The required amount against the listing price - The recipient against the listing's seller address - The payment resource against the requested listing - Whether the response structure is complete and unambiguous The implementation signs an ad hoc personal message and explicitly acknowledges that it is not the actual ERC-3009 authorization fl ...[truncated 1068 chars]
Remediation
View remediation

T03 · Remote Payload Retrieval and Execution

Error
Location
SKILL.md:283
Finding

Workflow Directs Installation of Untrusted Remote Skill Payloads Without Verification

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/a2a_client.py:31
Finding

Configurable API Endpoint Can Receive Agent Credentials and Wallet Signatures

Content
View full analysis
Dict[str, str]: """Get headers with agent ID for Credits API calls.""" if not self.agent_id: raise ValueError("Agent ID required. Call register() first.") return {"x-agent-id": self.agent_id} def _sign_request(self, method: str, path: str, body: str = "") -> Dict[str, str]: """Sign API request for authentication.""" timestamp = str(int(time.time() * 1000)) body_hash = hashlib.sha256(body.encode()).hexdigest() if body else "" message = f"{method}:{path}:{timestamp}:{body_hash}" signed = self.account.sign_message(encode_defunct(text=message)) return { "X-Wallet-Address": self.wallet_address, "X-Timestamp": timestamp, "X-Signature": signed.signature.hex() } ``` ```python response = requests.get( f"{self.api_url}/v1/credits/balance", headers=self._agent_headers() ) ``` ### Technical Analysis `A2A_MARKET_API_URL` can point to any origin or transport scheme. The client does not require HTTPS, enforce an expected-host allowlist, or prevent cross-origin redirects. The selected endpoint receives agent identifiers, wallet addresses, listing content, and signatures generated by the wallet account. The wallet private key itself is not transmitted. Nevertheless, a malicious endpoint can collect bearer-like agent identifiers and induce signatures over attacker-influenced API requests or payment data. ### Attack Path 1. An attacker modifies the process environment, launch co ...[truncated 920 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/a2a_client.py:329
Finding

Agent Authorization Identifier Is Stored Without Explicitly Restrictive Permissions

Content
View full analysis
"$AGENT_ID_FILE" echo "$referral_code" > "$REFERRAL_CODE_FILE" ``` The stored identifier is subsequently used as an authorization header: ```python def _agent_headers(self) -> Dict[str, str]: """Get headers with agent ID for Credits API calls.""" if not self.agent_id: raise ValueError("Agent ID required. Call register() first.") return {"x-agent-id": self.agent_id} ``` ### Technical Analysis The files are created using default file-creation behavior, so their permissions depend on the user's ambient `umask`. No private directory is created, no explicit `0600` file mode is enforced, and no secure credential store is used. Because the agent ID is directly supplied as the authorization header for balance, rewards, and credits purchases, it should be treated as sensitive authentication material rather than ordinary configuration. ### Attack Path 1. The user registers an Agent. 2. The scripts write `~/.a2a_agent_id` under a permissive `umask`. 3. Another local account, process, backup service, or compromised application reads the file. 4. The attacker sends the recovered value as the `x-agent-id` header. 5. Where the service relies solely on this identifier, the attacker queries account information, claims rewards, or spends credits. ### Impact Assessment The scope is the victim's marketplace credits identity. Potential effects include privacy loss, unauthorized reward operations, and unauthorized credits purchases. Wallet ...[truncated 60 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
publish.sh:45
Finding

Publishing Workflow Globally Installs an Unpinned npm Package

Content
View full analysis
/dev/null; then echo -e "${GREEN}✓ clawhub CLI is installed${NC}" clawhub --version 2>/dev/null || true else echo -e "${YELLOW}Installing clawhub CLI...${NC}" npm install -g clawhub echo -e "${GREEN}✓ clawhub CLI installed${NC}" fi ``` The same unpinned command is recommended in the documentation: ```bash npm install -g clawhub ``` ### Technical Analysis The publishing script automatically installs the latest available `clawhub` package globally if the command is absent. The package version and integrity are not pinned, no lockfile is used, and npm lifecycle scripts may execute during installation. Global installation expands the impact beyond the project environment and makes audit results dependent on whichever package version happens to be current when the command runs. ### Attack Path 1. The npm package, a dependency, or its publisher account is compromised, or a future release introduces unsafe behavior. 2. A publisher runs `publish.sh` on a system without the CLI. 3. The script executes `npm install -g clawhub`. 4. npm downloads the current package and executes applicable lifecycle scripts. 5. Malicious package code runs with the privileges of the invoking user and modifies the global Node.js environment. ### Impact Assessment A compromised dependency could execute arbitrary commands as the publishing user, access that user's files and authentication material, and alter globally installed tooling. Elevated impact is possible if the script is run with administrative privileges, although the script itself does not invoke `sudo`. ]]>
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (38)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description says this skill enables agents to use the A2A marketplace operationally: buy skills, sell/list skills, earn money, inspect credits/rewards/referrals, and support payment systems. The actual code chunk does none of that. It is a developer-facing release script used on a local machine to publish the skill package to ClawHub. Its primary actions are CLI setup, login checks, file validation, user confirmation, and clawhub publish. Those behaviors are materially different from the declared end-user/agent marketplace capabilities. While publishing could be tangentially related to distributing a skill, it is not a supporting implementation detail of the advertised runtime marketplace integration; it is a separate deployment utility with distinct authentication and infrastructure interactions.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The code clearly aligns with part of the description: it supports marketplace search/discovery, registration, credits balance, daily rewards, referral handling, earnings lookup, and pricing suggestions. However, several central declared capabilities are absent. There is no command to purchase a skill, no command to create or sell/list a skill, and no transaction execution flow. The script never interacts with x402, USDC payment rails, Base L2, wallets beyond passing an address string to registration/earnings lookup, or any blockchain/payment mechanism. The primary implemented purpose is a read-heavy marketplace utility CLI plus agent registration/rewards, not a full buy/sell marketplace integration. Because the description prominently claims buy/sell/payment capabilities that are not present, this is a material description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · references/api.md (reported line 186)May include surrounding context.

Delete Listing

text
DELETE /v1/listings/:id

Response: 204 No Content

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 · PUBLISH_GUIDE.md (reported line 136)May include surrounding context.

bash
# 使用 GitHub CLI
gh repo create a2a-market-skill --public --description "A2A Market skill for OpenClaw - Where agents earn"

# 或者手动在 github.com 创建

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The document provides one-click publish commands that install tooling, authenticate, change into the project directory, and publish the current contents to an external marketplace, but it does not warn users that local project files will be transmitted. Because this is marketed as a copy-paste workflow, users may disclose proprietary code, secrets, or unintended files with minimal friction, which is especially risky for an agent marketplace skill handling monetization and external integrations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The fallback instructions create a public GitHub repository and push the project without warning that this will expose the code and any committed sensitive material publicly. Public publication materially increases the chance of credential leakage, intellectual property exposure, and downstream compromise if users follow the commands blindly.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
65% confidence
Finding

uvx/uv tool run commands without ==version create a rug-pull risk.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
65% confidence
Finding

uvx/uv tool run commands without ==version create a rug-pull risk.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
96% confidence
Finding

The skill instructs network, shell, env, and local file interactions, including use of wallet credentials and persisted IDs, but declares no explicit tool scope or permission boundaries. That makes it easier for an agent runtime to invoke powerful capabilities without clear user-visible constraints, especially in a skill that can trigger purchases and account actions.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The invocation rules are extremely broad, triggering on common phrases like 'marketplace' or generic capability gaps. In a payment-capable skill, broad routing increases the chance the agent invokes this skill unexpectedly, exposing account metadata, querying external services, or beginning purchase workflows without sufficiently specific user intent.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
90% confidence
Finding

The presence of an auto-approve threshold for purchases enables autonomous spending based on price alone. In a marketplace for third-party skills, cost is not the only risk factor; even inexpensive purchases can authorize value transfer and introduce malicious or low-quality content into the agent environment.

Content

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

md
max_per_transaction: 10.00      # Max $10 per purchase
    daily_budget: 100.00            # Max $100/day
    min_seller_reputation: 60       # Only buy from rep >= 60
    auto_approve_below: 5.00        # Auto-buy under $5
    require_confirmation_above: 50.00
  
  # Selling rules

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 · SKILL.md (reported line 52)May include surrounding context.

bash
# Search by keyword
curl "https://api.a2amarket.live/v1/listings/search?q=data_analysis"

# With filters
curl "https://api.a2amarket.live/v1/listings/search?q=code_review&min_rep=70&max_price=15"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 52)May include surrounding context.

bash
# Search by keyword
curl "https://api.a2amarket.live/v1/listings/search?q=data_analysis"

# With filters
curl "https://api.a2amarket.live/v1/listings/search?q=code_review&min_rep=70&max_price=15"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 55)May include surrounding context.

bash
# Search by keyword
curl "https://api.a2amarket.live/v1/listings/search?q=data_analysis"

# With filters
curl "https://api.a2amarket.live/v1/listings/search?q=code_review&min_rep=70&max_price=15"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 96)May include surrounding context.

bash
# Search by keyword
curl "https://api.a2amarket.live/v1/listings/search?q=data_analysis"

# With filters
curl "https://api.a2amarket.live/v1/listings/search?q=code_review&min_rep=70&max_price=15"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 139)May include surrounding context.

bash
# Search by keyword
curl "https://api.a2amarket.live/v1/listings/search?q=data_analysis"

# With filters
curl "https://api.a2amarket.live/v1/listings/search?q=code_review&min_rep=70&max_price=15"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 166)May include surrounding context.

bash
# Search by keyword
curl "https://api.a2amarket.live/v1/listings/search?q=data_analysis"

# With filters
curl "https://api.a2amarket.live/v1/listings/search?q=code_review&min_rep=70&max_price=15"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 185)May include surrounding context.

bash
# Search by keyword
curl "https://api.a2amarket.live/v1/listings/search?q=data_analysis"

# With filters
curl "https://api.a2amarket.live/v1/listings/search?q=code_review&min_rep=70&max_price=15"

External Transmission

Medium
Category
Data Exfiltration
Confidence
85% confidence
Finding

Requesting paid skill content via a 402 flow is not inherently unsafe, but in this skill it is tied to autonomous purchasing behavior and untrusted third-party content acquisition. The combination of external payment negotiation and potential downstream installation/use of purchased skill content creates meaningful risk of unauthorized spending and supply-chain compromise.

Content

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

  1. Request skill content → receive HTTP 402:
bash
curl -i "https://api.a2amarket.live/v1/listings/skill_042/content"
# Returns: 402 Payment Required
# Header: X-Payment-Required: {"amount": "8000000", "recipient": "0xSeller..."}

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

This instruction sends a signed payment proof in a request header to obtain content, directly coupling agent-controlled network actions with wallet-authorized value transfer. In the context of broad auto-buy triggers and local private key configuration, this can lead to unauthorized or manipulated payments and retrieval of malicious third-party skills.

Content

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

  1. Sign USDC transfer and retry with payment proof:
bash
curl -X POST "https://api.a2amarket.live/v1/listings/skill_042/content" \
  -H "X-Payment: <signed_payment_proof>"

External Transmission

Medium
Category
Data Exfiltration
Confidence
78% confidence
Finding

Posting a skill listing to an external marketplace is expected capability, but it can expose proprietary prompts, methods, or agent capabilities to a third party if done automatically or with insufficient review. Because the skill also encourages monetization and semi-autonomous selling, accidental publication is a realistic risk.

Content

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

List a Skill for Sale

bash
curl -X POST "https://api.a2amarket.live/v1/listings" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Research Assistant",

External Transmission

Medium
Category
Data Exfiltration
Confidence
74% confidence
Finding

Agent registration transmits wallet address and agent name to a third-party service and creates a persistent marketplace identity. In this skill, registration is encouraged in workflows and may be triggered as part of earning/reward automation, so the privacy and account-linkage risks are material if done without explicit consent.

Content

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

Register to get an agent ID, referral code, and initial credits:

bash
curl -X POST "https://api.a2amarket.live/v1/agents/register" \
  -H "Content-Type: application/json" \
  -d '{"wallet_address": "0xYourWallet...", "name": "My Agent"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

Claiming daily rewards is an authenticated state-changing network action. In this skill, it is explicitly suggested for automatic execution, so users may unknowingly allow the agent to perform recurring account actions against a third-party service.

Content

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

-H "x-agent-id: agent_abc123"

Claim reward

curl -X POST "https://api.a2amarket.live/v1/rewards/daily/claim"
-H "x-agent-id: agent_abc123"

text

External Transmission

Medium
Category
Data Exfiltration
Confidence
91% confidence
Finding

Purchasing with credits is a state-changing payment action against an external service. Given the skill's broad triggers and auto-buy guidance, this can spend stored value without sufficiently specific consent and may also acquire untrusted third-party skill content.

Content

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

Pay for skills using credits instead of USDC:

bash
curl -X POST "https://api.a2amarket.live/v1/listings/skill_042/pay" \
  -H "Content-Type: application/json" \
  -H "x-agent-id: agent_abc123" \
  -d '{"payment_method": "credits"}'

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill omits a clear warning that daily reward claims and auto-buy behavior can issue authenticated network requests and potentially spend funds or credits without immediate user involvement. Missing disclosure is especially risky here because the skill combines account registration, rewards, credits, and payment actions with automation guidance.

Content

No source excerpt is available for this finding.