exec_cmd() in modoboa/lib/sysutils.py always runs subprocess calls with shell=True. Since domain names flow directly into shell command strings without any sanitization, a Reseller or SuperAdmin can include shell metacharacters in a domain name to run arbitrary OS commands on the server.
The root cause is in modoboa/lib/sysutils.py:31:
kwargs["shell"] = True
process = subprocess.Popen(cmd, **kwargs)
When a create a domain is created with DKIM enabled, the domain name gets embedded into a shell command like this:
exec_cmd(f"openssl genrsa -out {dkim_storage_dir}/{domain.name}.pem {key_size}")
If the domain name contains something like $(id>/tmp/proof).example.com, the shell executes the injected command before running openssl.
The same pattern appears in several other places:
modoboa/admin/jobs.py:38 — mailbox rename via mv using full_addressmodoboa/amavis/lib.py:202 — sa-learn using domain.namemodoboa/admin/models/mailbox.py:150 — doveadm user using full_addressmodoboa/maillog/graphics.py:105–107 — rrdtool using domain.namemodoboa/webmail/models.py:54–57 — doveadm move/delete using account.email$(id>/tmp/proof).example.com with DKIM enabled/tmp/proofSomething like this will be displayed:
uid=0(root) gid=0(root) groups=0(root)
Confirmed on commit b521bcb4f (latest main at time of discovery).
An attacker with Reseller-level access (or higher) can execute arbitrary OS commands on the mail server — in a typical Modoboa deployment this means running as root. All six identified sinks are reachable through normal application workflows.
{
"cwe_ids": [
"CWE-78"
],
"github_reviewed_at": "2026-03-25T17:03:37Z",
"github_reviewed": true,
"severity": "HIGH",
"nvd_published_at": null
}