Tp2
- Category
- MCP Tool Poisoning
- Confidence
- 85% confidence
- Finding
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
- Content
Security audit
Security checks for vulnerabilities and agentic risk
This crypto portfolio skill is not clearly malicious, but it overstates its financial monitoring abilities and stores wallet addresses locally without enough disclosure.
Install only if you are comfortable with a simple prototype that stores wallet addresses in a home-directory JSON file and contacts CoinGecko for market prices. Do not rely on it for actual wallet balances, portfolio holdings, profit/loss, alerts, or financial decisions unless the implementation is corrected and the storage/network behavior is documented.
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
The documented behavior overstates what the skill actually does, claiming wallet monitoring, holdings analysis, and reporting without evidence of genuine balance retrieval or portfolio computation. In a financial context, this can mislead users into trusting incomplete or fabricated portfolio views, causing bad decisions or disclosure of wallet addresses under false assumptions about the tool’s accuracy.
The skill advertises code-driven behavior that implies file access and network use, but it does not declare any tool scope such as permissions or allowed-tools. This creates a governance and containment gap: an agent platform may grant broader capabilities than users expect, increasing the risk of unintended file access, local state modification, or outbound requests when the skill runs.
The manifest description and usage documentation are presented entirely in Chinese while the skill title and one trigger use English, but there is no statement offering users a language choice or documenting a justified locale restriction. This can violate language/locale policy when users are not explicitly opted into Chinese output or interaction.
Overly broad trigger phrases can cause the skill to activate in unrelated conversations, especially with generic terms like 'Crypto' or short colloquial phrases. Unintended activation matters here because the skill appears to use file and network capabilities, which could expose wallet-related data or perform actions when the user did not intend to invoke this skill.
The file presents its title and user-facing messages in Chinese, and no opt-in or alternative language support is offered. Under the policy, forcing a specific language without user choice is a natural-language policy violation unless the locale restriction is clearly documented and justified.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
DATA_FILE = os.path.expanduser("~/.crypto-portfolio.json")
# 简化版 CoinGecko API(免费,无需 Key)
PRICE_API = "https://api.coingecko.com/api/v3/simple/price"
def load_data():
if os.path.exists(DATA_FILE):
Wallet addresses are persisted to a predictable file in the user's home directory without any notice, consent flow, or permission hardening. While wallet addresses are not secret keys, they are sensitive financial metadata and can reveal asset ownership patterns if the local system is shared or compromised.
The skill performs HTTP requests to api.coingecko.com to retrieve prices, which is a network operation covered by the warning requirement for code files. While the API is commented as free and keyless, there is no explicit user-facing notice in CLI help, docstrings, or comments that using view/refresh/report contacts an external service.
The manifest describes a crypto holdings monitor that supports multi-wallet monitoring, real-time price queries, and holdings statistics. In practice, the code merely adds wallet addresses to a local JSON file and prints a fixed set of token prices and wallet counts; it never fetches wallet balances, computes per-wallet holdings, or produces actual portfolio statistics.
The command help and user-facing output indicate that it will display holdings, which implies wallet-derived asset balances or positions. However, the implementation does not inspect any wallet contents and instead only fetches generic prices for a hardcoded list of coins and echoes stored wallet addresses.
Overly Broad Trigger: '炒币' is too short and may match unintended inputs