Back to skill

Security audit

simmer-preflight

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed read-only pre-trade checker, with the main caution that it installs an unpinned third-party Simmer SDK and uses a Simmer API key.

Install only if you trust Simmer and are comfortable giving this skill a Simmer API key for account, wallet, balance, exposure, and position checks. Prefer a read-only or least-privilege key if available, and consider pinning or reviewing the simmer-sdk version before use in a real-money trading environment.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T08 · Insecure Dependencies

Warning
Location
clawhub.json:5
Finding
Unbounded Third-Party SDK Dependency Can Introduce Unreviewed Code## Vulnerability Details **File Location**: `clawhub.json:5-9`; dependency import and API-key use at `preflight.py:63-71` **Vulnerability Type**: Unbounded third-party dependency / supply-chain risk **Risk Level**: Medium ### Vulnerable Code `clawhub.json:5-9`: ```json "requires": { "env": [ "SIMMER_API_KEY" ], "pip": [ "simmer-sdk>=0.17.13" ] } ``` `preflight.py:63-71`: ```python try: from simmer_sdk import SimmerClient except ImportError: print("ERROR: simmer-sdk not installed — run: pip install simmer-sdk>=0.17.13", file=sys.stderr) return 2 try: client = SimmerClient.readonly(api_key=api_key, venue=_venue) except ValueError as e: ``` ### Technical Analysis The dependency declaration specifies only a minimum version and does not impose an upper bound, exact version, or package hash. Dependency resolution can therefore install any future release satisfying `simmer-sdk>=0.17.13`, even if that release has not been reviewed with this Skill. Python executes package-level code when `simmer_sdk` is imported. The resulting third-party `SimmerClient` implementation also receives the sensitive `SIMMER_API_KEY`. Consequently, a compromised or malicious future package release could execute arbitrary code in the Agent process and intercept the API key. The reviewed repository does not contain evidence that the current SDK version is malicious. This finding concerns the absence of dependency integrity and version controls, which creates a supply-chain exploitation path. ### Attack Path 1. An attacker compromises the package publisher account, package distribution channel, or a future compatible `simmer-sdk` release. 2. The attacker publishes a version higher than `0.17.13` containing malicious import-time or client-initialization code. 3. A new installation or dependency update resolves the unconstrained requirement to the compromised version. 4. Invoc ...[truncated 1116 chars]
Remediation
## Remediation Suggestions 1. Replace the lower-bound requirement with an exact, reviewed version, for example: ```json "pip": [ "simmer-sdk==0.17.13" ] ``` 2. Maintain dependencies in a lock file containing cryptographic hashes and install them with hash verification, such as pip's `--require-hashes`. 3. Review SDK release notes and source changes before deliberately updating the pinned version. 4. Obtain packages only from an approved package index and verify package publisher ownership and provenance. 5. Run the Skill with restricted filesystem and network permissions so a compromised dependency cannot access unrelated credentials or destinations. 6. Provide the process only with the specific API key needed for preflight and ensure that the key has read-only, least-privilege permissions. 7. Where feasible, vendor or independently audit the small portion of SDK functionality required by the Skill.
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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (3)

Lp3

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding
Without declared permissions the skill's intent is opaque and cannot be validated.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
self.assertIn("POLYMARKET_APPROVALS_MISSING", result.warnings)

    def test_approvals_ok_no_warning(self):
        """External-key wallet with all approvals set → no approvals warning."""
        client = _make_client(
            private_key="0x" + "a" * 64,
            wallet_address="0xExtEOA",
Confidence
75% confidence
Finding
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Missing User Warnings

Low
Confidence
85% confidence
Finding
This code file includes credential-like values such as `sk_live_test` and multiple `private_key=` test fixtures. Although they appear to be test-only data, SQP-2 for code files covers access to sensitive credentials when there is no visible disclosure, and there is no nearby warning that the values are dummy placeholders and must not be treated as real secrets.

Static analysis

No suspicious patterns detected.