All vulnerabilities

Servers and applications

GHSA-j329-jw7j-rxjm

OS Command Injection via serviceName in Compose Backup

Severity
Critical 9.9
Published
12 Nov 2026
Last changed
12 Nov 2026
Added to UpHeron
12 Nov 2026
Fixed in
0.31.1
Weakness
OS command injection (CWE-78)
Attack
Over the network · Needs a user account · No user action needed
Attacker can
Read data · Change data · Take it down
CVSS vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Sources
Project advisories (GitHub)

Description

The serviceName field accepted by backup.create and backup.update is interpolated directly into a shell command string without sanitization or escaping. The injected command executes as root inside the Dokploy container at the next scheduled cron tick (default: every minute). Because Dokploy mounts /var/run/docker.sock on standard installations, this leads to full host compromise.

Critically, exploitation requires only a member-level account - no admin or owner privileges are needed. A member with access to a single project can create a backup with an injected serviceName targeting any destination already registered in the organization.

packages/server/src/utils/backups/utils.ts, function getComposeContainerCommand (lines 246–256), interpolates serviceName directly into a shell string:

The backup executes via execAsync(backupCommand, { shell: "/bin/bash" }). The schedule defaults to */1 * * * *, so the payload executes within 60 seconds of creation.

From Dokploy/dokploy's security advisory. Shortened; the full text is there.

Affected software

SoftwareAffected versions
DokployServers and applications · github:dokploy/dokploy
  • Every version before 0.31.1

References