Back to skill

Security audit

Fintech Research

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent finance research toolkit, but it exposes an unsafe raw SQL tool and can persist sensitive portfolio thesis data without clear controls.

Review this before installing if you plan to track real holdings or use it on sensitive research. Run it in a dedicated project/virtual environment, avoid entering private account details, and treat the SQL tool as writable until fixed or disabled.

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
mcp-server/server.py:34
Finding

Arbitrary SQL Execution Through a Falsely Documented Read-Only Tool

Content
View full analysis
dict: """Execute read-only SQL against cached data. Max 20 rows returned.""" import sqlite3 try: conn = sqlite3.connect(os.path.join(DIR, "cache.db")) conn.row_factory = sqlite3.Row c = conn.cursor() c.execute(query, params or []) rows = c.fetchmany(20) ``` ### Technical Analysis The MCP tool accepts an arbitrary SQL statement and passes it directly to `sqlite3.Cursor.execute()`. Despite the documentation describing the tool as read-only, the implementation does not enforce that restriction. There is no: - Read-only SQLite connection mode. - SQL statement allowlist. - SQLite authorization callback. - Rejection of mutating statements. - Transaction rollback after execution. - Restriction on writable `PRAGMA`, schema changes, or database attachment operations. Consequently, the caller can submit statements such as `DELETE`, `UPDATE`, `INSERT`, `DROP TABLE`, `ALTER TABLE`, or writable `PRAGMA` operations. The `fetchmany(20)` limit only restricts returned rows; it does not limit database side effects. Although this is not operating-system command execution, it violates the least-privilege boundary represented by the tool's advertised read-only purpose. ### Attack Path 1. The MCP server starts and exposes `run_sql` to the connected Agent. 2. A malicious user, prompt injection in external research content, or an erroneous Agent decision causes a call such as: ```sql DELETE FROM fundamentals; ``` 3. `run_sql` passes the statement directly to SQLite without checking its type. 4. SQLite executes the mutation against `mcp-server/cache.db`. 5. Cached fundamentals or price information is deleted, corrupted, or replaced. 6. Subsequent researc ...[truncated 1266 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding

Unpinned and Unhashed Third-Party Dependencies

Content
View full analysis
=0.2.54 pandas>=2.0.0 requests>=2.31.0 beautifulsoup4>=4.12.0 feedparser>=6.0.10 mcp>=1.0.0 httpx>=0.27.0 ``` ### Technical Analysis Every dependency is specified using only an open-ended minimum version. The project does not provide a lockfile, exact version constraints, or package hashes. As a result, the documented command: ```bash pip install -r requirements.txt ``` can install dependency versions that did not exist when the project was reviewed. This makes installation non-reproducible and prevents users from verifying that they received the same dependency artifacts assessed by the maintainers. If a future release of one of these packages or a transitive dependency is compromised, malicious code could execute during installation or when imported by the MCP server. The risk is particularly relevant because the dependencies include network clients, financial-data libraries, parsers, and the MCP framework itself. Most declared runtime packages are used directly or support declared functionality. However, `httpx` is not directly imported by the reviewed project code and should be confirmed as a necessary direct dependency rather than relying on speculative future use. No evidence shows that any currently listed package is malicious. The confirmed weakness is unsafe and non-reproducible dependency resolution, not an identified package compromise. ### Attack Path 1. A user follows the setup instructions and runs: ```bash pip install -r requirements.txt ``` 2. Pip resolves the newest package releases satisfying the open-ended minimum constraints. 3. A future compromised, malicious, or unexpectedly incompatible direct or transitive release is selected. 4. Package installation hooks or later imports execute code with the installing user's privileges. 5. ...[truncated 1020 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • 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
Findings (61)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Undeclared direct SQL query capability against a local cache increases the skill's effective power beyond what the description communicates. Even if intended for local analytics, hidden query functionality expands the attack surface and can expose or manipulate local data if an agent or user invokes it without understanding the risks.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
87% confidence
Finding

