Back to skill

Security audit

Doro Docker Essentials

Security checks for vulnerabilities and agentic risk

Overview

This Docker reference skill is coherent, but it includes copy-pastable destructive and insecure Docker commands without enough warning or scoping.

Review this skill before installing if you expect agents or users to copy commands directly. Treat cleanup commands as destructive, avoid unpinned or latest container images for real workloads, and do not use the PostgreSQL example as written outside an isolated local test environment.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:283
Finding
PostgreSQL Container Exposed with a Predictable Hardcoded Password## Vulnerability Details **File Location**: `SKILL.md`, lines 283-290 **Vulnerability Type**: Hardcoded weak credential and unsafe network exposure **Risk Level**: High ```bash docker run -d \ --name postgres \ -e POSTGRES_PASSWORD=secret \ -e POSTGRES_DB=mydb \ -v postgres-data:/var/lib/postgresql/data \ -p 5432:5432 \ postgres:15 ``` ### Technical Analysis The documented workflow configures PostgreSQL with the predictable password `secret`. It also publishes container port 5432 to host port 5432 without specifying a loopback address. Docker therefore normally binds the published port to all host interfaces. If a user copies this example into a network-accessible environment, an attacker who can reach TCP port 5432 can attempt to authenticate using the documented password. Embedding the password directly in the command also risks disclosure through shell history, process inspection, terminal logs, and copied deployment records. ### Attack Path 1. A user copies and executes the documented database command. 2. Docker starts PostgreSQL with the password `secret`. 3. Docker publishes TCP port 5432 on the host's available network interfaces. 4. An attacker discovers the exposed PostgreSQL service through network scanning or prior knowledge. 5. The attacker connects to the service and attempts authentication using the predictable password `secret`. 6. If authentication succeeds, the attacker gains the permissions assigned to the authenticated PostgreSQL account. Exploitation requires network access to the published port and a compatible database username or another means of identifying it. ### Impact Assessment Successful exploitation could permit unauthorized reading, modification, insertion, or deletion of data accessible to the compromised PostgreSQL account. The attacker could also disrupt the database or misuse PostgreSQL functionality available to that account. The direct impact is limited b ...[truncated 177 chars]
Remediation
## Remediation Suggestions - Replace the fixed password with a strong, randomly generated secret. - Supply credentials through Docker secrets or another dedicated secret-management mechanism rather than placing them directly in the command line. - If an environment file is used for local development, restrict its filesystem permissions and exclude it from version control. - When only local host access is required, bind the port explicitly to loopback, for example: `-p 127.0.0.1:5432:5432`. - When only other containers require database access, do not publish the database port. Attach the containers to a private Docker network instead. - Apply host firewall rules and network access controls when remote database access is necessary. - Use a dedicated, least-privileged PostgreSQL role for the application and restrict access to only the required databases, schemas, and operations. - Update the documentation to label any development-only example clearly and warn users not to deploy predictable credentials or unrestricted port bindings in production.
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (14)

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
The example `docker run nginx` uses an unpinned image reference, which makes the result dependent on whatever tag the registry serves at execution time. This weakens reproducibility and can expose users to unexpected or compromised image updates if the upstream image changes.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
The command `docker run -d nginx` launches an image without a fixed version or digest. In documentation, this encourages users to rely on mutable defaults, which can lead to supply-chain risk and non-repeatable deployments.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
The example `docker run --name my-nginx -d nginx` references `nginx` without a specific version or digest. Users copying this command may pull different image contents over time, creating avoidable supply-chain and reproducibility issues.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
The sample `docker run -p 8080:80 -d nginx` relies on an unpinned image. Mutable image references can silently introduce changed software, vulnerable dependencies, or malicious content if the upstream source is altered.

Rp1

Medium
Category
MCP Rug Pull
Confidence
90% confidence
Finding
The command `docker run -e MY_VAR=value -d app` references a generic image name without version pinning. Even in illustrative documentation, this normalizes unsafe practice and can lead users to run unexpected image contents.

Rp1

Medium
Category
MCP Rug Pull
Confidence
90% confidence
Finding
The example `docker run -v /host/path:/container/path -d app` uses an unpinned image reference. Because this also mounts host data into the container, running an unexpected image can increase the risk of host data exposure or tampering.

Rp1

Medium
Category
MCP Rug Pull
Confidence
92% confidence
Finding
The command `docker run --rm alpine echo "Hello"` uses `alpine` without a fixed version or digest. Although low-risk in appearance, it still teaches a mutable image selection pattern that can produce inconsistent or unsafe results over time.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
The example `docker run -it ubuntu bash` pulls a mutable `ubuntu` image reference. This can expose users to unexpected package sets or vulnerabilities if the upstream image changes, and it undermines deterministic troubleshooting or training steps.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The commands for removing containers and pruning stopped containers are presented without any warning about irreversible deletion. In a quick-reference skill, this context increases the chance that users will execute destructive commands without understanding their effects.

Rp1

Medium
Category
MCP Rug Pull
Confidence
98% confidence
Finding
`docker pull nginx:latest` explicitly uses the mutable `latest` tag, which is a common source of supply-chain and reproducibility problems. The pulled image may change at any time without any command change, making behavior unpredictable and potentially unsafe.

Rp1

Medium
Category
MCP Rug Pull
Confidence
90% confidence
Finding
The volume example `docker run -v myvolume:/data -d app` uses an unpinned image reference. Since volumes persist data, pairing them with mutable images increases the chance of accidental data corruption or incompatible behavior after upstream image changes.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The skill documents `docker system prune`, `docker system prune -a`, and `docker system prune --volumes` without warning that they can permanently delete stopped containers, unused images, networks, caches, and volumes. Users may copy these commands in the wrong environment and cause irreversible data loss or service disruption.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The development workflow uses `node:18`, which is versioned but still a mutable tag rather than an immutable digest. This is less dangerous than bare or `latest` tags, but it can still drift as the upstream publisher updates the tag.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The database example uses `postgres:15`, which is a mutable major-version tag and can resolve to different image contents over time. For stateful services, image drift can introduce security regressions, operational surprises, or compatibility issues.

Static analysis

No suspicious patterns detected.