Back to skill

Security audit

Follow-Through Day (FTD) Detector

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to do market analysis, but it under-discloses its actual data source and credential handling while giving concrete investment exposure guidance.

Review before installing if you expect a yfinance/Yahoo-only tool or do not want to provide an FMP API key. Treat its exposure recommendations as informational market-analysis output, not financial advice, and prefer using FMP_API_KEY from the environment rather than passing a key on the command line.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/fmp_client.py:33
Finding

FMP API Key Exposed Through Process Arguments and URL Query Parameters

Content
View full analysis
Optional[dict]: if self.rate_limit_reached: return None if params is None: params = {} params["apikey"] = self.api_key elapsed = time.time() - self.last_call_time if elapsed < self.RATE_LIMIT_DELAY: time.sleep(self.RATE_LIMIT_DELAY - elapsed) try: response = self.session.get(url, params=params, timeout=30) ``` ### Technical Analysis The documented invocation expands `FMP_API_KEY` into the process argument vector. Depending on the operating system and monitoring configuration, command-line arguments can be exposed through process-listing utilities, `/proc` interfaces, shell history, job schedulers, audit systems, or observability agents. The HTTP client also places the API key in the `apikey` URL query parameter. TLS protects the request while it is transmitted over the network, but query strings are commonly recorded in application logs, reverse-proxy logs, API gateway telemetry, HTTP debugging output, and server-side access logs. This inc ...[truncated 1455 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
README.md:20
Finding

Unpinned and Inconsistent Third-Party Dependency Installation

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (8)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

This is a serious description-behavior mismatch: the skill claims to perform Follow-Through Day detection with a state machine and dual-index confirmation, but the analyzed behavior reportedly only performs generic market-data retrieval and external API access. That can mislead users, downstream agents, or policy systems into trusting investment recommendations that were never actually computed, while also concealing outbound data access under a benign-seeming analytical description.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README presents concrete investment exposure guidance such as '25%, 50%, 75%, 100%' and states like 'Safe to increase exposure gradually' without a prominent warning that the output is informational only and not financial advice. In a trading context, users may rely on the signal as actionable investment instruction, increasing the risk of financial harm if the methodology is wrong, delayed, or misunderstood.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill metadata declares no tool scope, yet the implementation is reported to use environment access, file writing, and network capabilities. That gap removes an important security boundary: operators and orchestrators may trust the manifest while the skill can actually access sensitive runtime data, persist artifacts, or make outbound requests. In a financial-analysis skill, those undeclared capabilities are not obviously required from the manifest alone, so the mismatch increases the chance of silent overreach.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

Broad natural-language invocation criteria can cause the skill to trigger on ordinary market commentary or vague questions about buying, corrections, or equity exposure. In this context, over-triggering is risky because the skill presents itself as market-timing guidance; accidental invocation can lead to unwarranted financial recommendations or unnecessary use of hidden capabilities such as network calls.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The module docstring explicitly says it is an "FMP API Client for Market Top Detector" and provides access "for market top detection analysis," which does not match the manifest for this skill: a Follow-Through Day detector focused on market-bottom confirmation. While the code itself is a generic market-data client, the documented purpose attached to this file semantically mismatches the declared skill intent.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The inline documentation actively frames this component as supporting "market top detection analysis," whereas the skill manifest says the skill is offensive and intended for detecting Follow-Through Days and market bottom confirmation. This is not merely incomplete documentation; it points to a conflicting intent for the same component within the skill.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The find_swing_low docstring states a swing low is disqualified only if there are lower closes on both adjacent days. However, the implementation marks is_local_low false if either the previous day or the next day has a lower close, which is a stricter condition and contradicts the documented rule.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The comment says the function will use the 'more advanced' state when no FTD is confirmed, which implies a neutral ordering of progression. In practice, the hard-coded priority prefers FTD_WINDOW, RALLY_ATTEMPT, and CORRECTION ahead of failure-related states, so the implementation specifically chooses the more hopeful state rather than simply the more advanced one.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.