Back to skill

Security audit

Simmer Weather Trader

Security checks for vulnerabilities and agentic risk

Overview

This skill is a trading bot whose documented safety controls do not match the code, and its Telegram interface can expose account data and trigger trades without authorization checks.

Review this carefully before installing. Do not run it with valuable Simmer credentials or a discoverable Telegram bot until it has Telegram user allowlisting, a real default dry-run/live-trading gate, local confirmation and limits, fixed consensus checks, safer browser isolation, and pinned dependencies.

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 (5)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
simmer_weather_bot/telegram_ui.py:72
Finding

Unauthenticated Telegram users can inspect account information and initiate trades

Content
View full analysis
None: await update.message.reply_text("⏳ Fetching agent status...") try: agent = await get_agent_info() positions = await get_positions() balance = agent.get("balance", "N/A") agent_id = agent.get("agent_id", agent.get("id", "N/A")) msg = "📊 *Agent Status*\n\n" msg += f"🆔 Agent ID: `{agent_id}`\n" msg += f"💰 Balance: `{balance}`\n" msg += f"🏦 Venue: `{SIMMER_VENUE}`\n\n" ``` The prediction callback can proceed directly to transaction execution: ```python try: trade_result = await execute_trade( market_id=market["id"], reasoning=reasoning, ) except Exception as e: await query.message.reply_text( f"⚠️ *TRADE FAILED — API error during execution*\n\n" f"📍 Market: {question[:80]}\n\n" f"Conditions were met (confidence=100%, AI=TRADE) but the trade API failed:\n" f"`{str(e)[:300]}`\n\n" f"No trade was placed.", parse_mode=ParseMode.MARKDOWN ) return ``` ### Technical Analysis The bot registers globally accessible Telegram command and callback handlers but performs no authorization check based on `update.effective_user.id`, `update.effective_chat.id`, chat type, ...[truncated 1634 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
simmer_weather_bot/main.py:25
Finding

Documented dry-run safety control is absent from the implementation

Content
View full analysis
dict: """Executes a YES trade on the given market via Simmer SDK endpoint.""" from config import TRADE_AMOUNT url = f"{SIMMER_BASE_URL}/api/sdk/trade" payload = { "market_id": market_id, "side": "yes", "amount": TRADE_AMOUNT, "venue": SIMMER_VENUE, "reasoning": reasoning, "source": "sdk:weather-bot", } logger.info(f"Simmer: executing trade on market {market_id} venue={SIMMER_VENU ...[truncated 1901 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
simmer_weather_bot/strategy.py:62
Finding

Mandatory Simmer edge recommendation can be bypassed by confidence-score override

Content
View full analysis
24h: +0") pre_ai_score = score breakdown.append(f"Pre-FourcastNet score: {pre_ai_score}") fc_verdict = ai_result.get("verdict") == "TRADE" fc_ins ...[truncated 2456 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
simmer_weather_bot/wunderground.py:33
Finding

Remote Wunderground content is processed with the Chromium sandbox disabled

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
clawhub.json:3
Finding

Managed installation uses unnecessary and unpinned third-party dependencies

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (30)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

An undeclared Telegram UI plus access to account status, balances, or open positions creates a broader operational and privacy footprint than the metadata suggests. Mislabeling the skill as Simmer/Polymarket when behavior appears Simmer-specific also misleads users about where orders and data may flow, which is especially risky in trading automation.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

An undeclared Telegram UI plus access to account status, balances, or open positions creates a broader operational and privacy footprint than the metadata suggests. Mislabeling the skill as Simmer/Polymarket when behavior appears Simmer-specific also misleads users about where orders and data may flow, which is especially risky in trading automation.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

An undeclared Telegram UI plus access to account status, balances, or open positions creates a broader operational and privacy footprint than the metadata suggests. Mislabeling the skill as Simmer/Polymarket when behavior appears Simmer-specific also misleads users about where orders and data may flow, which is especially risky in trading automation.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

An undeclared Telegram UI plus access to account status, balances, or open positions creates a broader operational and privacy footprint than the metadata suggests. Mislabeling the skill as Simmer/Polymarket when behavior appears Simmer-specific also misleads users about where orders and data may flow, which is especially risky in trading automation.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

An undeclared Telegram UI plus access to account status, balances, or open positions creates a broader operational and privacy footprint than the metadata suggests. Mislabeling the skill as Simmer/Polymarket when behavior appears Simmer-specific also misleads users about where orders and data may flow, which is especially risky in trading automation.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

An undeclared Telegram UI plus access to account status, balances, or open positions creates a broader operational and privacy footprint than the metadata suggests. Mislabeling the skill as Simmer/Polymarket when behavior appears Simmer-specific also misleads users about where orders and data may flow, which is especially risky in trading automation.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The docstring states a 4th independent forecast is used for the trading verdict, but the actual agreement logic ignores that source when deciding whether forecasts agree. In a trading skill, this mismatch is dangerous because operators may rely on the documented safety property while the implementation silently trades under weaker conditions than promised.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The code claims trades should occur only when all four forecasts agree within ±1°F, but it computes sources_agree using only the first three sources (spread_3 <= 1) and never enforces agreement with the FourcastNet result. As a result, the bot can execute trades even when the AI forecast materially disagrees, violating the advertised risk control and creating a logic flaw that can lead to systematically bad market decisions.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill declares no explicit tool scope even though it clearly requires environment-variable access and network access. In an agent ecosystem, missing scope declarations can cause the skill to receive broader capabilities than users expect, reducing transparency and increasing the chance of unintended credential exposure or unauthorized external calls.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill facilitates automated market trading and mentions live mode, but lacks a clear, prominent warning about real-money risk and the consequences of enabling live execution. In financial automation, absence of explicit risk disclosure increases the chance of accidental activation, misunderstood losses, and unsafe reliance on a template strategy.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The README advertises an automated bot that can execute prediction-market trades and persist detailed activity logs, but it does not prominently warn users that financial actions may occur automatically or that operational data will be stored on disk. In a remixable skill, this omission increases the chance that users deploy it without understanding trade execution, risk exposure, or log-retention/privacy implications.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill loads TELEGRAM_BOT_TOKEN even though the stated functionality is automated weather-market trading and this file shows no clear need for Telegram access. Unrelated credential collection increases the blast radius if the skill is compromised and is a strong sign of over-privileged design or hidden capability.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · simmer_weather_bot/config.py (reported line 14)May include surrounding context.

python
NVIDIA_API_KEY = os.environ["NVIDIA_API_KEY"]
FOURCASTNET_URL = "https://climate.api.nvidia.com/v1/nvidia/fourcastnet"
FOURCASTNET_POLL_URL = "https://api.nvcf.nvidia.com/v2/nvcf/pexec/status"
FOURCASTNET_POLL_SECONDS = 5

NOAA_API_BASE = os.environ.get("NOAA_API_BASE", "https://api.weather.gov")

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · simmer_weather_bot/config.py (reported line 18)May include surrounding context.

python
FOURCASTNET_POLL_SECONDS = 5

NOAA_API_BASE = os.environ.get("NOAA_API_BASE", "https://api.weather.gov")
OPEN_METEO_API = os.environ.get("OPEN_METEO_API", "https://api.open-meteo.com/v1/forecast")
WUNDERGROUND_BASE = os.environ.get("WUNDERGROUND_BASE", "https://www.wunderground.com/forecast/us")

TRADE_AMOUNT = float(os.environ.get("TRADE_AMOUNT", "10.0"))

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The health check performs a real POST request to the FourcastNet endpoint with an inference payload, which can enqueue or even complete an actual job during startup. That means routine service initialization can consume paid API quota, trigger unintended external compute actions, and create cost or rate-limit side effects contrary to the stated purpose of a lightweight validation.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The docstring says the function only validates the API key and does not wait for completion, but the implementation submits a real inference request and explicitly treats HTTP 200 as an immediate completed job. This mismatch is dangerous because operators may enable or repeatedly run the check believing it is harmless, when it can perform real work against a paid third-party service.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The manifest focuses on automated trading logic based on agreement across four weather sources for Simmer/Polymarket. In contrast, this file initializes Telegram bot handlers and polls Telegram for updates, which is a separate user-interaction capability not mentioned in the stated skill description.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

A Telegram bot introduces a chat-based remote interaction surface that is not an obvious requirement of cross-referencing weather forecasts and executing trades. The manifest does not mention messaging, bot administration, or remote user control, so this capability exceeds what the stated purpose justifies.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: python-dotenv==1.0.1 — 2 advisory(ies): CVE-2026-28684 (python-dotenv: Symlink following in set_key allows arbitrary file overwrite via ); CVE-2026-28684 (python-dotenv reads key-value pairs from a .env file and can set them as environ)

Medium
Category
Supply Chain
Confidence
93% confidence
Finding

The requirement pins python-dotenv to version 1.0.1, which is reported as vulnerable to CVE-2026-28684 involving unsafe symlink handling in set_key that can lead to arbitrary file overwrite. Even though a requirements file alone does not prove the vulnerable API is used, pinning a known vulnerable version is a real supply-chain weakness because downstream code may invoke the affected functionality during runtime or maintenance operations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

execute_trade() forwards the reasoning string directly to the remote trading API, and that value may contain user-provided or model-generated sensitive content such as prompts, strategy details, credentials, or private context. In an agent setting, this is risky because trade rationale can unintentionally become a covert data exfiltration channel to an external service unrelated to the minimum data needed to place the trade.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The full trade API response is logged verbatim, which can expose sensitive account, order, position, or identifier data into logs that may have broader retention and access than the live application. In an automated trading skill, this becomes more dangerous because logs are often centralized and can leak financial activity or tokens returned by upstream services.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The manifest describes an automated weather prediction market trading skill centered on cross-referencing four weather sources and trading when forecasts agree. In addition to market lookup and trade placement, this file also retrieves account positions, agent profile/balance data, and full agent briefings, which are broader account-management capabilities not mentioned in the stated skill description.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

Fetching a full agent briefing goes beyond the manifest's stated purpose of comparing weather forecasts and trading weather markets when forecasts agree. Unlike fetching market context or positions, a generic briefing endpoint may expose broader operational or account information unrelated to weather prediction consensus.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The code claims the strategy only trades when all four forecasts agree within ±1°F, but the FourcastNet path only checks boolean fields supplied in ai_result and can force score=100 without independently verifying numeric agreement across all four sources. In a trading skill, this weakens a core safety/quality gate and could allow trades to execute on inconsistent or spoofed forecast inputs.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The user-facing message explicitly states that all forecasts, including FourcastNet, are required, but the code does not enforce FourcastNet temperature agreement before calling execute_trade. In a financial automation context, deceptive or inaccurate execution criteria are security-relevant because operators may authorize or rely on the bot under false assumptions about risk controls.

Content

No source excerpt is available for this finding.