Back to skill

Security audit

All Weather Strategy

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent ETF allocation and reporting tool, with normal market-data and report-generation behavior but some dependency and locale caveats.

Install this in an isolated Python environment, preferably after pinning dependencies or using a reviewed lockfile. Expect it to contact external market-data services and to use Chinese/CNY defaults. Only invoke the CLI report-saving path if you want local CSV/PDF files created, and treat the portfolio output as informational rather than guaranteed investment advice.

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
requirements.txt:1
Finding

Unpinned Third-Party Dependencies Allow Unreviewed Supply-Chain Changes

Content
View full analysis

Vulnerability Details

File Location: requirements.txt:1-9
Vulnerability Type: T08: Insecure Dependencies
Risk Level: Medium

Vulnerable Code

text
akshare
yfinance
numpy
pandas
matplotlib
scipy
reportlab
streamlit>=1.42.0
altair>=5.0.0

Technical Analysis

Seven direct dependencies have no version constraints. The remaining two use only minimum-version constraints, with no upper bounds or integrity hashes. Consequently, package installation can resolve to releases that were never reviewed or tested with this project.

This makes installations non-reproducible and creates a supply-chain exposure. If a dependency's package registry account, publishing pipeline, or upstream release is compromised, the resolver may install attacker-controlled code. Python packages may execute code during installation, and all listed packages are imported into the application process, where malicious module-level code could also execute.

No dependency is confirmed to be malicious. The vulnerability is the unrestricted trust placed in future package releases rather than evidence of an existing malicious payload.

Attack Path

  1. An attacker compromises the publishing account, release pipeline, or upstream distribution channel of one of the declared packages.
  2. The attacker publishes a malicious version that still satisfies the unrestricted requirement or the >= constraint.
  3. A user or deployment system installs the project dependencies without a reviewed lockfile or required hashes.
  4. The package resolver selects and downloads the malicious release.
  5. Attacker-controlled code executes during package installation or when the application imports the affected package.
  6. The code runs with the privileges and environmental access of the installation or application process.

Impact Assessment

Successful exploitation could provide arbitrary code execution under the account running dependency installation or the Streamlit application. Depend ...[truncated 483 chars]

Remediation
View remediation

Remediation Suggestions

  1. Pin every direct dependency to an exact, reviewed version rather than using unrestricted names or minimum-only constraints.
  2. Generate and commit a lockfile containing the complete transitive dependency graph.
  3. Require package hashes during deployment, such as with a hash-locked requirements file and pip install --require-hashes.
  4. Install packages only from explicitly approved package indexes over authenticated TLS; disable unintended extra indexes to reduce dependency-confusion exposure.
  5. Run automated vulnerability and provenance checks against both direct and transitive dependencies.
  6. Perform dependency upgrades through a controlled process that includes source review, security scanning, compatibility testing, and financial-calculation regression tests.
  7. Build dependencies in an isolated, least-privileged environment and run the application with only the filesystem and network permissions required for market-data retrieval and report generation.
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (19)

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The page title, sidebar labels, and main title are hardcoded in Chinese, which imposes a specific language on users. The file does not provide any opt-in, toggle, or explanation that the skill is intentionally limited to a Chinese-speaking audience.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The file configures Chinese fonts and uses a Chinese output directory and Chinese user-facing strings throughout, indicating the skill is effectively locked to Chinese. There is no opt-in, fallback messaging to the user, or documentation that this is intentionally a region-specific tool, which can violate language/locale policy requirements.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

The README instructs the assistant to offer a default configuration using Chinese currency notation and Chinese text (10,000元) without stating that the user can choose another language or locale. This can conflict with organizational language/locale policy when the skill is used in broader contexts beyond Chinese-speaking users.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
98% confidence
Finding

The dependency akshare is not pinned to an exact version, which makes builds non-reproducible and increases supply-chain risk because future installs may pull in a changed or compromised release. In a financial analysis skill that fetches market data, dependency integrity matters because unexpected package behavior could affect both availability and trustworthiness of outputs.

Content

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

text
akshare
yfinance
numpy
pandas

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
98% confidence
Finding

The yfinance requirement is unpinned, so installations may resolve to different versions over time, creating supply-chain and stability risk. Because this skill relies on externally sourced financial data, an unexpected upstream package change could alter behavior or break controls without any code change in the skill itself.

Content

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

text
akshare
yfinance
numpy
pandas
matplotlib

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
99% confidence
Finding

numpy is declared without an exact version, so the environment may install any current compatible release, making it impossible to guarantee consistent or safe builds. Since numerical correctness is central to portfolio allocation logic, unexpected dependency drift can affect both security posture and calculation reliability.

Content

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

text
akshare
yfinance
numpy
pandas
matplotlib
scipy

