T09 · Insecure Skill Coding Practices
- Location
SKILL.md:25- Finding
Trade-Authorizing Bearer Credential Can Be Redirected to an Arbitrary Server
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This crypto trading skill is coherent, but it needs review because it uses a wallet-authorizing API key with broad activation, automatic wallet discovery, and a configurable API destination.
Install only if you intend to let this skill use an XXYY API key that can spend wallet funds. Keep XXYY_API_BASE_URL unset unless you fully trust and control the destination, use XXYY IP allowlisting, rotate the key if it may have been sent to the wrong host, and manually verify wallet, chain, amount, fees, and launch parameters before any transaction.
SKILL.md:25Trade-Authorizing Bearer Credential Can Be Redirected to an Arbitrary Server
SKILL.md:1027Automatic Cross-Chain Wallet Enumeration Exceeds Activation-Time Least Privilege
SKILL.md:846Token Launch Operations Lack a Dedicated Explicit Confirmation Gate
The skill advertises very broad trigger phrases such as "feed," "onboarding," and "get started," which can cause the trading skill to activate in conversations that are not actually requesting crypto operations. In this context, unintended activation is risky because the skill has access to a custodial trading API key and can query wallets, balances, IP information, and potentially prepare trade flows.
Remembering and reusing a default wallet for subsequent trades "without asking again" increases the chance of acting on the wrong wallet through stale session state or ambiguous user intent. In a custodial trading context, that can lead to unintended trades from a different account balance than the user expected.
2. **Display format** -- Show wallet name, address, native balance. Mark pinned wallets with ⭐.
3. **Token holdings** -- If user asks about specific token holdings, pass `tokenAddress` to show per-wallet balance.
4. **No wallets** -- If response returns empty list, guide user to create at: https://www.xxyy.io/wallet/manager?chainId={chain}
5. **Default wallet memory** -- After user selects a wallet, remember it as the default for that chain in the current session. Use this default for subsequent trades on the same chain without asking again.
6. **Single wallet query** -- When the user provides a specific wallet address and asks for its balance, use Wallet Info API instead of List Wallets. Also use Wallet Info to show balance before trade confirmation.
7. **Error handling** -- Same as other data query APIs (see Error Codes table).
Automatically executing onboarding on skill activation is a form of autonomous action that triggers network access and account discovery before the user has explicitly asked for setup or wallet inspection. Given this skill's access to a unified read/write trading API key, even seemingly read-only autonomous behavior meaningfully increases privacy and misuse risk.
## Onboarding Flow
**Trigger**: Automatically execute once when the skill is first activated in a session. Run only once per session.
### Detection Logic
The onboarding flow is configured to run automatically on first activation and, in the API-key-present case, silently pings the service and fetches wallets across four chains. Because activation itself is broadly scoped elsewhere in the skill, this can cause unsolicited external requests and exposure of wallet metadata in response to unrelated user prompts.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
| 8062 | Rate limited | All APIs — data query: retry after 2s; trade: retry after 1s (except swap, see Execution Rules #5) |
| 8063 | IP not in whitelist — use get_ip to check current IP, update whitelist at https://www.xxyy.io/apikey | All APIs |
# Buy
The trigger list is extremely broad and includes generic phrases like "feed," "monitor chain," "get started," and wallet-related commands. In a skill that can execute real trades with a custodial API key, broad activation increases the chance the skill is invoked for ambiguous requests and steers the session into high-risk financial actions or wallet/API-key workflows the user did not intend.
Remembering and reusing a default wallet "without asking again" reduces friction but weakens transactional intent verification in a financial skill. If the skill is triggered ambiguously or conversation context is manipulated, subsequent trades may be prepared against a previously selected wallet the user did not mean to use in the current request.
2. **Display format** -- Show wallet name, address, native balance. Mark pinned wallets with ⭐.
3. **Token holdings** -- If user asks about specific token holdings, pass `tokenAddress` to show per-wallet balance.
4. **No wallets** -- If response returns empty list, guide user to create at: https://www.xxyy.io/wallet/manager?chainId={chain}
5. **Default wallet memory** -- After user selects a wallet, remember it as the default for that chain in the current session. Use this default for subsequent trades on the same chain without asking again.
6. **Single wallet query** -- When the user provides a specific wallet address and asks for its balance, use Wallet Info API instead of List Wallets. Also use Wallet Info to show balance before trade confirmation.
7. **Error handling** -- Same as other data query APIs (see Error Codes table).
Automatically executing onboarding on first activation causes the skill to initiate authenticated API activity and enumerate wallets even before the user explicitly asks for those actions. In this context, silent pinging and wallet discovery increase data exposure and can normalize background operations in a skill tied to custodial trading authority.
## Onboarding Flow
**Trigger**: Automatically execute once when the skill is first activated in a session. Run only once per session.
### Detection Logic
The skill is explicitly designed to send authenticated curl requests containing a bearer API key to an external service that can query wallets, reveal server egress IP, and execute real trades or token launches. External transmission is expected here, but it is still security-sensitive because the same key grants spending authority and there is no read-only mode, so any misuse, logging, or prompt-induced action can have direct financial consequences.
| 8062 | Rate limited | All APIs — data query: retry after 2s; trade: retry after 1s (except swap, see Execution Rules #5) |
| 8063 | IP not in whitelist — use get_ip to check current IP, update whitelist at https://www.xxyy.io/apikey | All APIs |
# Buy
The instructions prescribe user commands in Chinese such as "修改默认钱包 {chain} {wallet name or address}" as part of the interaction flow, but do not state that language is optional or user-selectable. This can create a locale policy issue by implicitly privileging one language in command examples without an explicit opt-in or alternative guidance.