Back to skill

Security audit

Economic Calendar

Security checks for vulnerabilities and agentic risk

Overview

This skill appears to be a straightforward economic-calendar scraper with ordinary dependency and accuracy cautions, not hidden or abusive behavior.

Install and run this in a normal isolated Python environment. Expect it to contact Investing.com and create calendar JSON files unless stdout or none is selected. For stronger hygiene, pin dependencies, add lxml to requirements.txt, remove unused pytz, and verify the timezone conversion before relying on event times.

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

Mutable and Unverified Third-Party Dependencies

Content
View full analysis

Vulnerability Details

File Location: requirements.txt:1-3
Vulnerability Type: Unpinned dependencies without integrity verification
Risk Level: Medium

Vulnerable Code

text
requests>=2.28.0
beautifulsoup4>=4.11.0
pytz>=2022.1

The installation instructions in SKILL.md also recommend installing unconstrained packages directly:

bash
pip install requests beautifulsoup4 lxml

Technical Analysis

The dependency specifications use lower-bound constraints rather than exact, audited versions. Consequently, every installation may resolve to different future releases. The project also provides no lock file or package hashes with which to verify the integrity of downloaded artifacts.

This does not establish that any current dependency is malicious. However, it leaves the installation process exposed to upstream package compromise, compromised package-index accounts, malicious future releases, or index substitution in an improperly configured environment. Python packages may execute build backend or installation logic during installation and arbitrary code when imported.

Dependency declarations are also inconsistent: the script uses the lxml Beautiful Soup parser and SKILL.md tells users to install lxml, but requirements.txt omits it. Conversely, pytz is declared but is not imported by the reviewed script. This inconsistency undermines reproducibility and can cause users to install dependencies through undocumented or unverified paths.

Attack Path

  1. An attacker compromises an upstream dependency release, its package-index publishing account, or a package source trusted by the installation environment.
  2. The attacker publishes a malicious version satisfying one of the open constraints, such as a version greater than or equal to the stated minimum.
  3. A user follows the documented installation command or installs from requirements.txt.
  4. The package resolver s ...[truncated 1011 chars]
Remediation
View remediation

Remediation Suggestions

  1. Replace lower-bound constraints with exact versions that have been reviewed and tested:
    text
    requests==<audited-version>
    beautifulsoup4==<audited-version>
    lxml==<audited-version>
    
  2. Remove pytz if it remains unused, or document and pin it if it is genuinely required.
  3. Add lxml explicitly to the authoritative dependency manifest because the script invokes Beautiful Soup with the lxml parser.
  4. Generate a reproducible lock file containing all transitive dependencies.
  5. Record cryptographic hashes for every resolved distribution and enforce them during installation, for example:
    bash
    python -m pip install --require-hashes -r requirements.txt
    
  6. Install only from a trusted package index over TLS, disable unapproved supplemental indexes, and review package provenance before updates.
  7. Run dependency installation and the Skill in an isolated, least-privileged virtual environment or container.
  8. Add automated dependency vulnerability and provenance scanning to the update process, and regenerate locks and hashes only after reviewing new releases.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The comment says the code converts US event times to Berlin time when fetching US events, implying a correct timezone-aware conversion. In reality, it applies a hard-coded +6 hour adjustment to any parsed HH:MM string for US-country queries when the requested timezone is GMT +1 or GMT +2, regardless of the actual source timezone semantics and without DST/date rollover handling beyond wrapping 24 hours.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
97% confidence
Finding

The dependency is specified with a minimum version bound only, which allows future unreviewed versions to be installed. This weakens build reproducibility and can expose the skill to newly introduced vulnerable or incompatible releases through the supply chain.

Content

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

text
requests>=2.28.0
beautifulsoup4>=4.11.0
pytz>=2022.1

Unverifiable Dependency: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +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

The manifest leaves the installed requests version unverifiable while the package has multiple known advisories across releases. Because only a lower bound is set, environments may install a vulnerable version, including one affected by credential leakage or TLS/verification-related flaws depending on resolver behavior and deployment context.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

Using an unpinned beautifulsoup4 version permits installation of any newer release that satisfies the lower bound, making builds non-deterministic. This increases supply-chain risk and may unexpectedly pull in insecure or breaking versions.

Content

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

text
requests>=2.28.0
beautifulsoup4>=4.11.0
pytz>=2022.1

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

The pytz requirement is not pinned to a single exact version, so installations may resolve to different releases over time. While not directly exploitable by itself, this creates avoidable supply-chain and reproducibility risk.

Content

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

text
requests>=2.28.0
beautifulsoup4>=4.11.0
pytz>=2022.1

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code performs outbound HTTP requests to Investing.com and sends user-selected filters such as countries, timezone, date range, and language. While the script description says it fetches data from Investing.com, there is no explicit warning or disclosure near the request path that user inputs are being transmitted to a third-party service.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.