Back to skill

Security audit

Crypto Wave Scanner

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to be a real crypto scanner, but it needs review because it loads live third-party JavaScript for a trading dashboard and exposes its local server more broadly than advertised.

Review before installing or running. The skill does not request Binance credentials or place trades, but its dashboard may influence trading decisions while loading live JavaScript from a CDN, and its server listens beyond localhost by default. Prefer running it only on a trusted network, treat signals as informational, and consider fixing the server bind and bundling or integrity-pinning the chart library.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T03 · Remote Payload Retrieval and Execution

Warning
Location
assets/wave-scanner.html:6
Finding

Remote JavaScript Dependency Loaded Without Integrity Verification

Content
View full analysis
``` ### Technical Analysis The dashboard loads and executes JavaScript directly from the third-party `unpkg.com` CDN at runtime. Although the dependency version is pinned to `4.1.3`, the page does not specify a Subresource Integrity (`integrity`) hash and does not bundle a reviewed local copy. Consequently, the code that ultimately executes is not fully represented by the audited project. If the CDN, package publication process, hosted artifact, or delivery path is compromised, modified JavaScript could be returned and executed automatically when the dashboard opens. The remote script executes in the browser under the dashboard's HTTP origin. The application also lacks a restrictive Content Security Policy, increasing the freedom available to compromised dependency code. ### Attack Path 1. An attacker compromises the CDN response, upstream package artifact, or package publishing account. 2. The user launches `scripts/serve.py` and opens the dashboard. 3. The browser requests the script from `https://unpkg.com`. 4. Because no integrity hash is present, the browser accepts a modified response. 5. The attacker-controlled JavaScript executes in the dashboard's browser context. 6. The script can manipulate displayed prices and trading signals, issue arbitrary network requests permitted by the browser, and access any non-HttpOnly data subsequently stored under the same dashboard origin. ### Impact Assessment The immediate privilege obtained is JavaScript execution in the user's browser under the dashboard origin, not operating-system-level code execution. A malicious dependency could falsify financial indicators, alte ...[truncated 504 chars]
Remediation
View remediation
``` 2. If remote hosting is unavoidable, calculate and pin the exact cryptographic digest: ```html ``` The digest must be generated from a separately verified copy of the exact artifact. 3. Add a restrictive Content Security Policy. After moving inline JavaScript into a local file, an appropriate baseline would be: ```html ``` 4. Pin and verify dependency artifacts during development or packaging rather than retrieving executable code dynamically at runtime. 5. Document the dependency version and checksum so future upgrades require an explicit review and checksum update. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
scripts/serve.py:22
Finding

Local Dashboard Server Listens on All Network Interfaces

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (12)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description describes a full market-scanning and analysis tool with technical computations, real-time data access, and terminal scanning. The supplied code chunk only launches a local static file server and opens a browser to a dashboard page. While serving the dashboard could be a supporting component of the overall skill, this chunk by itself does not implement the core declared behavior and instead performs only local hosting/browser-launch functionality. That is a material mismatch between the described primary capability and the actual code behavior in this chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The code substantially matches the CLI scanning portion of the description in that it evaluates Binance futures symbols using EMA9/21/50, RSI, volume confirmation, 1h trend, and MACD, scores each symbol out of 6, and prints entry/TP/stop guidance. However, the declared description prominently claims a visual live browser dashboard with charts and overlays, plus real-time scanning across 10 coins. None of that visual or live dashboard functionality exists in this code chunk; it is a one-shot terminal script only. Additionally, the default symbol list contains 8 coins rather than 10, and the scanner targets the Binance Futures testnet URL. The description also suggests both entry and exit wave detection, but the implemented logic is clearly oriented toward bullish setup scoring rather than explicit exit/exhaustion detection. These are material description-to-behavior mismatches.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- `assets/wave-scanner.html` — self-contained browser dashboard (TradingView Lightweight Charts)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill advertises executable shell-based workflows (python3 scripts/serve.py, python3 scripts/wave_scanner.py) but does not declare any tool scope such as allowed tools or permissions. That creates an execution-boundary problem: a host or user may run code without explicit authorization metadata, reducing transparency and making review and sandboxing harder.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest says the scanner scores each coin using a distinct '1h trend', implying analysis on a 1-hour timeframe. Here the code computes the supposed 1h trend from the same current klines array and even comments that the caller should pass 1h data, but refresh() only fetches one selected interval per symbol, so the displayed score does not match the described behavior.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The comment and variable names document this logic as a 1h trend calculation, yet the implementation derives it from the same closes array and refresh() passes only one dataset from the user-selected interval. This is an active contradiction between the code's inline documentation and how the code actually behaves.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill's stated purpose is a crypto market scanner using Binance public API, which justifies network access but not spawning an OS-level executable. Invoking curl.exe adds a subprocess execution capability that is broader than needed for scanning and is context-inappropriate for this kind of analytics tool.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/wave_scanner.py (reported line 13)May include surrounding context.

python
SYMBOLS = ["BTCUSDT", "ETHUSDT", "SOLUSDT", "XRPUSDT", "BNBUSDT", "AVAXUSDT", "LINKUSDT", "DOGEUSDT"]

def curl_get(path):
    r = subprocess.run(["curl.exe", "-s", BASE + path], capture_output=True)
    return json.loads(r.stdout.decode("utf-8"))

def ema(data, period):

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

This HTML/JavaScript code fetches data from Binance Futures over the network, but the only disclosure is an inline code comment at L155, which is not user-facing. Under the code-file criteria, network calls that transmit user or system data should have some visible disclosure, logging, or documentation; here the page auto-starts fetching on load without a user warning.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The module docstring says the script is used as python3 wave_scanner.py [--alert] [--symbols BTC ETH SOL], implying alerting behavior is part of the tool. However, the argument parser only implements --symbols and --min-score, so the documented behavior does not match the actual code.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
97% confidence
Finding

This is an active documentation contradiction: the docstring explicitly tells users they can pass --alert, but argparse never defines that flag. That makes the inline usage guidance inaccurate rather than merely incomplete.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The code performs an external HTTP request by invoking curl against the Binance Futures testnet, but this action is not disclosed through a comment, docstring detail, or user-facing message near the operation. For a code file, outbound network activity should have some visible disclosure unless it is clearly warned elsewhere; the top-level docstring says it scans Binance Futures but does not explicitly warn that live network requests will be made.

Content

No source excerpt is available for this finding.