Back to skill

Security audit

Polymarket Candle Morning Star Trader

Security checks for vulnerabilities and agentic risk

Overview

The skill is a disclosed trading bot, but some promised live-trading risk controls are not actually enforced, so it needs review before use with real funds.

Install only for paper trading unless you have reviewed and fixed the live-risk controls. Before using --live, confirm the Simmer API key is narrowly scoped, pin simmer-sdk to a reviewed version, and enforce volume, position, and interval-continuity checks in code or through external trading limits.

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

T08 · Insecure Dependencies

Warning
Location
clawhub.json:8
Finding

Unpinned Privileged Runtime Dependency

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
trader.py:387
Finding

Declared Minimum-Volume Trading Safeguard Is Not Enforced

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
trader.py:367
Finding

Concurrent Position Limit Only Counts Orders Placed During the Current Run

Content
View full analysis
= MAX_POSITIONS: break patterns = detect_patterns(ivs) if not patterns: safe_print(f" [{key}] no morning-star/evening-star patterns") continue for pattern, target in patterns: if placed >= MAX_POSITIONS: break side, size, reasoning = compute_pattern_signal(pattern, target) if not side: safe_print(f" [skip] {reasoning}") continue ok, why = context_ok(client, target.market.id) if not ok: safe_print(f" [skip] {why}") continue try: r = client.trade( market_id=target.market.id, side=side, amount=size, source=TRADE_SOURCE, skill_slug=SKILL_SLUG, reasoning=reasoning, ) tag = "(sim)" if r.simulated else "(live)" status = "OK" if r.success else f"FAIL:{r.error}" safe_print(f" [trade] {side.upper()} ${size} {tag} {status} -- {reasoning[:100]}") if r.success: placed += 1 ``` ### Technical Analysis `MAX_POSITIONS` is documented as the maximum number of concurrent open positions. The implementation initializes `placed` to zero on every invocation and increments it only for successful orders placed during that invocation. The code does not query existing open positions or pending orders. Consequently, `MAX_POSITIONS` is an order-count limit per execution rather than a concurrent portfolio limit. Repeated scheduled or manual runs can continue adding positions while previous positions remain open. The control is particularly misleading because its name and ...[truncated 1089 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
trader.py:190
Finding

Pattern Detection Does Not Verify Consecutive Five-Minute Intervals

Content
View full analysis
list[tuple[str, IntervalMarket]]: """ Walk sorted intervals and find Morning Star or Evening Star patterns. Requires 4 consecutive intervals: 3 for the pattern + 1 target to trade. Returns list of (pattern_type, next_interval_to_trade). pattern_type is "morning_star" or "evening_star". """ if len(intervals) < 4: return [] sorted_ivs = sorted(intervals, key=lambda iv: iv.sort_key) # Thresholds derived from STAR_BODY and STAR_DOJI strong_down = 0.5 - STAR_BODY # e.g. 0.43 strong_up = 0.5 + STAR_BODY # e.g. 0.57 doji_low = 0.5 - STAR_DOJI # e.g. 0.47 doji_high = 0.5 + STAR_DOJI # e.g. 0.53 opportunities = [] for i in range(3, len(sorted_ivs)): p1 = sorted_ivs[i - 3].p p2 = sorted_ivs[i - 2].p p3 = sorted_ivs[i - 1].p target = sorted_ivs[i] # Morning Star: DOWN -> doji -> UP (bottom reversal, bullish) if p1 < strong_down and doji_low <= p2 <= doji_high and p3 > strong_up: # 4th interval hasn't fully priced reversal upward if target.p < 0.55: opportunities.append(("morning_star", target)) # Evening Star: UP -> doji -> DOWN (top reversal, bearish) elif p1 > strong_up and doji_low <= p2 <= doji_high and p3 < strong_down: # 4th interval hasn't fully priced reversal downward if target.p > 0.45: opportunities.append(("evening_star", target)) ``` ### Technical Analysis The function documentation states that four consecutive intervals are required. The implementation only sorts records by their start-time key and treats adjacent list elements as consecutive candles. It does not verify that: - E ...[truncated 1401 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (2)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill requires a high-value credential (SIMMER_API_KEY) and describes trading/execution behavior, but it does not declare any explicit tool scope such as permissions or allowed-tools. That mismatch weakens least-privilege controls because an agent runtime may grant broader environment or tool access than the skill actually needs, increasing the blast radius if the skill is modified, misused, or composed with other capabilities.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
81% confidence
Finding

This JSON manifest requires the SIMMER_API_KEY environment variable, indicating the skill uses sensitive credentials. The manifest provides no accompanying disclosure about credential handling, external service access, or the implications of supplying the key, which is a missing user warning for a manifest/markdown-adjacent skill descriptor.

Content

No source excerpt is available for this finding.