Back to skill

Security audit

Earnings and Financial Release Countdown

Security checks for vulnerabilities and agentic risk

Overview

The skill is a disclosed earnings-reminder automation, but its instructions create persistent reminders using shell-style command templates with unvalidated stock and company values.

Install only if you trust this skill to create recurring reminders in your chat and run stock-related tools daily. Before using it, validate ticker symbols, confirm the exact destination and timezone, and prefer structured subprocess arguments or a safer reminder API instead of pasted shell command templates.

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
src/main.py:3
Finding

Runtime Installation of an Unpinned Third-Party Dependency

Content
View full analysis
=3.12" # dependencies = [ # "yfinance", # ] # /// ``` The documented execution procedure in `SKILL.md:269` states that `uv run` automatically installs this dependency: ```text uv run reads the inline `# /// script` dependency block in `main.py` and auto-installs `yfinance` in an isolated environment — no pip install or venv setup needed. ``` ### Technical Analysis The `yfinance` dependency has no exact version constraint or integrity hash. When the Skill is invoked through `uv run`, dependency resolution may retrieve and execute whichever package version currently satisfies the unconstrained requirement. This behavior makes execution non-reproducible and expands the trust boundary from the audited source code to future releases of the dependency and its transitive dependencies. Network access to a financial-data service is necessary for the declared functionality, but dynamically resolving an unpinned package is not the minimum privilege or trust exposure necessary to perform that function. An isolated Python environment limits package collisions but does not sandbox package code. Imported dependency code executes with the filesystem, environment, network, and process privileges of the user running the Skill. ### Attack Path 1. An attacker compromises the upstream `yfinance` distribution account, package repository, release process, or a transitive dependency. 2. A malicious release is published under a version accepted by the unconstrained dependency declaration. 3. A user invokes the documented `uv run .../src/main.py` command. 4. `uv` resolves and installs the malicious or compromised release. 5. Python imports `yfinance` from `service.py`, executing attacker-controlled package initialization code. 6. The maliciou ...[truncated 693 chars]
Remediation
View remediation
", # ] ``` 2. Generate and commit a lock file that records exact versions of all transitive dependencies. 3. Enforce package integrity using repository-supported hashes or a hash-locked requirements file. 4. Resolve and review dependency updates as an explicit maintenance operation rather than automatically accepting new releases at execution time. 5. Where possible, install dependencies during a controlled build stage and run the Skill with network and filesystem permissions limited to those required for retrieving public financial data. 6. Add automated software-composition analysis and vulnerability scanning for direct and transitive dependencies. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:133
Finding

Shell Command Injection Risk Through Unvalidated Ticker Interpolation

Content
View full analysis
Earnings Countdown - Daily " \ "📊 () Earnings Countdown. Next earnings date: .\n\nIf today is on or after :\n1. Say '🔔 () earnings are TODAY! 🎯'\n2. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py \n3. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py \n4. Send a comprehensive earnings-day briefing with price, fundamentals, and a quick take.\n5. Cancel this reminder by running: uv run /root/.openclaw/workspace/skills/remind-me/src/main.py cancel name ' Earnings Countdown - Daily '\n\nIf today is before :\n1. Compute days_remaining = days between today and \n2. Say '🔔 () earnings in {days_remaining} days — briefing below.'\n3. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py \n4. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py \n5. Send a daily countdown briefing summarizing price, key fundamentals, and recent company news." \ "cron: * * *" \ "" \ "" \ "tz:" ``` The CLI entry point only uppercases its argument and does not enforce a ticker grammar: ```python symbol = sys.argv[1].upper() result = get_next_earnings_date(symbol) ``` ### Technical Analysis The Skill instructs the Agent to substitute a ticker, company name, date, channel, chat ID, and timezone into a shell command. No mandatory validation or shell-safe argument serialization is specified. Uppercasing the ticker does not remove shell metacharacter ...[truncated 2309 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 Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (7)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description centers on reminder setup and automation, but the provided code only retrieves and prints the next earnings date for a supplied ticker. The primary purpose is materially different: informational lookup versus scheduling recurring reminders. Several declared capabilities are absent from the code, including company-name resolution, reminder creation, daily execution, and integration with other skills.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents an automation/reminder orchestration skill, but the supplied code is a simple earnings-date lookup utility. Its primary behavior is limited to calling yfinance for ticker info and earnings calendar data, then returning a formatted response. This is a material mismatch because the core promised capabilities—countdown reminders, scheduling, trigger handling, and multi-skill execution—are absent.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description promises a stock earnings reminder workflow involving ticker resolution, earnings-date retrieval, and reminder scheduling. The supplied code chunk does none of these things; it only normalizes dates into ISO string format. While date formatting could be a supporting helper in such a skill, this code chunk by itself does not substantively implement the declared functionality. Therefore the description does not accurately represent what this supplied code chunk actually does.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The trigger phrases are broad enough to match ordinary reminder requests, which can cause the skill to activate in situations the user did not specifically intend. Because the skill can create recurring reminders and invoke other skills, over-broad activation increases the chance of unintended persistence, noisy automation, or unexpected disclosure of stock-related outputs into a chat channel.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Imposing a default timezone/locale without explicit opt-in can cause reminders to be scheduled at the wrong local time, especially for users outside Europe/Paris. In a scheduling skill, this context makes the issue more relevant because incorrect defaults can silently create persistent automations that the user did not mean to authorize at that hour.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
88% confidence
Finding

The instruction to auto-detect channel, chatId, and timezone and 'never ask the user' encourages autonomous execution of a persistent action using contextual identifiers the user may not have explicitly confirmed. In this skill's context, that is risky because it can create recurring notifications in the wrong destination or with incorrect timezone assumptions, and the reminder message itself instructs later agents to run additional tools and cancel reminders autonomously.

Content

Scanner excerpt · SKILL.md (reported line 270)May include surrounding context.

md
- `uv run` reads the inline `# /// script` dependency block in `main.py` and auto-installs `yfinance` in an isolated environment — no pip install or venv setup needed.
- Company name → ticker resolution is done by the LLM agent, following the same pattern as `stock-price-checker-pro`.
- Channel, chatId, and timezone are always auto-detected from session context — never ask the user for these.
- Timezone resolution follows `remind-me`'s 3-tier system (message → USER.md → ask user).
- The daily cron message tells the agent to run `stock-price-checker-pro` and `stock-fundamentals` and synthesize a briefing.
- The cron auto-cancels on earnings day after delivering the final briefing.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

This function instantiates a yfinance ticker object and reads remote data via ticker.info and ticker.calendar, which implies outbound network access to a third-party service. The code includes no confirmation prompt, print/log disclosure, or warning comment/docstring indicating that user-provided stock symbols will be sent to Yahoo Finance.

Content

No source excerpt is available for this finding.