T09 · Insecure Skill Coding Practices
- Location
SKILL.md:43- Finding
Reusable Payment Token Exposed Through Chat, Agent Memory, and an Unauthenticated Partner API Path
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This purchasing skill is coherent with its stated purpose, but it handles reusable payment tokens, personal shipping data, and saved purchase memory in ways users should review carefully before installing.
Review this before installing because it can place purchases and handle sensitive payment-adjacent data. Prefer entering a fresh payment token for each purchase instead of saving it to agent memory, confirm the final total before any order, and avoid unpinned npx/npm install commands when possible.
SKILL.md:43Reusable Payment Token Exposed Through Chat, Agent Memory, and an Unauthenticated Partner API Path
README.md:7Unpinned Registry Packages Are Executed During Installation
README.md:105README Makes Privacy and Memory Isolation Guarantees That the Skill Cannot Enforce
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
The activation trigger is broad enough to fire on generic shopping language like 'buy', 'order', or 'purchase' when paired with a link, which increases the chance the skill is invoked in contexts where the user did not intend a transactional checkout flow. In a purchasing skill, accidental activation is more dangerous than in informational skills because it can lead the agent into collecting sensitive data or initiating an order workflow unnecessarily.
The hardcoded transmission endpoint sends purchase and identity data to an external service outside the host environment. In context this is expected functionality, but it still represents a real data-transfer risk because compromise, misuse, or over-collection by the external service could expose personal and payment-related metadata.
Stream the request body to curl over stdin using a quoted heredoc. The single-quoted delimiter stops the shell from expanding anything inside the body, so user-supplied values (product URL, names, address, token) pass through verbatim. Use this pattern exactly — no files are created, nothing is interpolated into the command:
curl -s -X POST https://api.rye.com/api/v1/partners/clawdbot/purchase \
-H "Content-Type: application/json" \
--data @- << 'END_RYE_ORDER_BODY_a7f3d2e9b5c1'
{
The hardcoded transmission endpoint sends purchase and identity data to an external service outside the host environment. In context this is expected functionality, but it still represents a real data-transfer risk because compromise, misuse, or over-collection by the external service could expose personal and payment-related metadata.
Stream the request body to curl over stdin using a quoted heredoc. The single-quoted delimiter stops the shell from expanding anything inside the body, so user-supplied values (product URL, names, address, token) pass through verbatim. Use this pattern exactly — no files are created, nothing is interpolated into the command:
curl -s -X POST https://api.rye.com/api/v1/partners/clawdbot/purchase \
-H "Content-Type: application/json" \
--data @- << 'END_RYE_ORDER_BODY_a7f3d2e9b5c1'
{
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
After submitting the order, use the id from the POST response to poll for the final result. Before using id in the URL, check it matches ^ci_[A-Za-z0-9]+$.
curl -s https://api.rye.com/api/v1/partners/clawdbot/purchase/CHECKOUT_INTENT_ID
Replace CHECKOUT_INTENT_ID with the validated ID (e.g. ci_abc123).
Persisting a user's spending limit in agent memory creates a cross-session trust surface where prior context can influence future purchasing behavior. While less sensitive than storing payment tokens or addresses, any persistent state in a transactional skill can be manipulated, misapplied to the wrong user/session, or retained longer than expected, especially if host memory isolation is weak.
## Spending Limit
Before the first purchase, ask the user what their maximum purchase price is. Store this in memory.
- If an order total (including any fees) exceeds the limit, warn the user and ask for confirmation
- User can say "no limit" to disable this check
No suspicious patterns detected.