Back to skill

Security audit

Yahoo Finance News

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent Yahoo Finance headline fetcher with disclosed caching and dependency risks, but no evidence of hidden, destructive, or deceptive behavior.

Before installing, use an isolated virtual environment, consider pinning yfinance to a reviewed version, and treat the skill as a best-effort finance news helper rather than complete or real-time market coverage. Agents should invoke it only for finance-symbol news requests, not general news queries.

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)

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Unpinned Third-Party Dependency Allows Unreviewed Package Updates

Content
View full analysis
=0.2.40 ``` The dependency is installed using the following documented commands: ```bash pip install -r requirements.txt ``` ### Technical Analysis The lower-bound-only version constraint permits installation of any current or future `yfinance` version greater than or equal to `0.2.40`. No lock file, exact version constraint, package hash, or trusted-index restriction is provided. Consequently, the dependency code installed at deployment time may differ from the code reviewed during this audit. Python package installation may also execute package build or installation logic with the privileges of the user running `pip`. A compromised upstream release, package-index compromise, or malicious package substituted through an untrusted package source could therefore introduce arbitrary behavior without requiring any modification to this project. This is a supply-chain weakness rather than evidence that the currently named `yfinance` package is malicious. ### Attack Path 1. An attacker compromises an allowed future `yfinance` release, its upstream publishing account, or a package source configured in the deployment environment. 2. The attacker publishes a version satisfying `>=0.2.40`. 3. An operator or agent follows the documented installation procedure and runs `pip install -r requirements.txt`. 4. Package installation retrieves the compromised version because no upper bound, exact pin, or hash validation prevents it. 5. Malicious installation or runtime code executes with the permissions of the user operating the skill. ### Impact Assessment Successful exploitation could execute arbitrary Python code with the installing or runtime user's privileges. This may expose files, environment variables, cr ...[truncated 362 chars]
Remediation
View remediation
`. - Generate and commit a reproducible lock file that also pins transitive dependencies. - Require package hashes during installation, such as through a hash-locked requirements file and `pip install --require-hashes`. - Install packages only from an explicitly configured and trusted package index. - Perform dependency updates through a controlled review process with vulnerability scanning and regression testing. - Install dependencies inside an isolated virtual environment or container using a non-privileged account. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
scripts/market_news.py:25
Finding

Predictable Cache Files Are Written Through Symbolic Links

Content
View full analysis
None: payload["_cached_at"] = int(time.time()) with open(_cache_path(key), "w", encoding="utf-8") as f: json.dump(payload, f, ensure_ascii=False, indent=2) ``` The filename is predictably derived by the following helper: ```python def _cache_path(key: str) -> str: safe = re.sub(r"[^A-Za-z0-9_.-]+", "_", key) return os.path.join(CACHE_DIR, f"{safe}.json") ``` ### Technical Analysis The cache directory is relative to the process's current working directory, and cache filenames are deterministically derived from the requested symbol and limit. `_cache_set` opens the resulting path using ordinary `open(..., "w")`. On platforms with symbolic-link support, this operation follows an existing symlink and truncates its target before writing JSON. The implementation does not verify that the cache directory or destination is not a symlink, does not use exclusive or no-follow file-opening flags, and does not write through a secure temporary file followed by an atomic replacement. Exploitation requires the attacker to be able to create or replace entries in the cache directory used by the process. It does not independently bypass operating-system file permissions. ### Attack Path 1. The attacker obtains write access to the process's current working directory or its `.cache/finance-news` subdirectory. 2. The attacker predicts a cache filename, such as the normalized filename generated for a known symbol and limit. 3. The attacker creates that filename as a symbolic link to another file writable by the skill's operating-system user. 4. The skill is invoked for the corr ...[truncated 904 chars]
Remediation
View remediation
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (3)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The listed trigger phrases include generic terms such as "latest news," "news for," and especially "market news," which are broad enough to match common conversational requests outside the intended narrow stock-symbol workflow. The file does not provide exclusion conditions or negative examples to clarify when the skill should not activate.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
93% confidence
Finding

The dependency is specified with a lower bound only, which allows installs to resolve to any newer yfinance release, including versions that may introduce breaking changes or newly disclosed vulnerabilities. In a skill that fetches external finance news, this increases supply-chain and reproducibility risk because builds are not deterministic and security posture can change over time without review.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
yfinance>=0.2.40

Static analysis

No suspicious patterns detected.