Back to skill

Security audit

Polymarket 24h Player Prop Consistency Trader

Security checks for vulnerabilities and agentic risk

Overview

This is a disclosed trading skill, but some advertised live-trading risk controls are weaker or missing, so users should review it carefully before granting trading credentials.

Install only if you understand it can place live Polymarket trades when run with --live. Use a restricted API key and limited account balance, keep paper mode unless intentionally trading, verify the SDK version yourself, and do not rely on the documented volume, open-position, and context safeguards as complete risk limits without code changes.

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)

T09 · Insecure Skill Coding Practices

Error
Location
trader.py:324
Finding

Live-Trading Risk Controls Are Incompletely Enforced

Content
View full analysis
tuple[bool, str]: p = getattr(market, "current_probability", None) if not isinstance(p, (int, float)): return False, "missing probability" spread_cents = getattr(market, "spread_cents", None) if isinstance(spread_cents, (int, float)) and spread_cents / 100 > MAX_SPREAD: return False, f"Spread {spread_cents/100:.1%} > {MAX_SPREAD:.1%}" resolves_at = getattr(market, "resolves_at", None) if resolves_at: try: resolves = datetime.fromisoformat(resolves_at.replace("Z", "+00:00")) days = (resolves - datetime.now(timezone.utc)).days if days < MIN_DAYS: return False, f"Only {days} days to resolve" except Exception: pass return True, "ok" ``` Position sizing uses the minimum trade value without capping the result at `MAX_POSITION`: ```python def compute_signal(market, opportunity: tuple | None) -> tuple[str | None, float, str]: ok, why = valid_market(market) if not ok: ...[truncated 5499 chars]
Remediation
View remediation
0`. - Require `0 <= MAX_SPREAD <= 1`. - Require `0 < YES_THRESHOLD < 0.5`. - Require `0.5 < NO_THRESHOLD < 1`. - Require `MAX_POSITIONS` to be a positive integer. 3. Apply an explicit upper bound to every order: ```python size = min(MAX_POSITION, max(MIN_TRADE, round(conviction * MAX_POSITION, 2))) ``` 4. Query the account's currently open positions before execution and calculate remaining capacity: ```python remaining = MAX_POSITIONS - current_open_position_count ``` Stop trading when `remaining <= 0`, and update the count after each successful order. 5. In live mode, fail closed when context retrieval, slippage validation, volume retrieval, or resolution-date parsing fails. Simulation mode may retain a configurable warning-only policy. 6. Add a maximum aggregate exposure limit independent of the number of positions. 7. Add unit tests covering malformed market metadata, context API failures, repeated runs, low-volume markets, and contradictory tunables. ]]>

T08 · Insecure Dependencies

Warning
Location
clawhub.json:6
Finding

Security-Critical Trading SDK Is Installed Without Version or Integrity Pinning

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (5)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The description emphasizes signal detection and trading strategy, but the document also states that the skill executes trades, including live trades when invoked with --live, without clearly declaring execution permissions. This mismatch is dangerous because operators may approve or deploy the skill as an analytics-only component while it actually has financial-action semantics, leading to unintended market orders and real fund exposure.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill declares access to sensitive environment-backed credentials (SIMMER_API_KEY) and describes trade execution behavior, but it does not declare any explicit tool scope or permissions boundary. That creates an authorization blind spot: a reviewing or hosting system cannot clearly constrain or audit what capabilities the skill is expected to use, increasing the chance of over-privileged execution or misuse of secrets.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The manifest declares an API credential requirement and clearly configures an automated trading entrypoint with financial tunables, but it does not provide any explicit user-facing warning, consent mechanism, or risk disclosure about live account activity. In the context of a Polymarket trading skill, this increases the chance that a user enables the agent without understanding that it can place market-affecting trades using their account/API key and configurable position sizes.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The top-level documentation says the skill detects cases where a star player's stat lines should be priced higher than role players on the same team. The actual code only groups markets by individual player and analyzes same-player cross-stat consistency/divergence; it never compares players on the same team or identifies star-versus-role-player relationships.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The manifest describes detecting cross-stat consistency or divergence for the same player across Points, Rebounds, and Assists. However, the module docstring additionally claims it 'also detects within-team hierarchy inconsistencies' between star and role players, which is a broader trading strategy not reflected in the manifest description, and no such logic is actually implemented elsewhere in code.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.