T09 · Insecure Skill Coding Practices
- Location
example/app.py:13- Finding
Unrestricted Facilitator URL Can Expose Buyer Payment Proofs
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is coherent for setting up x402 payment services, but it handles cryptocurrency and API secrets through under-scoped dependency and command-line workflows that deserve manual review before install.
Review the referenced third-party skills before letting them generate wallets or receive private keys, prefer pinned or audited tools, and avoid entering private keys or API secrets as command-line arguments. Use trusted HTTPS facilitator URLs only, restrict CDP key permissions and limits, and treat any custom facilitator as a party that can see payment verification metadata.
example/app.py:13Unrestricted Facilitator URL Can Expose Buyer Payment Proofs
SKILL.md:54Unpinned Third-Party Skills Are Entrusted with Cryptocurrency Secrets
Referenced artifact was not completely inspected
- **[SKILL.md](./SKILL.md)** — This file; overview and quick-start guide
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cp .env.example .env
Package name closely resembles a popular package, suggesting possible typosquatting. Attackers publish malicious packages with similar names to trick developers into installing them.
Without declared permissions the skill's intent is opaque and cannot be validated.
The setup instructions tell users to pass wallet private keys and API secrets directly as command-line arguments to keepass-cli. Secrets supplied on the command line can be captured in shell history, terminal logging, audit systems, and process listings, which can expose private keys and API credentials to other local users or later forensic access.
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
### Payment Verification
**Do not skip verification.** Always:
1. Require valid `PAYMENT-SIGNATURE` header
2. Verify the signature with the facilitator
3. Check that payment amount matches your declared price
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
facilitator = HTTPFacilitatorClient(
FacilitatorConfig(
url="https://api.cdp.coinbase.com/platform/v2/x402",
headers={"Authorization": f"Bearer {os.getenv('CDP_API_KEY')}"}
)
)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
facilitator = HTTPFacilitatorClient(
FacilitatorConfig(
url="https://api.cdp.coinbase.com/platform/v2/x402",
headers={"Authorization": f"Bearer {os.getenv('CDP_API_KEY')}"}
)
)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
facilitator = HTTPFacilitatorClient(
FacilitatorConfig(
url="https://api.cdp.coinbase.com/platform/v2/x402",
headers={"Authorization": f"Bearer {os.getenv('CDP_API_KEY')}"}
)
)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
facilitator = HTTPFacilitatorClient(
FacilitatorConfig(
url="https://api.cdp.coinbase.com/platform/v2/x402",
headers={"Authorization": f"Bearer {os.getenv('CDP_API_KEY')}"}
)
)
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
facilitator = HTTPFacilitatorClient(
FacilitatorConfig(
url="https://api.cdp.coinbase.com/platform/v2/x402",
headers={"Authorization": f"Bearer {os.getenv('CDP_API_KEY')}"}
)
)
No suspicious patterns detected.