Back to skill

Security audit

Event Countdown Pro

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed stock-event reminder, but it needs review because it creates persistent daily reminders that run command templates built from loosely validated stock and event text.

Review this skill before installing. It appears intended to create stock-event countdown reminders, not to steal data or damage files, but it persists daily jobs that can run other skills and contains command text assembled from ticker/company/event values. Prefer a version that pins dependencies, validates ticker and event fields, uses structured reminder APIs instead of shell command templates, and clearly confirms the delivery target and schedule.

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

Unpinned Third-Party Dependency Is Automatically Downloaded and Executed

Content
View full analysis
=3.12" # dependencies = [ # "yfinance", # ] # /// ``` The documented execution model confirms that `uv` automatically installs this dependency: ```markdown - `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 dependency declaration does not specify an exact `yfinance` version, integrity hash, or reviewed lockfile. Consequently, `uv run` may resolve and download a different package release in the future from an external package repository. Although using `yfinance` is consistent with the Skill's declared financial-data functionality, automatically downloading an unpinned dependency means the code ultimately executed can change after the Skill has been audited. Environment isolation does not prevent a malicious dependency from reading data or using the network under the permissions granted to the Python process. No evidence indicates that the currently intended `yfinance` package is malicious. The vulnerability is the mutable and insufficiently controlled dependency resolution process. ### Attack Path 1. An attacker compromises the upstream package, its maintainer account, the package repository, or another relevant supply-chain component. 2. A malicious release is published under a version that satisfies the unconstrained `yfinance` requirement. 3. A user or Agent runs the documented `uv run .../src/main.py ` command in an environment without a previously locked resolution. 4. `uv` resolves and downloads the malicious release. 5. Python imports `yfinance` in `src/service.py`, causing package initialization code to execute. 6. The malicious dependency receives the pri ...[truncated 616 chars]
Remediation
View remediation
", # ] ``` 2. Generate and commit a dependency lockfile that records all transitive dependency versions. 3. Use package hash verification where supported so modified artifacts are rejected. 4. Resolve dependencies during a controlled installation or build phase rather than automatically during each Skill invocation. 5. Review dependency updates before changing the pinned version or lockfile. 6. Run the Skill in a sandbox with restricted filesystem access, no unnecessary environment variables, and network access limited to the financial-data endpoints required for its function. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:193
Finding

User-Influenced Values Are Interpolated into Persisted Shell Command Templates

Content
View full analysis
Countdown - Daily " \ "📊 () Countdown. Event date: .\n\nIf today is on or after :\n1. Say '🔔 () — is 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 event-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 ' Countdown - Daily '\n\nIf today is before :\n1. Compute days_remaining = days between today and \n2. Say '🔔 () — 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 executable entry point does not enforce an allowed ticker format: ```python def main(): """Entry point - expects a stock ticker symbol as the first CLI argument.""" if len(sys.argv) < 2: print("Usage: event-countdown-pro ") sys.exit(1) symbol = sys.argv[1].upper() result = get_next_earnings_date(symbol) print(format_output(result)) ``` ### Technical Analysis The Skill directs the Agent to build a shell command by substituting ticker, ...[truncated 2639 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (8)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description promises a fairly broad automation workflow: identify a company/ticker, discover the next significant corporate event across several categories and data sources, then schedule a recurring reminder that runs additional tools. The supplied code chunk does none of that. It simply reads a ticker from the command line, retrieves the next earnings date via a helper, and prints the result. This is a materially narrower and different behavior than the declared purpose, so it should be flagged as a mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description promises a full workflow for identifying many kinds of upcoming corporate events and setting up daily countdown reminders tied to them. The supplied code implements only a small subset: retrieving an upcoming earnings date from Yahoo Finance for an already-supplied ticker symbol and formatting the result. This is a material description-to-behavior mismatch because the primary purpose in the description is reminder setup and broad event discovery, while the actual code is a narrow earnings-date lookup utility.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description promises a full workflow for discovering significant stock-related events and scheduling recurring reminders. The actual code chunk contains only a helper function for formatting dates. While such a utility could support a larger implementation, this chunk by itself does not implement or evidence the core declared capabilities, making the behavior materially different from the described purpose.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The implementation only accepts a ticker symbol, fetches a next earnings date, and prints it, while the skill metadata promises broader event discovery and automated daily reminder setup. This mismatch is security-relevant because users or downstream agents may rely on the manifest to grant permissions or trigger workflows that the code does not actually implement, creating deceptive capability claims and unsafe automation assumptions.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The markdown specifies a default reminder time of '10 AM CET (Europe/Paris)' for users who do not provide a time or timezone. This imposes a specific locale/timezone choice by default rather than offering a neutral default or requiring user confirmation, which is a natural-language locale policy issue.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
84% confidence
Finding

The instruction to auto-detect channel, chatId, and timezone from session context and 'never ask the user' encourages autonomous use of contextual identifiers without explicit confirmation. In a scheduling skill that creates recurring reminders and invokes other tools, this can cause actions to be delivered to the wrong destination or executed with incorrect assumptions, especially if session context is stale, ambiguous, or attacker-influenced.

Content

Scanner excerpt · SKILL.md (reported line 381)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 — this applies to all event types.
- The cron auto-cancels on the event day after delivering the final briefing.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The docstring and function framing describe a narrow 'Earnings Countdown' CLI fetcher, which contradicts the manifest's claims of a generalized event reminder orchestration skill. In an agent ecosystem, inconsistent in-code and manifest behavior can mislead reviewers, routing logic, and users, increasing the chance of incorrect trust decisions or failed automations around sensitive financial workflows.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The implementation only retrieves earnings dates from Yahoo Finance, but the skill metadata claims it can discover and schedule reminders for a wide range of price-moving corporate events. This mismatch can mislead users into relying on incomplete or incorrect event coverage, causing missed alerts for AGMs, product launches, FDA decisions, dividend dates, or investor days. In a financial decision-support context, that gap materially increases the risk of user harm from false assumptions about monitoring coverage.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.