Undeclared direct SQL query capability against a local cache increases the skill's effective power beyond what the description communicates. Even if intended for local analytics, hidden query functionality expands the attack surface and can expose or manipulate local data if an agent or user invokes it without understanding the risks.

Content

No source excerpt is available for this finding.

Anti-Refusal Statement

High
Category
Anti-Refusal
Confidence
80% confidence
Finding

Skill instructs the agent to omit warnings, disclaimers, or ethical commentary. Stripping safety caveats hides risk from the user and is a common jailbreak preamble.

Content

Scanner excerpt · community-skills/probe/alt-plays.md (reported line 44)May include surrounding context.

md
## Important Notes
- Token: respect depth setting from style.md; present ranked table first
- HK-specific: AH spread is the primary differentiator — always check for dual-listed names
- Do not recommend illiquid names (turnover < HK$10m/day) without warning
- Max 2 parallel calls per step

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The run_sql tool claims to be read-only but executes arbitrary SQL provided by the caller without any enforcement. An MCP client or prompt-influenced agent could issue INSERT, UPDATE, DELETE, DROP, ATTACH, or other SQLite statements to alter or destroy cached data, potentially corrupting research outputs and enabling further misuse of the local environment.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger keywords are very broad terms like 'analyze', 'discover', 'track', and 'macro', which overlap with normal user conversation and can cause unintended routing into powerful market-research workflows. In a skill that can query multiple external sources and produce investment-oriented outputs, accidental invocation may lead to unexpected network access, irrelevant actions, or user confusion about what capability was activated.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The documentation states there are 'no calls to external projects' and that everything is 'self-contained', but the same file explicitly describes reliance on external network data sources such as yfinance, SEC EDGAR, HKEX, FRED, NewsAPI, and RSS. This mismatch can mislead operators, reviewers, or downstream agents into trusting the skill as offline/local-only when it actually performs external data access, increasing supply-chain, privacy, and policy-compliance risk.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The instruction that users can 'just type what they want to do' does not define what inputs are in scope for skill activation. This ambiguity can cause accidental dispatch from normal chat into autonomous research behavior, especially in an environment where the agent can contact local MCP servers and aggregate multiple external data sources. The issue is documentation-level, but it encourages unsafe invocation patterns that can lead to unintended actions.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README states that users can issue natural-language requests and Claude will route them directly to skills via an intent map. That creates an overly broad activation surface where ordinary conversation may unintentionally trigger a powerful research workflow, increasing the chance of unintended data access, external MCP queries, or execution of a higher-risk skill than the user expected. In this skill context, automatic routing to market-data and news-retrieval capabilities makes the ambiguity more dangerous, not less.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
83% confidence
Finding

The README promotes portfolio tracking and verification of a connected local MCP data server, but does not warn users that prompts, holdings, watchlists, or fetched market data may be transmitted to local services or third-party data sources. In an agent context, this can lead users to expose sensitive financial interests or behavioral data without informed consent, especially because portfolio-related workflows are explicitly encouraged.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The README lists high-level commands such as /probe, /dive, /track, and /landscape with broad example phrases like "Find EV supply chain plays" and "Track my portfolio," but it does not define clear boundaries for when each command should or should not be used. Without negative examples or stricter scope definitions, these triggers may overlap with common research requests and cause unintended invocation selection.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
83% confidence
Finding

The skill advertises network-backed and environment-dependent behavior but does not declare any explicit tool scope such as permissions or allowed-tools. In an agent setting, this can cause the runtime or user to underestimate what external access the skill may request or exercise, reducing transparency and weakening least-privilege controls.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger list includes generic phrases such as "upcoming events," "what's coming up," and "event calendar," which are broad enough to match ordinary market-research or planning requests outside this specific skill's intended scope. In an agent environment, this can cause unintended invocation, leading to incorrect tool selection, context leakage into a more powerful workflow, or unnecessary access to external data sources when the user did not explicitly request this capability.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · anthropic-equity-research-skills/earnings-analysis/references/workflow.md (reported line 53)May include surrounding context.

