Back to skill

Security audit

Prediction Fair Value Template

Security checks for vulnerabilities and agentic risk

Overview

This trading skill is mostly purpose-aligned, but it can change financial account state through automatic redemption even when users may expect dry-run behavior.

Review carefully before installing. Use only a limited-scope Simmer API key, avoid production wallet credentials until redemption is separately gated, and do not assume dry-run is read-only because automatic redemption still runs. Pin dependencies and the ClawHub CLI before publishing or deploying in automation.

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

Warning
Location
trade_skill.py:137
Finding

Dry-Run Mode Performs State-Changing Automatic Redemptions

Content
View full analysis
None: results = client.auto_redeem() for result in results: if result.get("success"): print(f"redeemed market={result.get('market_id')} tx={result.get('tx_hash')}") ``` The function is invoked unconditionally during initialization: ```python def main() -> None: config = load_config() client = get_client(config.venue) print(f"skill={SKILL_SLUG} venue={config.venue} live={config.live}") print( f"query={config.market_query!r} fair_probability={config.fair_probability:.2f} " f"min_edge={config.min_edge:.2f} max_markets={config.max_markets}" ) run_auto_redeem(client) ``` ### Technical Analysis The skill represents dry-run mode as the safe default and checks `config.live` before submitting trades. However, the call to `run_auto_redeem()` occurs before that live-mode check and invokes the authenticated SDK method `client.auto_redeem()` regardless of whether live trading is enabled. Redemption is potentially state-changing. The code itself expects a transaction hash in the result, which indicates that redemption may cause a financial or on-chain transaction. Consequently, running the skill without `--live` does not guarantee a read-only execution. This violates the principle that simulation or dry-run modes must prevent all externally observable state changes, not merely order placement. ### Attack Path 1. A user configures `SIMMER_API_KEY` and runs `python trade_skill.py`, expecting the documented default dry-run behavior. 2. `load_config()` leaves `config.live` set to `False`. 3. The authenticated `SimmerClient` is initialized. 4. `main()` invokes `run_auto_redeem(client)` without checking `config.live`. 5. `client.auto_redeem() ...[truncated 922 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
clawhub.json:4
Finding

Unpinned Third-Party Dependencies Permit Mutable Supply-Chain Code

Content
View full analysis
Remediation
View remediation
"] ``` 2. Use a lockfile or constraints file with cryptographic hashes where the platform supports it, such as pip's `--require-hashes`. 3. Pin the ClawHub CLI to a reviewed exact version instead of using `@latest`: ```bash npx clawhub@ publish . --slug prediction-fair-value-template --version 1.0.0 ``` 4. Verify package provenance, publisher identity, release signatures, checksums, and registry source. 5. Review and lock transitive dependencies, not only direct packages. 6. Run dependency installation and publishing in a minimally privileged, isolated environment. 7. Do not expose wallet keys or production API credentials during dependency installation. 8. Use automated dependency scanning and require a new security review before updating pinned versions. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (6)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 36)May include surrounding context.

md
- `SKILL.md`

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
89% confidence
Finding

Using npx clawhub@latest publish pulls and executes the latest package version at publish time, which can change unexpectedly or be compromised upstream. That creates a supply-chain risk where a malicious or breaking release could execute code in the publisher's environment or alter the published artifact.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill can perform state-changing financial actions: it always calls auto_redeem(), and it can place live trades when enabled by CLI flag or environment variable, without a strong confirmation step immediately before execution. In a trading skill context, this increases the risk of unintended asset movement or orders if the skill is run in the wrong environment or with misconfigured flags/secrets.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The skill reads SIMMER_API_KEY from the environment to authenticate with the trading client, which is a sensitive credential access. This line has no adjacent comment, docstring, or user-facing disclosure explaining that the skill requires and uses an API key for authenticated trading operations.

Content

No source excerpt is available for this finding.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Confidence
50% confidence
Finding

Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Content

Scanner excerpt · trade_skill.py (reported line 102)May include surrounding context.

python
def read_value(item: Any, key: str, default: Any = None) -> Any:
    if isinstance(item, dict):
        return item.get(key, default)
    return getattr(item, key, default)


def format_probability(value: float) -> str:

Static analysis

No suspicious patterns detected.