Back to skill

Security audit

Crypto SAFE Portfolio Analyzer Pro

Security checks for vulnerabilities and agentic risk

Overview

This skill mostly analyzes crypto portfolios, but it also includes under-disclosed trading alert code and strategy examples that go beyond safe portfolio tracking.

Review this before installing if you want a purely safe portfolio tracker. The core Python analyzer is mostly read-only and purpose-aligned, but the package also contains trading-signal code, aggressive strategy examples, and automation/sharing examples that may expose sensitive portfolio information or encourage speculative decisions. Keep holdings and cost-basis files private, avoid posting detailed reports to shared channels, and do not treat generated market signals as financial advice.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (19)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The skill description claims safe portfolio tracking and P&L analysis, but the detected behavior reportedly performs different functions, including trading-opportunity scanning and use of undeclared third-party APIs. This mismatch is dangerous because users may supply sensitive financial data under false assumptions, while the skill executes broader or different behavior than consented to.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The file’s stated behavior is a crypto opportunity scanner that generates market alerts and trading-oriented output, which materially conflicts with the skill metadata promising safe portfolio tracking and P&L analysis. This mismatch is dangerous because users may invoke the skill expecting passive analysis, while the code instead nudges speculative decisions and broadens the operational and compliance risk surface.

Context-Inappropriate Capability

High
Confidence
99% confidence
Finding
The analysis engine emits actionable speculative signals such as 'BUY THE DIP,' 'RIDE BREAKOUT,' and 'EXTREME FEAR — BUY ZONE,' which go beyond neutral portfolio reporting into market-timing recommendations. In the context of a supposedly safe portfolio tool, this is risky because it can manipulate user behavior, cause financial harm, and bypass policy or product controls meant to avoid trading advice.

Lp3

Medium
Category
MCP Least Privilege
Confidence
96% confidence
Finding
The skill advertises code-driven behavior that reads local files and accesses external networks, but it does not declare any tool scope or permissions. This prevents users and platforms from understanding or constraining what the skill can access, increasing the risk of unintended data exposure or over-broad execution in automated environments.

Missing User Warnings

Medium
Confidence
81% confidence
Finding
The skill handles highly sensitive financial information such as portfolio holdings and cost basis, but the description does not clearly warn users about privacy implications of external data lookups. Even if only ticker symbols are sent, users may reasonably assume their portfolio analysis is local and private, which can lead to uninformed disclosure in integrated or automated workflows.

Session Persistence

Medium
Category
Rogue Agent
Content
### 3. Set Up Configuration

For advanced features like cost basis tracking, create `portfolio-config.json`:

```json
{
Confidence
89% confidence
Finding
The skill instructs users to store portfolio configuration, including cost basis and allocation targets, in a persistent local file. Persisting sensitive financial data without guidance on file permissions, storage location, or retention increases the chance of unintended disclosure through shared workspaces, backups, logs, or other local access.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The example configuration materially expands the skill from passive portfolio tracking into trading-oriented behavior by including strategy parameters, leverage limits, momentum entries, stop-loss/take-profit logic, and Discord alerting destinations. In a skill advertised as 'safe' portfolio tracking and P&L analysis, this can mislead users or downstream agents into enabling quasi-automated trading workflows or external data sharing that they did not intend, increasing the chance of financial loss or information disclosure.

Session Persistence

Medium
Category
Rogue Agent
Content
## Configuration File Format

Create a `portfolio-config.json` file with your portfolio settings:

```json
{
Confidence
60% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The Discord example encourages sending portfolio value and P&L data to a third-party platform without warning that this is sensitive financial information. Users may unknowingly disclose holdings-derived financial data to external services, bots, channels, or logs, creating privacy and operational security risk.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
Suggesting emailed daily portfolio summaries without a privacy warning can lead users to transmit sensitive financial data over insecure or weakly protected channels. Email forwarding, mailbox compromise, and long-term retention increase the chance of exposure of portfolio size, performance, and activity patterns.

Intent-Code Divergence

Medium
Confidence
96% confidence
Finding
The header comments explicitly describe an opportunity scanner for crypto alerts, contradicting the skill description that presents the tool as a safe portfolio tracker. In security terms this is an integrity and transparency issue: misleading documentation can defeat user trust, safe-use expectations, and downstream review controls.

External Transmission

Medium
Category
Data Exfiltration
Content
async function getMarketData() {
  const ids = CONFIG.watchlist.map(c => COINGECKO_IDS[c]).filter(Boolean).join(',');
  const url = `https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&ids=${ids}&order=market_cap_desc&per_page=50&sparkline=false&price_change_percentage=1h,24h,7d`;
  const data = await httpsGet(url);
  if (!data || !Array.isArray(data)) return [];
  return data;
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
async function getMarketData() {
  const ids = CONFIG.watchlist.map(c => COINGECKO_IDS[c]).filter(Boolean).join(',');
  const url = `https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&ids=${ids}&order=market_cap_desc&per_page=50&sparkline=false&price_change_percentage=1h,24h,7d`;
  const data = await httpsGet(url);
  if (!data || !Array.isArray(data)) return [];
  return data;
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
// ─── Fear & Greed ──────────────────────────────────────────

async function getFearGreed() {
  const data = await httpsGet('https://api.alternative.me/fng/?limit=1');
  if (!data || !data.data || !data.data[0]) return null;
  const fg = data.data[0];
  const v = parseInt(fg.value);
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
// ─── Coinbase BTC Price (backup) ───────────────────────────

async function getCoinbasePrice(pair = 'BTC-USD') {
  const data = await httpsGet(`https://api.coinbase.com/v2/prices/${pair}/spot`);
  if (!data || !data.data) return null;
  return parseFloat(data.data.amount);
}
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Natural-Language Policy Violations

Medium
Confidence
96% confidence
Finding
The skill formats output using a fixed 'en-US' locale and 'America/Los_Angeles' timezone, which imposes a specific language/locale preference on all users. This is a natural-language policy concern because the file does not offer any user choice or document a justified region-specific requirement for this locale behavior.

Context-Inappropriate Capability

Low
Confidence
91% confidence
Finding
The manifest describes a portfolio tracker/analyzer that monitors value, calculates P&L, tracks prices, and generates reports. The Discord bot example adds outbound messaging/notification behavior, which is not part of the stated analysis scope and introduces an unrelated communication capability in the documented usage.

Missing User Warnings

Low
Confidence
76% confidence
Finding
This code automatically searches for and loads a portfolio configuration file from common local paths, which may contain wallet addresses and cost-basis information. While the code has docstrings, those only describe configuration loading and do not disclose to the user that potentially sensitive portfolio data will be read from disk.

Missing User Warnings

Low
Confidence
88% confidence
Finding
The code sends coin identifiers derived from the user's watchlist or holdings to the CoinGecko API. Although network access is part of price retrieval, there is no explicit user disclosure in the CLI help or visible messaging that asset interests derived from the user's portfolio are sent to an external service.

Static analysis

No suspicious patterns detected.