Back to skill

Security audit

Kalshi Fed Futures Arb Trader

Security checks for vulnerabilities and agentic risk

Overview

This trading skill mostly does what it says, but it asks for an unnecessary raw Solana private key and can place live trades with weak fail-open safeguards.

Review this carefully before installing. Do not provide a funded Solana private key unless the publisher explains why this exact implementation needs it. Use paper mode first, pin and review simmer-sdk, and only enable --live with tightly limited trading credentials and loss limits.

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

Error
Location
trader.py:281
Finding

Live trades proceed when safeguard context retrieval fails

Content
View full analysis
dict: """Get market context with safeguards and edge analysis.""" try: if my_probability is not None: return get_client()._request( "GET", f"/api/sdk/context/{market_id}", params={"my_probability": my_probability} ) return get_client().get_market_context(market_id) except Exception: return None def check_safeguards(context: dict) -> tuple[bool, list[str]]: """Check context for safeguards. Returns (should_trade, reasons).""" if not context: return True, [] ``` ### Technical Analysis `get_market_context()` suppresses every exception and returns `None`. `check_safeguards()` then treats a missing or empty context as approval to trade. Consequently, authentication failures, network timeouts, rate limits, malformed API responses, SDK failures, and service outages all bypass the checks for: - Resolved markets - Time remaining before resolution - Minimum liquidity - Maximum slippage - Severe flip-flop warnings This is a fail-open design in a financial execution path. The absence of risk information is treated as evidence that the order is safe, even though none of the advertised safeguards could be evaluated. ### Attack Path 1. The Skill identifies a signal whose calculated edge exceeds the configured threshold. 2. An attacker disrupts the context endpoint, or an ordinary timeout, rate limit, authentication error, malformed response, or SDK exception occurs. 3. `get_market_context()` catches the exception without reporting its cause and returns `None`. 4. `check_safeguards(None)` returns `(True, [])`. 5. When the Skill is running with `--live`, execution continues to `execute_trade()`. 6. A real order ...[truncated 876 chars]
Remediation
View remediation
tuple[bool, list[str]]: if not isinstance(context, dict) or not context: return False, ["Market context unavailable; refusing to trade"] ``` Live execution should require affirmative validation of all mandatory safety conditions rather than relying on the absence of detected warnings. ]]>

T08 · Insecure Dependencies

Warning
Location
clawhub.json:8
Finding

Security-sensitive trading SDK dependency is not version or integrity pinned

Content
View full analysis
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
clawhub.json:3
Finding

Unused Solana private key is required and exposed to the Skill process

Content
View full analysis
Remediation
View remediation
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 (7)

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The manifest requests SOLANA_PRIVATE_KEY even though the skill description only mentions CME FedWatch/Kalshi arbitrage and SIMMER access. An unrelated private key is a highly sensitive capability that could enable unauthorized blockchain transactions or wallet draining if the code uses or exfiltrates it, and the mismatch between declared purpose and requested secret materially increases suspicion.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

Declaring access to a Solana private key is unjustified by the stated FedWatch-vs-Kalshi arbitrage use case and gives the skill the ability to control external assets unrelated to its advertised purpose. In the context of an automated trader, unnecessary secret access is especially dangerous because users may supply the credential expecting legitimate trading behavior while the skill could silently perform blockchain actions.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The documented override format FEDWATCH_JUN2026 is converted to jun2026, while the strategy reads keys like jun_2026, so operator-supplied updates are silently ignored. In a trading context this is dangerous because users may believe they corrected the reference probability for live execution when the bot continues trading on stale values.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill requires high-value environment variables, including a trading API key and a Solana private key, but does not declare any explicit tool scope or permissions boundary. That omission weakens reviewability and enforcement, making it easier for an agent runtime to expose credentials more broadly than necessary or for future code changes to consume sensitive env vars without clear authorization.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The manifest combines sensitive credentials, a managed automated entrypoint, and live-trading tunables without any user-facing warning about financial risk, automated order placement, or how secrets will be used. While this is less severe than direct secret overreach, it increases the likelihood of unsafe deployment, accidental live trading, and uninformed disclosure of high-value credentials.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The strategy advertises comparison against CME FedWatch implied probabilities, but the probabilities are hard-coded and mutable locally rather than fetched from an authoritative source at runtime. In a live trading skill, stale or tampered reference data can directly drive incorrect orders, causing systematic mispricing decisions and financial loss.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

When invoked with --live, the skill places real trades immediately without an interactive confirmation step at execution time. For an automated trading skill this increases the risk of accidental live execution due to operator error, misconfiguration, or scripted invocation, especially since trade decisions are based on imperfect data handling elsewhere in the file.

Content

No source excerpt is available for this finding.