Back to skill

Security audit

Kalshi Fed Dot Plot Trader

Security checks for vulnerabilities and agentic risk

Overview

The skill is for automated Fed-rate trading, but live mode can move real funds and the artifact shows unsafe trade scoping and fail-open safeguards that warrant review before use.

Use only dry-run mode or a dedicated low-balance account until the exit filter requires verified strategy ownership, market-context failures block live trades, credentials are scoped to live runs, and simmer-sdk is pinned to an audited version.

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)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
trader.py:442
Finding

Live Exit Logic Can Liquidate Positions Not Owned by This Strategy

Content
View full analysis
= EXIT_THRESHOLD: found += 1 log(f" EXIT: {question} price={price:.2f} >= {EXIT_THRESHOLD:.2f}") ctx = get_market_context(market_id) ok, reasons = check_safeguards(ctx) if not ok: log(f" Skipped: {'; '.join(reasons)}") continue if not dry_run: result = execute_trade( market_id, "sell", shares, reasoning=f"Exit: price {price:.2f} >= threshold {EXIT_THRESHOLD:.2f}", ) ``` ### Technical Analysis The exit routine identifies positions using either the expected strategy source tag or a broad textual match for questions containing terms associated with Federal Reserve rates. The logical `or` means that a position does not need to have been created by this Skill to qualify for liquidation. Position ownership is a security boundary for an automated trading strategy. A strategy should only modify positions it can positively attribute to its own prior trades. Market-question text is not a reliable ownership identifier and may match manually opened positions or ...[truncated 1440 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
trader.py:339
Finding

Market Safety Controls Fail Open When 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()` converts every exception into `None`, including authentication errors, rate limiting, network failures, malformed responses, and SDK defects. `check_safeguards()` then treats a missing or empty context as approval to trade. This is a fail-open security design. The unavailable context is precisely where the Skill expects to obtain information used to reject unsafe orders, including: - Resolved-market warnings - Flip-flop or discipline warnings - Time remaining before resolution - Market liquidity - Estimated slippage As a result, failure of the safety-data channel disables all of these controls instead of stopping execution. The broad exception handler also removes diagnostic details that could distinguish transient network failures from invalid or corrupted data. ### Attack Path 1. The Skill identifies a signal that meets its configured entry or exit threshold. 2. The context endpoint becomes unavailable, returns malformed data, is rate-limited, or produces an SDK exception. 3. `get_market_context()` suppresses the exception and returns `None`. 4. `check_safeguards(None)` returns `( ...[truncated 937 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
clawhub.json:8
Finding

Privileged Trading SDK Is Installed Without Version or Integrity Pinning

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • 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
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (7)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description understates the skill's actual capabilities: it can execute live trades, read positions, unwind holdings, and requires an additional private key not disclosed in the top-level purpose. This mismatch is dangerous because users or orchestrators may approve or auto-run the skill under incomplete assumptions, exposing funds and credentials to unintended financial actions.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

In this skill context, access to a Solana private key is context-inappropriate and therefore especially suspicious: the stated purpose is Kalshi market trading based on FOMC dot plots, not on-chain operations. An unnecessary private key in scope creates a path for secret theft, unauthorized transactions, or covert exfiltration, and the mismatch between declared behavior and requested secret increases risk.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill declares required environment variables and handling of high-value credentials, but it does not declare any explicit tool scope or permissions boundary. In an agent ecosystem, that omission weakens least-privilege controls and makes it easier for the skill to access secrets implicitly without transparent user consent or enforcement.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The manifest requests access to SOLANA_PRIVATE_KEY even though the skill description and dependencies indicate a Kalshi/Fed-rate trading strategy that should only need a Kalshi/Simmer credential. Requesting an unrelated blockchain private key expands the secret exposure surface and could enable unauthorized wallet access or signing if the runtime injects that credential.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The manifest says the skill computes Fed-rate probabilities and trades on Kalshi, but the code optionally imports a trade journal integration and records executed trades. Logging executed trades to another component is a separate operational behavior that is not described in the manifest.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The manifest describes a strategy skill that computes fair probabilities and trades Kalshi Fed-rate markets, but the code also loads and maintains a mutable local configuration layer. This goes beyond an obvious implementation detail because the skill exposes config persistence and management as part of its behavior, which is not mentioned in the manifest description.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The manifest presents the skill as a trader driven by dot-plot logic, but the CLI exposes a --set interface that changes stored configuration values at runtime. This is behaviorally broader than simple trading execution because it modifies local persisted state and changes future runs.

Content

No source excerpt is available for this finding.