Back to skill

Security audit

Options Spread Conviction Engine

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent options-analysis skill, but it needs Review because it gives trading-style recommendations while using under-disclosed mock/fallback logic and avoidable setup/cache security risks.

Review before installing. Do not treat its EXECUTE or sizing outputs as financial advice, avoid running the documented sudo symlink command, prefer a reviewed lockfile or pinned dependencies, and clear or migrate any existing .pkl option-cache files before use.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (3)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/chain_analyzer.py:75
Finding
Unsafe Deserialization of Local Option-Chain Cache Files<![CDATA[ ## Vulnerability Details **File Location**: `scripts/chain_analyzer.py:75-105` **Vulnerability Type**: Unsafe Python pickle deserialization **Risk Level**: Medium ### Vulnerable Code ```python def _get_cache_path(self, cache_key: str) -> str: """Get cache file path""" return os.path.join(self.cache_dir, f"{cache_key}.pkl") def _load_from_cache(self, cache_key: str) -> Optional[Dict]: """Load data from cache if valid""" cache_path = self._get_cache_path(cache_key) if not os.path.exists(cache_path): return None try: with open(cache_path, 'rb') as f: cached = pickle.load(f) # Check TTL if time.time() - cached.get('timestamp', 0) > self.cache_ttl: return None return cached.get('data') except (FileNotFoundError, PermissionError, pickle.PickleError, IOError): return None def _save_to_cache(self, cache_key: str, data: Dict): """Save data to cache""" cache_path = self._get_cache_path(cache_key) try: with open(cache_path, 'wb') as f: pickle.dump({'timestamp': time.time(), 'data': data}, f) except (FileNotFoundError, PermissionError, pickle.PickleError, IOError) as e: logger.warning(f"Failed to save cache: {e}") ``` ### Technical Analysis Python pickle is an executable serialization format. During `pickle.load()`, serialized reduction instructions can import modules and invoke arbitrary callables. Consequently, validity checks performed after deserialization, including the cache timestamp check, cannot protect against a malicious payload because code execution occurs while the file is being loaded. The cache is persistent under `~/.openclaw/options_cache` by default, and cache filenames are derived from ticker-based cache keys. `ChainFetcher` does not independently validate those keys before constructing paths. Although `quant_scanner.py` validates tickers in one CLI path, `ChainFetch ...[truncated 1563 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace pickle with a non-executable format such as JSON. 2. Define an explicit cache schema and validate every field after parsing, including timestamps, ticker symbols, expiration dates, and numeric option data. 3. Restrict cache keys to a strict allowlist, such as uppercase letters, digits, periods, and hyphens. 4. Resolve the resulting path and verify that it remains beneath the intended cache directory. 5. Create the cache directory with mode `0700` and cache files with mode `0600`. 6. Write cache entries atomically by creating a restrictive temporary file in the same directory and then using `os.replace()`. 7. If integrity against local modification is required, authenticate entries with a key stored separately from the cache. Authentication must occur before any complex deserialization. 8. Delete existing `.pkl` cache entries during migration so legacy malicious files cannot remain reachable. ]]>

T08 · Insecure Dependencies

Warning
Location
scripts/setup-venv.sh:28
Finding
Unpinned Dependencies Are Downloaded and Executed During Automatic Setup<![CDATA[ ## Vulnerability Details **File Location**: `scripts/setup-venv.sh:28-42` **Vulnerability Type**: Unpinned third-party dependency installation **Risk Level**: Medium ### Vulnerable Code ```bash # Upgrade pip first pip install --upgrade pip setuptools wheel # Install numpy first (required by pandas_ta) echo "Installing numpy..." pip install numpy # Install pandas and yfinance echo "Installing pandas and yfinance..." pip install pandas yfinance # Install pandas_ta without numba (Python 3.14+ compatibility) echo "Installing pandas_ta (pure Python mode, numba not available for Python 3.14)..." NUMBA_DISABLE_JIT=1 pip install pandas_ta --no-deps pip install scipy tqdm # Required dependencies ``` ### Technical Analysis The Skill's installation hook runs this script automatically, but the script installs packages without exact versions or cryptographic hashes. It also upgrades `pip`, `setuptools`, and `wheel` to whatever versions are current at installation time. This makes the installed code materially different depending on when the Skill is installed. Python packages may execute build backends or installation-related code, and all installed packages execute later when imported by the Skill. A compromised package release, maintainer account, package index, or dependency resolution path could therefore introduce code that was not present during this audit. The virtual environment limits dependency conflicts but does not sandbox package installation or execution from the user's files and network resources. ### Attack Path 1. An attacker compromises an upstream package, maintainer account, release process, or package distribution channel used by one of the unpinned dependencies. 2. The attacker publishes a version that satisfies the unconstrained package request. 3. A user installs or reinstalls the Skill. 4. The automatic setup hook executes `setup-venv.sh`. 5. `pip` resolves and downloads the attacker-controlled current release. 6. Malicious bu ...[truncated 611 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Maintain a reviewed lockfile containing exact versions for all direct and transitive dependencies. 2. Require hashes during installation, for example through a generated requirements file and `pip install --require-hashes`. 3. Pin `pip`, `setuptools`, and `wheel` instead of automatically upgrading them to the latest versions. 4. Build and test dependency updates through a controlled review process before changing the lockfile. 5. Prefer prebuilt, verified wheels where practical and avoid unexpected source builds. 6. Configure the package index explicitly and use trusted HTTPS endpoints. 7. Generate a software bill of materials and run dependency vulnerability scanning in CI. 8. Keep installation inside the dedicated virtual environment, but do not treat the virtual environment as a security sandbox. ]]>

T05 · Unauthorized Access and Privilege Escalation

Note
Location
SKILL.md:24
Finding
Documentation Requests an Unnecessary Privileged System-Wide Tool Symlink<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:24-27` **Vulnerability Type**: Unnecessary privileged system modification **Risk Level**: Low ### Vulnerable Code ```bash brew install jq npm install yahoo-finance2 sudo ln -s /opt/homebrew/bin/yahoo-finance /usr/local/bin/yf ``` ### Technical Analysis The installation instructions ask the user to invoke `sudo` to create a system-wide executable alias in `/usr/local/bin`. The reviewed implementation uses the Python `yfinance` module directly and does not invoke the `yf` executable. The npm CLI and privileged symlink therefore are not required for the declared Python analysis pipeline. Creating an executable in a global command-search directory crosses the least-privilege boundary of an isolated Skill installation. It also creates a durable tool-resolution change outside the Skill's virtual environment. If the symlink source is later replaced or controlled by another package, users or scripts invoking `yf` may execute unexpected code while believing they are calling a trusted finance utility. This is a documented user command rather than silent automatic escalation, and there is no evidence that the current symlink target is malicious. The finding concerns unnecessary privilege and system scope. ### Attack Path 1. A user follows the installation instructions and authorizes the `sudo ln -s` command. 2. A global `/usr/local/bin/yf` command is created, pointing outside the Skill's isolated environment. 3. The symlink target is subsequently replaced, modified, or supplied by a compromised package installation. 4. The user or another process invokes `yf`, relying on the trusted-looking global command name. 5. The modified target executes with the invoking user's privileges. ### Impact Assessment The immediate command modifies a privileged system-wide executable path and affects users and processes beyond the Skill. A compromised target would execute with the privileges of whichever user later ...[truncated 263 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the npm installation and `sudo ln -s` instructions unless the project adds a documented feature that actually requires that CLI. 2. Keep all required commands and packages inside the Skill's isolated virtual environment. 3. If a command wrapper is needed, place it in the virtual environment's `bin` directory or invoke it through an explicit project-relative path. 4. Do not modify `/usr/local/bin` as part of Skill setup. 5. Clearly document the external network dependency on Yahoo Finance without requiring unrelated global tools. 6. Ensure installation documentation matches the implementation so users are not asked to grant privileges that the Skill does not need. ]]>
Vulnerability Patterns
  • 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
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (66)

Intent-Code Divergence

High
Confidence
97% confidence
Finding
The manifest says the skill features 'drawdown-constrained Kelly position sizing,' indicating position sizing is a core advertised capability. This report explicitly states 'No Position Sizing,' which directly contradicts the declared intent and would mislead users about what the skill does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
This finding states that the reviewed content shows no support for the broad strategy and indicator analysis advertised. In a financial skill, such overstatement is materially dangerous because it can mislead users into thinking due diligence, scoring, and validation are more robust than they are.

Intent-Code Divergence

High
Confidence
99% confidence
Finding
The validator advertises historical walk-forward validation, but when the engine lacks historical support it silently falls back to current analysis plus random variation, and finally to fully random scores. That can produce fabricated evidence of predictive power and mislead users into deploying or sizing live trading strategies based on invalid backtest results, which is especially dangerous in a financial decision-support skill.

Skill Enumeration

Medium
Category
Agent Snooping
Content
- Updated argument parser with all 7 strategies
   - Enhanced `--help` output with strategy categorization

2. **`/home/linuxbrew/.openclaw/workspace/skills/options-spread-conviction-engine/SKILL.md`**
   - Updated version to 2.0.0
   - Added documentation for all three multi-leg strategies
   - Documented scoring weights for each strategy
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Intent-Code Divergence

Medium
Confidence
94% confidence
Finding
The report defines the calendar setup as favorable when front-month IV exceeds back-month IV, which is a backwardation/inverted term structure condition. However, the example text calls this both an 'INVERTED TERM STRUCTURE' and a 'theta crush advantage,' conflating inversion with a normal calendar rationale and creating contradictory intent-level guidance within the documentation.

Static analysis

No suspicious patterns detected.