Back to skill

Security audit

Clawhub Skill Bandwidth Income

Security checks for vulnerabilities and agentic risk

Overview

The skill is coherent for bandwidth-income nodes, but it asks users to run persistent network-relay containers with sensitive access and insufficient safety scoping.

Review this carefully before installing. Use only dedicated, isolated hosts or VLANs, verify platform terms and ISP rules, avoid reused credentials, do not expose management ports publicly, prefer pinned and verified container images, and understand that abuse complaints or traffic reputation issues may trace back to your IP.

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 (3)

T08 · Insecure Dependencies

Error
Location
SKILL.md:82
Finding
Unverified Mutable Third-Party Container Image Receives Account Credentials<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 82-89; additionally referenced in lines 139-146 **Vulnerability Type**: Untrusted and unpinned third-party container dependency **Risk Level**: High ### Vulnerable Code ```bash docker run -d \ --name grass-node \ --restart unless-stopped \ -e GRASS_USER=your@email.com \ -e GRASS_PASS=yourpassword \ mrcolorrain/grass:latest ``` The equivalent Docker Compose configuration also uses the same mutable image: ```yaml grass: image: mrcolorrain/grass:latest container_name: grass-node restart: unless-stopped environment: - GRASS_USER=${GRASS_EMAIL} - GRASS_PASS=${GRASS_PASSWORD} ``` ### Technical Analysis The instructions execute `mrcolorrain/grass:latest`, a third-party container image published under an individual namespace, and provide Grass account credentials directly to that image. The mutable `latest` tag does not identify an immutable, reviewed artifact. Its contents can change without any corresponding modification to the audited skill. The documentation does not require an image digest, signature verification, source-code review, software bill of materials, or other provenance validation. Consequently, compromise of the image publisher or registry account could cause future installations or container recreations to retrieve attacker-controlled content. The `unless-stopped` restart policy also allows the downloaded image to operate persistently as a long-running workload, although that persistence is part of the declared node functionality. ### Attack Path 1. An attacker compromises the publisher account, registry credentials, or build pipeline associated with `mrcolorrain/grass`. 2. The attacker replaces the image referenced by `mrcolorrain/grass:latest` with a malicious version. 3. A user follows the documented installation instructions or later recreates/pulls the container. 4. Docker downloads and executes the changed image. 5. The malicious container r ...[truncated 857 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Prefer an official, vendor-maintained image. If no official image exists, audit the source and build the container internally from a reviewed commit. 2. Pin the image to an immutable cryptographic digest, for example: ```yaml image: trusted/repository@sha256:VERIFIED_DIGEST ``` 3. Verify image signatures and provenance with a mechanism such as Sigstore/Cosign before deployment. 4. Review the image's SBOM and scan it for known vulnerabilities and unexpected binaries. 5. Use a dedicated low-value account with a unique password instead of credentials reused elsewhere. 6. Restrict container egress to only the destinations required by the service where technically feasible. 7. Run the container as a non-root user, drop unnecessary Linux capabilities, use a read-only root filesystem, and enable `no-new-privileges`. 8. Establish an explicit update process in which each new digest is reviewed before deployment rather than tracking `latest`. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:139
Finding
Platform Passwords Exposed Through Container Environment Variables<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 139-164 **Vulnerability Type**: Insecure secret handling in Docker configuration **Risk Level**: Medium ### Vulnerable Code ```yaml grass: image: mrcolorrain/grass:latest container_name: grass-node restart: unless-stopped environment: - GRASS_USER=${GRASS_EMAIL} - GRASS_PASS=${GRASS_PASSWORD} ``` The Honeygain service uses the same pattern: ```yaml honeygain: image: honeygain/honeygain:latest container_name: honeygain-node restart: unless-stopped environment: - HONEYGAIN_EMAIL=${HONEYGAIN_EMAIL} - HONEYGAIN_PASS=${HONEYGAIN_PASSWORD} - HONEYGAIN_DEVICE=homelab-01 ``` The standalone Grass example also places a password directly in command-line configuration: ```bash -e GRASS_USER=your@email.com \ -e GRASS_PASS=yourpassword \ ``` ### Technical Analysis The documented configuration passes Grass and Honeygain passwords through container environment variables. Container environment values are normally retained in Docker's container configuration and can be retrieved through Docker inspection by users or processes with access to the Docker daemon. Docker access is commonly equivalent to highly privileged host access, but exposing plaintext secrets in container metadata unnecessarily increases their discoverability. The standalone command can additionally expose literal credentials through shell history, terminal logs, command auditing, copied documentation, or support transcripts. In the Compose example, users are likely to place the substituted values in a `.env` file. The instructions do not specify restrictive file permissions or require the file to be excluded from version control. Environment variables are also available to processes running inside the corresponding container. This is required for the illustrated application design, but it magnifies the impact of using an untrusted or compromised image. ### Attack Path 1. A user enters a passwor ...[truncated 1253 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Use Docker secrets or read-only secret files instead of ordinary environment variables whenever supported by the application. 2. If the application only supports environment variables, load them through a narrowly permissioned runtime mechanism and document the residual exposure through Docker inspection. 3. Never place literal passwords in interactive command lines. Prompt securely for secrets or reference protected files. 4. Store any `.env` file outside the project repository, set permissions to owner-read/write only, and add `.env` and related secret files to `.gitignore`. 5. Ensure logs, diagnostics, support bundles, and backup jobs redact or exclude credentials. 6. Use unique credentials for each platform and do not reuse personal or administrative passwords. 7. Rotate credentials immediately if they have appeared in command history, committed files, shared terminal output, or container metadata accessible to untrusted users. 8. Restrict membership in the Docker group and access to the Docker socket because either can expose container secrets and commonly provides broader host control. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:103
Finding
Mysterium Management Dashboard Published on All Host Interfaces Without Transport Protection<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 103-114; equivalent port publication appears in lines 147-158 **Vulnerability Type**: Insecure network service exposure **Risk Level**: Medium ### Vulnerable Code ```bash # 2. Deploy the node: docker run -d \ --name mysterium-node \ --restart unless-stopped \ --cap-add NET_ADMIN \ -p 4449:4449 \ -v ~/.mysterium:/root/.mysterium \ mysteriumnetwork/myst:latest \ service --agreed-terms-and-conditions # 3. Claim your node: # Visit: http://YOUR_SERVER_IP:4449 # Enter your wallet address from my.mystnodes.com ``` The Docker Compose configuration similarly publishes the port without a host-interface restriction: ```yaml ports: - "4449:4449" ``` ### Technical Analysis Docker port publication in the form `-p 4449:4449` or `"4449:4449"` normally binds the container port to all applicable host interfaces. The instructions then direct the user to access the management dashboard through plain HTTP at `http://YOUR_SERVER_IP:4449`. The skill does not instruct the user to bind the dashboard to loopback, apply firewall allowlisting, place it behind an authenticated reverse proxy, use a VPN, or protect remote access with TLS. If the server has a public interface and host or cloud firewall rules permit the connection, the management endpoint can become reachable by untrusted parties. Whether an attacker can alter configuration depends on the dashboard's own authentication and upstream security controls, which are not established by the audited files. Nevertheless, global publication materially expands the attack surface and enables remote probing of the management service. ### Attack Path 1. A user deploys the Mysterium container with `-p 4449:4449`. 2. Docker binds TCP port 4449 to the host's network interfaces. 3. The host or cloud firewall allows inbound access to that port. 4. An attacker discovers the endpoint through targeted scanning or Internet-wide service enumeration. 5. Th ...[truncated 1190 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Bind the management endpoint to loopback by default: ```bash -p 127.0.0.1:4449:4449 ``` or: ```yaml ports: - "127.0.0.1:4449:4449" ``` 2. Access the dashboard through an SSH tunnel, for example: ```bash ssh -L 4449:127.0.0.1:4449 user@server ``` 3. If remote access is necessary, expose it only through a trusted VPN or an authenticated reverse proxy with TLS. 4. Apply host and cloud firewall rules that allow only explicitly trusted administration addresses. 5. Confirm and enable the dashboard's native authentication before permitting any non-loopback access. 6. Avoid transmitting wallet or management data over plaintext HTTP across untrusted networks. 7. Keep the Mysterium image pinned and updated after security review, and monitor dashboard access logs for unexpected connections. 8. Place the node on a dedicated host or isolated VLAN to limit the impact of a compromise, especially because the container legitimately receives `NET_ADMIN`. ]]>
Vulnerability Patterns
  • 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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (6)

