CVE-2026-72867
CVE-2026-72867 reveals a schema-to-shell injection in Dokploy's Git provider layer that allowed low-privileged users to achieve host command execution. This is not a novel vulnerability class—it is the modal outcome of a pervasive anti-pattern in deployment tooling: concatenating user-supplied branch names directly into shell commands without server-side validation at the point of consumption. The vulnerability existed in versions 0.29.3 through 0.29.13. The attack surface spans five separate provider files (github.ts, gitlab.ts, bitbucket.ts, gitea.ts, and the generic git.ts), all of which implemented the same shell-based branch handling pattern. This replication is not accidental—it reflects a design decision that treats branch names as trusted input at the execution layer, even when validation may exist at the API entry point. The critical failure is the gap between schema persistence and shell execution. A branch name passes through the compose.ts schema layer, gets stored, and then flows into git.ts providers where it is interpolated into shell commands. The fix in 0.29.13 must be evaluated against two questions: does it add server-side schema validation that gates shell execution, or does it only patch the reported exploit vector while leaving the underlying architecture intact? If shell invocation persists in the git providers, the attack surface remains identical—the next injection variant will find the same path. For defenders, the priority is straightforward. First, verify your Dokploy deployment is on 0.29.13 or later and confirm whether the git provider layer still uses shell commands with user input. Second, examine the compose.update endpoint authorization model—if low-privileged users can trigger branch-based Git operations, that trust boundary was broken and may still be. Third, treat any shell invocation with untrusted input in your deployment tooling as a finding, regardless of whether input validation exists elsewhere in the stack. The architectural fix is to eliminate shell execution from the Git provider layer entirely, replacing it with a Git library that takes arguments as parameters, not strings interpolated into a shell command. The blast radius here is the Dokploy host itself. As a PaaS, Dokploy sits inside the trust boundary of every application it deploys. Host compromise from a low-privileged tenant means every other application on that host is potentially exposed—credentials, secrets, source code. This is not an isolated container breakout; it is a trust boundary collapse.
Reviewed through automated stages and approved by a human before publication.