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.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · SKILL.md (reported line 56)May include surrounding context.

3. Set Up Configuration

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

json
{

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · references/usage-examples.md (reported line 5)May include surrounding context.

Configuration File Format

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

json
{

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/portfolio-analyzer.py (reported line 66)May include surrounding context.

python
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;

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/portfolio-tracker.js (reported line 47)May include surrounding context.

js
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;

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/portfolio-tracker.js (reported line 56)May include surrounding context.

js
// ─── 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);

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/portfolio-tracker.js (reported line 70)May include surrounding context.

js
// ─── 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);
}

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.