Back to skill

Security audit

finance-reporter

Security checks for vulnerabilities and agentic risk

Overview

This skill coherently fetches public market data from Yahoo Finance and prints a Chinese finance report, with some install and localization caveats but no evidence of hidden, destructive, or deceptive behavior.

Before installing, be aware that the skill is Chinese-oriented, needs outbound access to Yahoo Finance, and may be scheduled to run if you explicitly add the documented cron job. Prefer installing Python dependencies from a pinned requirements file instead of the current unpinned requests command.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (1)

T08 · Insecure Dependencies

Warning
Location
package.json:32
Finding
Unpinned and Inconsistently Declared Third-Party Dependency<![CDATA[ ## Vulnerability Details **File Location**: `package.json:32-34`; `SKILL.md:117-120` **Vulnerability Type**: Supply-chain risk caused by an unpinned Python dependency and a package-manager mismatch **Risk Level**: Medium ### Vulnerable Code `package.json:32-34`: ```json "dependencies": { "requests": "^2.28.0" } ``` `SKILL.md:117-120`: ```bash ### 安装依赖 ```bash pip3 install requests ``` ``` ### Technical Analysis The executable in `tools/finance_data.py` imports the Python `requests` library, but the dependency is declared under the npm `dependencies` field in `package.json`. npm and Python package indexes are separate ecosystems, so an npm package named `requests` is not the Python library imported by the script. Automated tooling that processes `package.json` may therefore resolve or attempt to resolve an unrelated package. The documented Python installation command also installs `requests` without a fixed version, lockfile, or integrity hash. Its result can change over time and is not reproducible. If a compromised or otherwise unsafe release is selected, its installation or imported runtime code would execute in the user's Python environment. This issue does not demonstrate that the currently named packages are malicious. The vulnerability is the unsafe and inconsistent dependency resolution process, which creates an avoidable supply-chain attack surface. ### Attack Path 1. A user or automated deployment system installs the project dependencies. 2. If it processes `package.json`, npm attempts to resolve the package named `requests` from the npm registry rather than installing the required Python library. 3. Alternatively, the user follows the documentation and runs `pip3 install requests` without a version pin or hash. 4. The package manager retrieves whatever release satisfies the uncontrolled declaration at installation time. 5. If the resolved package or release is compromised, attacker-controlled installation hooks or library code ex ...[truncated 1076 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the Python dependency from the npm dependency section: ```json { "dependencies": {} } ``` If Node.js is not used by the project, remove the `dependencies` field entirely and avoid using npm as the dependency installer. 2. Declare Python dependencies in a dedicated `requirements.txt` or `pyproject.toml`. Pin the dependency to a reviewed version, for example: ```text requests==<reviewed-version> ``` 3. Generate and retain hashes for reproducible installation where practical: ```text requests==<reviewed-version> \ --hash=sha256:<verified-package-hash> ``` Install with hash enforcement: ```bash python3 -m pip install --require-hashes -r requirements.txt ``` 4. Use a dependency lock workflow such as `pip-tools`, Poetry, or uv so direct and transitive dependencies are fixed and reviewable. 5. Update `SKILL.md` to instruct users to install from the reviewed dependency file: ```bash python3 -m pip install -r requirements.txt ``` 6. Configure installation to use the official or an organization-approved Python package index over HTTPS. Review dependency provenance and run automated vulnerability scanning before updating locked versions. ]]>
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • 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
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
The user-facing documentation is written entirely in Chinese, including the skill description and feature list, with no indication that other languages are supported or that Chinese is a required locale. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale restriction is clearly justified.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill explicitly relies on external network access to Yahoo Finance API and webhook-style push integrations, but it does not declare any tool scope such as permissions or allowed-tools. Undeclared network capability weakens least-privilege controls and can allow broader outbound access than reviewers or operators expect, increasing the risk of data exfiltration or misuse if the implementation changes or is compromised.

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
The file’s natural-language description, instructions, and examples are entirely in Chinese, including the manifest description and user invocation guidance. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale constraint is explicitly documented and justified, which is not present here.

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
The description is entirely in Chinese and does not indicate that language selection is optional or that the skill is intentionally limited to a Chinese-speaking or region-specific audience. This creates a natural-language locale policy concern because it implicitly fixes the skill's presentation language without user opt-in or justification.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"python": ">=3.8"
  },
  "dependencies": {
    "requests": "^2.28.0"
  }
}
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Natural-Language Policy Violations

Low
Confidence
90% confidence
Finding
This Python file contains natural-language descriptions and user-facing report text exclusively in Chinese, including the module docstring and generated output labels. Under the policy rule for language/locale, this can be a violation when a specific language is forced without user opt-in or an explicit documented justification.

Static analysis

No suspicious patterns detected.