T09 · Insecure Skill Coding Practices
- Location
world_cup_delta_pairs.py:473- Finding
Non-atomic pair execution can create untracked directional exposure
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This trading skill is not clearly malicious, but it can place real-money trades and has weak safeguards around partial execution and account access.
Review before installing. Use a restricted Simmer API key if available, run dry-run or sim mode first, avoid --live and --no-safeguards unless you explicitly accept real-money trading risk, and be aware that a failed second leg may leave an unhedged position that the local budget/cooldown files do not record.
world_cup_delta_pairs.py:473Non-atomic pair execution can create untracked directional exposure
clawhub.json:6Unbounded dependency version permits unreviewed SDK updates
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
url = f"https://api.simmer.markets/api/sdk/markets?{params}"
req = urllib.request.Request(url, headers={"Authorization": f"Bearer {key}", "Accept": "application/json"})
try:
with urllib.request.urlopen(req, timeout=20) as r:
data = json.loads(r.read().decode())
except Exception:
return []
The documented behavior describes World Cup market pairing and trading logic, but the analyzed implementation reportedly accesses account portfolio and positions endpoints instead of relevant sports market data and lacks the stated pairing logic. That mismatch is dangerous because users may grant permissions or run the skill under false assumptions, exposing sensitive account data or enabling unintended actions unrelated to the declared strategy.
The manifest describes a skill for pairing NO-advance and YES-winner legs for the same 2026 World Cup team to identify cross-market mispricing. This file instead implements a generic Simmer account status CLI that reads an API key, queries portfolio and positions endpoints, and prints wallet/position information, which is unrelated to constructing or analyzing World Cup pair trades.
The skill advertises executable workflows that imply network, file, and environment access, but it does not declare any explicit tool scope or permissions boundaries. In an agent setting, missing capability declarations weakens least-privilege enforcement and makes it harder for reviewers or runtime policy to constrain what the skill can access.
The markdown explicitly documents live trading and an option to disable safeguards, but it does not include a clear warning that these actions may place real-money trades or bypass protections. In a trading skill, that context makes the omission more dangerous because users may execute impactful commands without understanding the financial and operational risk.
The inline documentation says the module shows wallet balance, positions, and recent activity, which describes an account-status utility. That directly conflicts with the skill manifest's declared intent to pair NO-advance and YES-winner legs for the same 2026 World Cup team.
For a skill whose stated purpose is to pair specific World Cup market legs, accessing a bearer API key from the environment and retrieving account portfolio/positions is an additional capability not obviously required by that purpose. The code performs authenticated account introspection rather than market-pair discovery or pricing analysis.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
"limit": max(1, min(limit, 1000)),
}
)
url = f"https://api.simmer.markets/api/sdk/markets?{params}"
req = urllib.request.Request(url, headers={"Authorization": f"Bearer {key}", "Accept": "application/json"})
try:
with urllib.request.urlopen(req, timeout=20) as r:
The skill is presented as a market-pairing/trading helper, but it also performs live order placement and persists spend/cooldown state on disk. In an agent-skill setting, this increases operational risk because invoking the skill can cause real financial actions and durable state changes without a stronger consent boundary than the --live flag. The issue is more dangerous here because the domain is live trading, where unintended execution directly impacts funds.
When --live is supplied, the skill submits real orders immediately without an additional execution-time warning or confirmation. In agent environments, a single flag may be set indirectly or persist in automation, so lack of a final user-facing warning materially increases the chance of accidental financial transactions. The trading context raises the severity because the consequence is direct monetary loss rather than a harmless side effect.
The CLI description labels the strategy as 'delta-neutral,' but the payoff logic is not truly neutral and can lose in scenarios where the team advances but the winner leg does not reprice enough. Mischaracterizing strategy risk is security-relevant in an autonomous trading context because users or orchestration systems may authorize execution under a false assumption of limited directional exposure. The context makes this more dangerous because it can lead to real-money trades based on misleading safety semantics.
This manifest defines runtime behavior such as autostart and an entrypoint, but it does not describe any invocation phrases, scope limits, or exclusion conditions. For manifest files, missing specificity around activation can make it unclear when the skill should run versus remain inactive.
No suspicious patterns detected.