Back to skill

Security audit

Simmer Calibration Report

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly performs the advertised local trading-journal analysis, but it asks for an unnecessary trading API key and can read live journal data unexpectedly, so it needs review before installation.

Install only after you are comfortable giving this scheduled report access to local trading journals and a SIMMER_API_KEY. Prefer setting CALIB_JOURNAL_PATH explicitly, avoid providing live credentials unless the skill is revised to need them, and use a pinned trusted simmer-sdk version.

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
calibration_report.py:27
Finding
Unpinned Third-Party Dependency Executes in a Runtime Containing a Trading API Key<![CDATA[ ## Vulnerability Details **File Location**: `calibration_report.py:27-38` **Additional Locations**: `clawhub.json:3-6`, `SKILL.md:18-26`, `README.md:41-45` **Vulnerability Type**: Unpinned third-party dependency and unnecessary credential exposure **Risk Level**: Medium ### Vulnerable Code `calibration_report.py:27-38`: ```python from simmer_sdk.skill import load_config, update_config, get_config_path SKILL_SLUG = "simmer-calibration-report" TRADE_SOURCE = "sdk:calibration-report" CONFIG_SCHEMA = { "journal_path": {"env": "CALIB_JOURNAL_PATH", "default": "", "type": str}, "min_trades": {"env": "CALIB_MIN_TRADES", "default": 10, "type": int}, "lookback_days": {"env": "CALIB_LOOKBACK_DAYS", "default": 30, "type": int}, "include_unresolved": {"env": "CALIB_INCLUDE_UNRESOLVED", "default": "false", "type": str}, } _config = load_config(CONFIG_SCHEMA, __file__, slug=SKILL_SLUG) ``` `clawhub.json:3-6`: ```json "requires": { "env": ["SIMMER_API_KEY"], "pip": ["simmer-sdk"] }, ``` `SKILL.md:18-26`: ```markdown 1. Install dependencies: ```bash pip install simmer-sdk ``` 2. Set your API key: ```bash export SIMMER_API_KEY=your_key_here ``` ``` `README.md:41-45`: ```markdown ## Quick Start 1. **Install:** `pip install simmer-sdk` 2. **Set key:** `export SIMMER_API_KEY=your_key_here` 3. **Run:** `python calibration_report.py --live` ``` ### Technical Analysis The project installs `simmer-sdk` without an exact version constraint, lock file, or integrity hash. The package is then imported at module scope, and its `load_config` function is executed immediately when `calibration_report.py` is loaded. Python dependencies can execute arbitrary code during module import. Therefore, any compromised, replaced, or unexpectedly modified version selected by `pip install simmer-sdk` runs with the permissions and environment of the report process. The runtime manifest and documentation also require users to place `SIMMER_A ...[truncated 2364 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Pin an audited dependency version** - Replace the unconstrained package declaration with an exact, reviewed version. - Use a lock file generated from a trusted environment. 2. **Verify package integrity** - Record approved wheel hashes. - Install with hash enforcement, for example through a requirements file and `pip install --require-hashes -r requirements.txt`. - Prefer an internally mirrored or otherwise provenance-verified package source for managed deployments. 3. **Remove the unnecessary API-key requirement** - Remove `SIMMER_API_KEY` from `clawhub.json` if the report only performs local journal analysis. - Remove the API-key setup instructions from `README.md` and `SKILL.md`. - Delete the unused `get_client` function and associated client initialization code unless a future, documented feature genuinely requires it. 4. **Apply least privilege** - Run scheduled reports under a dedicated account with read-only access to the required journal. - Provide only the environment variables needed for local report generation. - Restrict outbound network access if the reporting workflow does not require networking. 5. **Reduce import-time execution** - Avoid invoking third-party package functions at module import time where practical. - Load the dependency only in the narrow execution path that needs it and handle configuration locally if the SDK is unnecessary. 6. **Add supply-chain controls** - Scan pinned dependencies for known vulnerabilities. - Review dependency updates before deployment. - Regenerate hashes only after validating the new package artifacts and behavior. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (5)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
A description-behavior mismatch is dangerous because users may trust the skill to perform financial analysis when it reportedly only inspects status/configuration and does not compute the promised calibration metrics. In a trading-journal context, this can lead to incorrect decisions, false assurance, and misuse of API keys or local data under misleading pretenses, even if there is no overtly malicious payload.

Lp3

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding
Without declared permissions the skill's intent is opaque and cannot be validated.

Description-Behavior Mismatch

Medium
Confidence
96% confidence
Finding
The journal discovery logic for non-live mode explicitly appends the live journal path as a fallback, causing a supposedly sim-focused analytics skill to read real trading history without an explicit user opt-in. This creates a data-scope violation and can expose or process sensitive live trading activity unexpectedly, especially in automated or shared environments.

Missing User Warnings

Low
Confidence
84% confidence
Finding
The markdown explicitly tells users to set `SIMMER_API_KEY`, which is a sensitive credential, but provides no warning about keeping it secret or avoiding shell history/shared environments. For markdown files, SQP-2 applies when descriptions omit warnings about behaviors that could affect privacy or system integrity.

Context-Inappropriate Capability

Low
Confidence
88% confidence
Finding
The skill's stated purpose is local calibration reporting over trade journals, but the file includes a `SimmerClient` initializer that reads API credentials and configures a live/sim trading venue. That capability is not used anywhere in the reporting flow and is not justified by the manifest's analytics-only purpose. Even unused, retaining trading-client setup expands the code's apparent authority and intent surface.

Static analysis

No suspicious patterns detected.