CVE-2026-93425 Overview
Dokploy is a free, self-hostable Platform as a Service (PaaS). A command injection flaw in the patch.readRepoDirectories tRPC procedure allows an authenticated organization member with service:read permission to execute arbitrary shell commands as root inside the Dokploy container. The vulnerability stems from the user-controlled repoPath value being passed into a shell command via child_process.exec without safe argument quoting. Because the standard Dokploy deployment mounts /var/run/docker.sock, container-root execution lets an attacker control Docker and compromise the host along with its managed applications. The issue is fixed in version 0.29.13.
Critical Impact
An authenticated low-privileged user can achieve root command execution inside the Dokploy container and pivot to full host compromise through the mounted Docker socket.
Affected Products
- Dokploy versions prior to 0.29.13
- Deployments exposing the patch.readRepoDirectories tRPC endpoint
- Standard Dokploy installations that mount /var/run/docker.sock
Discovery Timeline
- 2026-09-24 - CVE-2026-93425 published to the National Vulnerability Database (NVD)
- 2026-09-24 - Last updated in NVD database
Technical Details for CVE-2026-93425
Vulnerability Analysis
The flaw is an OS command injection ([CWE-78]) in Dokploy's patch service. The patch.readRepoDirectories tRPC procedure in apps/dokploy/server/api/routers/patch.ts accepts a user-supplied repoPath string. That value is forwarded to packages/server/src/services/patch-repo.ts, which concatenates it into a shell command invoked through Node's child_process.exec. Because exec spawns a shell, any unescaped metacharacters such as ;, |, `, or $() are interpreted by the shell.
Any authenticated organization member holding the service:read permission can abuse the endpoint. The supplied service identifier is used only to resolve the target server; it does not constrain repoPath. The resulting command runs as root inside the Dokploy container, and the mounted Docker socket extends the blast radius to the host.
Root Cause
The underlying defect is missing shell argument quoting on user input before invocation of child_process.exec. The patch introduces shell-quote to escape file paths and remote schedule commands prior to shell execution, converting attacker-controlled strings into literal arguments.
Attack Vector
An authenticated attacker with service:read permission issues a tRPC request to patch.readRepoDirectories with a repoPath value that includes shell metacharacters. The injected payload executes with root privileges inside the container. By communicating with the mounted Docker socket, the attacker can launch privileged containers, mount host paths, or extract secrets managed by Dokploy.
// Security patch excerpt from packages/server/src/services/certificate.ts
import { removeDirectoryIfExistsContent } from "@dokploy/server/utils/filesystem/directory";
import { TRPCError } from "@trpc/server";
import { eq } from "drizzle-orm";
+import { quote } from "shell-quote";
import { stringify } from "yaml";
import type { z } from "zod";
import { encodeBase64 } from "../utils/docker/utils";
Source: GitHub Commit 16b5b72
// Security patch excerpt from packages/server/src/services/mount.ts
} from "@dokploy/server/utils/process/execAsync";
import { TRPCError } from "@trpc/server";
import { eq, type SQL, sql } from "drizzle-orm";
+import { quote } from "shell-quote";
import type { z } from "zod";
export type Mount = typeof mounts.$inferSelect;
Source: GitHub Commit 16b5b72
Stop Remote Code Execution Before It Runs
Singularity™ Endpoint detects and blocks exploit attempts at machine speed, including zero-days and novel attack techniques.
Stop Exploit AttemptsDetection Methods for CVE-2026-93425
Indicators of Compromise
- Unexpected child processes spawned by the Dokploy Node.js process, especially shells (sh, bash) with unusual arguments.
- tRPC request logs targeting patch.readRepoDirectories with repoPath values containing shell metacharacters such as ;, |, &, `, or $(.
- Unexplained Docker API calls through /var/run/docker.sock originating from inside the Dokploy container.
- New or modified containers, images, or bind mounts that reference host paths outside Dokploy's managed directories.
Detection Strategies
- Inspect application logs for patch.readRepoDirectories invocations and correlate with the authenticated user and submitted repoPath.
- Monitor the Dokploy container with runtime behavioral analytics to flag anomalous process execution chains rooted in the Node.js runtime.
- Audit Docker daemon logs for container creation events originating from the Dokploy container that mount sensitive host paths.
Monitoring Recommendations
- Enable verbose tRPC request logging for the patch router and ship logs to a SIEM for query and alerting.
- Alert on process-execution events where the parent is the Dokploy service and the child invokes a shell interpreter with user-supplied arguments.
- Baseline Docker socket activity and alert on deviations such as new privileged container launches.
How to Mitigate CVE-2026-93425
Immediate Actions Required
- Upgrade Dokploy to version 0.29.13 or later without delay.
- Review the organization membership list and revoke service:read from any account that does not require it.
- Rotate any credentials, API tokens, or secrets stored in or accessible to the Dokploy container.
- Inspect Docker for unauthorized containers, images, or volumes that may indicate prior exploitation.
Patch Information
The fix is included in Dokploy v0.29.13. The patch, published in commit 16b5b72, introduces the shell-quote library to escape file paths and remote schedule commands before shell invocation. Full details are available in GHSA-56g6-wjr4-5q7p.
Workarounds
- Restrict network access to the Dokploy management interface to trusted operator networks only.
- Remove or tightly restrict the service:read permission from organization roles until the upgrade is applied.
- Where feasible, run Dokploy without binding /var/run/docker.sock to limit host-level impact if the container is compromised.
# Upgrade Dokploy to the patched release
docker pull dokploy/dokploy:0.29.13
docker service update --image dokploy/dokploy:0.29.13 dokploy
# Verify the running version
docker exec -it $(docker ps -qf name=dokploy) \
sh -c 'cat /app/package.json | grep version'
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