Missing User Warnings

High
Confidence
97% confidence
Finding
The Mysterium instructions do not prominently warn that the host becomes a VPN exit node, meaning third-party traffic may appear to originate from the user's public IP. In this specific skill that is highly dangerous because it can create abuse complaints, legal exposure, reputation damage, and increased attack surface while encouraging non-expert users to deploy it quickly.

Privileged Container / Container Escape

High
Category
Privilege Escalation
Content
docker run -d \
  --name mysterium-node \
  --restart unless-stopped \
  --cap-add NET_ADMIN \
  -p 4449:4449 \
  -v ~/.mysterium:/root/.mysterium \
  mysteriumnetwork/myst:latest \
Confidence
94% confidence
Finding
Granting `NET_ADMIN` gives the container powerful control over networking, including interface, routing, firewall, and packet-handling changes. Even if required for legitimate VPN functionality, this materially increases the blast radius of a compromised or malicious container and is especially risky here because the skill also uses third-party images and exposes the service to external traffic.

Missing User Warnings

Medium
Confidence
86% confidence
Finding
The examples encourage setup and restart operations for bandwidth-sharing nodes without clearly foregrounding that these actions deploy third-party containers and may expose services or route external traffic through the user's IP. That omission increases the chance that users execute risky commands without understanding the legal, privacy, and security consequences.

Rp1

Medium
Category
MCP Rug Pull
Confidence
93% confidence
Finding
The skill instructs users to run third-party Docker images using mutable tags instead of pinned digests, which allows image contents to change over time without review. In this context the risk is amplified because the containers handle credentials, networking, and potentially route third-party traffic, so a compromised or swapped image could execute arbitrary code or exfiltrate secrets.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
This deployment runs a network-facing VPN node from an unpinned image, so future pulls may introduce malicious or unsafe changes without the user's knowledge. Because the container also requests elevated networking capability and exposes a management port, a malicious image could have significant host and network impact.

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding
The Storj node is deployed from an image reference that is not immutably pinned, creating supply-chain risk if the image is changed upstream or the registry account is compromised. Since the container stores wallet, email, public IP, and persistent data, compromise could lead to credential theft, data tampering, or abuse of exposed services.

Static analysis

No suspicious patterns detected.