md
**❌ COMMON MISTAKES TO AVOID:**
- ❌ Using earnings data from training without searching
- ❌ Assuming "Q3 2024" is latest based on expectations
- ❌ Grabbing the first earnings release found without checking the date
- ❌ Not comparing the release date to today's date
- ❌ Proceeding when the release is 4+ months old

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · anthropic-equity-research-skills/earnings-analysis/references/workflow.md (reported line 163)May include surrounding context.

md
**❌ COMMON MISTAKES TO AVOID:**
- ❌ Using earnings data from training without searching
- ❌ Assuming "Q3 2024" is latest based on expectations
- ❌ Grabbing the first earnings release found without checking the date
- ❌ Not comparing the release date to today's date
- ❌ Proceeding when the release is 4+ months old

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The trigger list includes broad natural-language phrases such as 'find ideas', 'what looks interesting', and 'new ideas', which can match ordinary conversation outside the intended stock-screening workflow. This can cause the skill to activate unexpectedly, overriding user intent or routing generic prompts into financial-analysis behavior without sufficient context.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill directs the agent to read multiple local files and write a final DOCX as part of Task 5, but it does not require an explicit user confirmation before performing filesystem-modifying actions. In an agent environment, this can lead to unexpected local file access or output generation, especially if the user asked for analysis help but did not clearly consent to file operations in the current workspace.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · anthropic-equity-research-skills/initiating-coverage/SKILL.md (reported line 642)May include surrounding context.

md
### Verification Checklist by Task

**Task 1**: ✅ No verification needed (independent)

**Task 2**: Check historical financials available

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill repeatedly enforces a strict single-task-only execution model, but this section tells the agent to execute missing prerequisite tasks first when verification fails. That contradiction can cause the agent to autonomously branch into additional tasks the user did not explicitly request, defeating the stated safety boundary and potentially triggering unintended data processing, file creation, or external access.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill explicitly directs the agent to perform local file operations, including extracting a ZIP archive and writing a DOCX output, without requiring explicit user confirmation, path restrictions, or safety checks. In an agent environment, this can lead to unintended modification of the local workspace, archive extraction risks such as zip-slip/path traversal if not safely handled by tooling, and silent handling of sensitive local files beyond what the user clearly authorized.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The trigger list includes broad natural-language phrases such as "update model," "refresh estimates," and "revise estimates," which are common in ordinary financial discussion and can cause the skill to activate when the user did not intend to invoke it. In an agentic environment, unintended activation can redirect workflow, consume tools or tokens, and cause the system to act on the wrong task context, especially when the skill can update files or produce model revisions.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger list includes generic phrases such as "morning note," "trade idea," and "what happened overnight," which can plausibly appear in ordinary finance discussions and cause the skill to activate unintentionally. In this skill, unintended invocation is primarily a workflow-integrity issue rather than direct code execution, but it could still lead to irrelevant note generation, confusion, or accidental inclusion of opinionated output in the wrong context.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This markdown skill description says it triggers on phrases including "industry report," "sector analysis," and especially "thematic research," which are broad terms that may overlap with many ordinary analyst requests. The file does not provide exclusion conditions, contextual limits, or negative examples clarifying when the skill should not activate.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The trigger list includes broad natural-language phrases such as "is my thesis still intact," "thesis check," and "review my positions," which can plausibly appear in ordinary conversation and cause unintended invocation of the skill. In a finance context, accidental activation may expose portfolio context, prompt unwanted state updates, or steer the agent into making investment-analysis actions the user did not explicitly request.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill explicitly instructs the agent to store thesis data in a structured format for reuse across sessions, but it does not clearly warn the user that potentially sensitive investment positions, convictions, stop-losses, and rationale may persist. In a fintech research setting, this creates a privacy and confidentiality risk because retained portfolio data could be surfaced later unintentionally or handled without informed consent.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The description says the skill triggers on terms like "earnings," "results," and "scorecard," which are generic words that can appear in many normal conversations and requests. The file does not provide narrowing conditions, context limits, or negative examples to clarify when the skill should or should not activate.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.