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.
Affected software
| Software | Affected versions |
|---|---|
DokployServers and applications · github:dokploy/dokploy |
|
References
- GitHub Advisory Database https://github.com/advisories/GHSA-j329-jw7j-rxjm
- github.com https://github.com/Dokploy/dokploy/security/advisories/GHSA-j329-jw7j-rxjm