T09 · Insecure Skill Coding Practices
- Location
scripts/zapper.py:15- Finding
Plaintext API Key Stored in a Predictable Configuration File
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a disclosed Zapper API helper for wallet portfolio lookups, with privacy and API-key handling cautions but no hidden or destructive behavior found.
Before installing, prefer setting ZAPPER_API_KEY in your environment instead of storing the key in the config file. Only query wallet addresses you are comfortable sending to Zapper, since portfolio and transaction lookups reveal linkable financial metadata to that provider. If you use the config file, keep it private with restrictive filesystem permissions.
scripts/zapper.py:15Plaintext API Key Stored in a Predictable Configuration File
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
~/.config/zapper/addresses.json:
{
The skill declares capabilities that use environment variables and make outbound network requests, but it does not specify any explicit tool scope or allowed-tools boundary. This weakens least-privilege controls and can let the runtime grant broader access than users expect, especially for a skill that sends wallet-related data to an external API.
The skill processes wallet addresses, portfolio balances, NFT holdings, and transaction history by querying Zapper, but the description does not clearly warn that this information is transmitted to a third-party service. Users may disclose sensitive financial metadata without informed consent, which is especially relevant in blockchain contexts where addresses can be linked to identity and assets.
The documentation directs users to send wallet addresses, portfolio holdings, NFT balances, and transaction history to a third-party API endpoint, but it does not warn that this data can be sensitive and linkable to a user. Even though blockchain data is public, aggregating and transmitting it to an external service can expose financial profiling, address clustering, and behavioral data without informed consent.
The curl example shows direct external transmission of wallet data and an API key to a third-party endpoint. In this skill's context, external transmission is expected for functionality, but it still creates privacy and data-handling risk if used without disclosure, validation, or least-privilege controls.
}
## curl Examples
### Portfolio
```bash
The skill sends wallet addresses, and for transaction-history queries associated activity data, to Zapper’s external GraphQL API without any explicit disclosure or consent mechanism. Wallet addresses and transaction history are privacy-sensitive in the blockchain context because they enable portfolio profiling, behavioral analysis, and cross-service correlation of a user’s on-chain identity.
The manifest scope lists DeFi portfolios, token holdings, NFTs, transactions, and prices. The fetch_claimables path adds a separate rewards-discovery capability for unclaimed rewards, which is adjacent to DeFi analysis but not actually named in the stated skill description.
The config command exposes locally stored wallet labels and partially masked addresses, which goes beyond the skill’s declared portfolio-querying purpose and increases local data exposure. While it does not reveal the API key value, it still enumerates sensitive metadata about configured wallets that could be surfaced to an untrusted caller or higher-level agent without clear need.
No suspicious patterns detected.