Back to skill

Security audit

wickworks

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to do what it claims, but its setup relies on a mutable third-party container image and an unauthenticated service that users must secure themselves.

Review this before installing. Run only an instance you trust, prefer a pinned image digest or locally audited build, keep it bound to 127.0.0.1 unless it is behind authenticated network controls, and avoid sending proprietary OHLC data to an endpoint you do not operate or trust.

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)

T08 · Insecure Dependencies

Warning
Location
references/setup.md:27
Finding
Mutable Third-Party Container Image Is Executed Without Version or Digest Pinning## Vulnerability Details **File Location**: `references/setup.md:27` and `references/setup.md:35` **Vulnerability Type**: Supply-chain exposure through an unpinned container image **Risk Level**: Medium ### Vulnerable Code ```bash docker run --rm -p 127.0.0.1:8000:8000 psyb0t/wickworks:latest ``` ```yaml services: wickworks: image: psyb0t/wickworks:latest restart: unless-stopped ports: - "127.0.0.1:8000:8000" environment: LOG_LEVEL: INFO MAX_BARS: "5000" MIN_BARS: "50" WORKERS: "2" ``` ### Technical Analysis Both documented installation methods execute the third-party `psyb0t/wickworks:latest` container image. The `latest` tag is mutable and does not identify the exact image reviewed when this Skill was audited. A registry publisher can replace the tag without changing the instructions in this repository. Running a container is necessary for the declared indicator-computation functionality, but executing an unpinned image is not the minimum supply-chain risk required. An immutable release digest would provide the same functionality while preventing silent substitution. ### Attack Path 1. An attacker compromises the image publisher account, registry credentials, build pipeline, or upstream image. 2. The attacker publishes a modified image under `psyb0t/wickworks:latest`. 3. An operator follows the documented installation command or recreates the Compose deployment. 4. Docker resolves `latest` to the attacker-controlled image and executes it. 5. The modified service receives all OHLC data submitted by clients and can perform arbitrary actions available inside the container. ### Impact Assessment A substituted image could read or transmit submitted OHLC datasets, falsify indicator results, consume CPU and memory, or make arbitrary outbound network requests from the container. It would obtain the permissions available to the containerized process. ...[truncated 309 chars]
Remediation
## Remediation Suggestions - Replace `latest` with a reviewed, immutable image reference using both a release version and SHA-256 digest. - Apply the same pinned reference to the `docker run` and Docker Compose examples. - Publish expected image digests through a trusted release channel. - Verify image signatures and provenance before execution, such as through Sigstore/Cosign attestations. - Use automated dependency monitoring to review and deliberately update the pinned digest. - Retain the existing loopback binding and avoid adding host mounts, elevated capabilities, or privileged mode. - Consider documenting a read-only root filesystem, capability dropping, resource limits, and a non-root container user as additional defense in depth.

T09 · Insecure Skill Coding Practices

Warning
Location
references/setup.md:76
Finding
Unauthenticated REST and MCP Service Disables DNS-Rebinding Host Protection## Vulnerability Details **File Location**: `references/setup.md:76-79`; related disclosure at `SKILL.md:32-34` **Vulnerability Type**: Missing application-layer access control and disabled Host validation **Risk Level**: Medium ### Vulnerable Code From `references/setup.md`: ```text wickworks has **no auth env var** — connection-level access control is the operator's responsibility (loopback bind + reverse proxy). The MCP transport's DNS-rebinding Host check is disabled so real-hostname deployments work; gate access at your proxy, not the app. ``` Related security guidance from `SKILL.md`: ```text - **Auth-less by default, network-exposed** — wickworks ships with no built-in auth; anyone who can reach the port can call it. Bind it to loopback (`-p 127.0.0.1:8000:8000`) and only expose it behind your own reverse proxy / VPN with auth if it needs to be reachable off-host. The MCP bridge's optional `WICKWORKS_TOKEN` is for a bearer your *proxy* enforces, not wickworks itself. - **Consumer of the data you send** — you hand it OHLC bars; it computes on them and returns numbers. It does not fetch, phone home, or transmit your bars anywhere. Point the skill only at a wickworks instance you (or a trusted operator) run. ``` ### Technical Analysis The REST and MCP interfaces do not enforce native authentication. In addition, the MCP transport's DNS-rebinding Host check is explicitly disabled. Loopback binding is a useful network boundary, but it is not application-layer authorization and does not protect deployments that accidentally publish the port, use a permissive proxy, or otherwise make the endpoint reachable. Disabling Host validation also removes a defense intended to distinguish approved deployment hostnames from attacker-controlled Host values. Whether a browser-based DNS-rebinding attack is fully exploitable depends on additional behavior not present in the audited files, including browser request constraints and s ...[truncated 1915 chars]
Remediation
## Remediation Suggestions - Add optional native bearer-token or mutually authenticated TLS support to both REST and MCP endpoints. - Re-enable Host validation by default and provide an explicit allowlist for legitimate deployment hostnames. - Validate browser `Origin` headers where applicable and configure restrictive CORS behavior. - Continue binding to `127.0.0.1` by default. - Require an authenticated reverse proxy or VPN before any off-host exposure. - Configure proxy authentication consistently for both the REST and MCP routes. - Add per-client rate limits, request timeouts, concurrency limits, and container CPU/memory limits. - Reject unexpected forwarded-host headers and document a secure trusted-proxy configuration. - Use HTTPS for any non-loopback deployment so bearer credentials and submitted OHLC data are not sent in plaintext.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep

Static analysis

No suspicious patterns detected.