Unverifiable Dependency: numpy has 16 known advisory(ies) (CVE-2014-1859 (Numpy arbitrary file write via symlink attack); CVE-2021-41495 (NumPy NULL Pointer Dereference); CVE-2021-33430 (NumPy Buffer Overflow (Disputed)) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
95% confidence
Finding

Because numpy is unpinned and has known advisories across some releases, the manifest does not let defenders determine whether deployed environments are affected. This is dangerous because vulnerability management and patch verification become impossible without exact versions, especially for a core numerical package used everywhere in the skill.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
99% confidence
Finding

The pandas dependency is unpinned, which exposes the project to dependency confusion, unexpected breaking changes, and unverifiable patch status. In a data-processing skill, this can impact both operational security and the integrity of downstream analytics.

Content

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

text
akshare
yfinance
numpy
pandas
matplotlib
scipy
reportlab

Unverifiable Dependency: pandas has 1 known advisory(ies) (CVE-2020-13091 (** DISPUTED ** pandas through 1.0.3 can unserialize and execute commands from an)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
93% confidence
Finding

pandas has at least one known advisory affecting some versions, and the lack of version pinning means the actual exposure cannot be assessed from the manifest. Even if exploitability depends on unsafe deserialization patterns elsewhere, unverifiable package state is still a supply-chain weakness.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
98% confidence
Finding

matplotlib is not pinned to an exact version, so builds are not reproducible and may unexpectedly consume a newer release with different behavior or unresolved vulnerabilities. While plotting libraries are often lower risk than network-facing packages, they still participate in the application's trusted code base.

Content

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

text
yfinance
numpy
pandas
matplotlib
scipy
reportlab
streamlit>=1.42.0

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
99% confidence
Finding

The scipy dependency is unpinned, so the installed version cannot be predicted or audited from the manifest alone. For a quantitative finance skill, this increases supply-chain risk and can also introduce silent changes to optimization or statistical behavior.

Content

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

text
numpy
pandas
matplotlib
scipy
reportlab
streamlit>=1.42.0
altair>=5.0.0

Unverifiable Dependency: scipy has 4 known advisory(ies) (CVE-2013-4251 (SciPy creates insecure temporary directories); CVE-2013-4251 (The scipy.weave component in SciPy before 0.12.1 creates insecure temporary dire); CVE-2023-25399 (A refcounting issue which leads to potential memory leak was discovered in scipy) +1 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
94% confidence
Finding

scipy has published advisories for certain versions, but the requirements file does not specify which version should be installed, preventing meaningful security verification. In a quantitative application, leaving such a central library unverifiable undermines both security review and operational predictability.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
99% confidence
Finding

reportlab is unpinned, which is more concerning than many of the other packages because document-generation libraries have had impactful vulnerabilities, including code execution and SSRF issues in some versions. If this skill generates reports from user-influenced content, pulling an unsafe version could materially increase exploitability.

Content

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

text
pandas
matplotlib
scipy
reportlab
streamlit>=1.42.0
altair>=5.0.0

Unverifiable Dependency: reportlab has 8 known advisory(ies) (CVE-2023-33733 (Reportlab vulnerable to remote code execution); CVE-2020-28463 (Server-side Request Forgery (SSRF) via img tags in reportlab); CVE-2019-19450 (ReportLab vulnerable to remote code execution via paraparser) +5 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
98% confidence
Finding

reportlab has a history of serious issues, including RCE and SSRF in some versions, and the unpinned requirement makes it impossible to know whether installations are safe. In this skill context, report generation can plausibly process user-controlled content, which makes an unsafe reportlab version more dangerous than a dormant library with no attack surface.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
99% confidence
Finding

streamlit is specified only with a minimum version, so installs may vary and can resolve to releases with unknown security properties or regressions. Because Streamlit is the user-facing web application framework here, dependency drift in this package has a larger security impact than drift in purely computational libraries.

Content

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

text
matplotlib
scipy
reportlab
streamlit>=1.42.0
altair>=5.0.0

Unverifiable Dependency: streamlit has 11 known advisory(ies) (CVE-2026-33682 (Unauthenticated SSRF Vulnerability in Streamlit on Windows (NTLM Credential Expo); GHSA-8qw9-gf7w-42x5 (Minor fix to previous patch for CVE-2022-35918); CVE-2023-27494 (Streamlit publishes previously-patched Cross-site Scripting vulnerability) +8 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
98% confidence
Finding

streamlit has multiple known advisories in some releases, and using only a minimum version means the actual deployed version may still be vulnerable or otherwise unknown. Since Streamlit is the application’s interactive web surface, unresolved package exposure here could affect end users directly through client-side or server-side attack paths.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
98% confidence
Finding

altair is defined with only a minimum version, which allows non-deterministic installs and reduces assurance that deployed environments match tested ones. Although primarily a visualization library, it still expands the trusted dependency surface and can introduce unexpected behavior over time.

Content

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

text
scipy
reportlab
streamlit>=1.42.0
altair>=5.0.0

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

The skill's stated purpose is portfolio allocation and metric calculation, but this module also implements rich PDF generation with tables, charts, font registration, and layout logic. While useful, full document publishing is not an obvious requirement of risk-parity computation itself and is not clearly justified by the manifest text.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

The manifest describes calculating ETF allocation weights and return/risk metrics, but this file also creates an output directory and saves persistent CSV and PDF reports. Local report generation is additional behavior beyond pure calculation, and the description does not mention file output.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.