Severity by source
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Network, unauthenticated (PR:N/UI:N) with root-level C/I/A impact, but AC:H because execution requires the non-default sudo condition (root/NOPASSWD/cached timestamp); no scope change so S:U.
Primary rating from Vendor (vulncheck).
CVSS VectorVendor: vulncheck
Lifecycle Timeline
2DescriptionCVE.org
9Router before 0.4.44 contains an OS command injection vulnerability in the unauthenticated POST /api/tunnel/tailscale-install endpoint (this route is not covered by the dashboard middleware matcher, so no authorization check is applied). The sudoPassword field from the request body is written to the stdin of a 'sudo -S sh' child process. When sudo does not prompt for a password (the process runs as root, NOPASSWD is configured, or a recent sudo timestamp cache exists), the sudoPassword value is interpreted by sh as a shell command, allowing a remote unauthenticated attacker to execute arbitrary OS commands. Exploitation evidence was first observed by the Shadowserver Foundation on 2026-07-04 (UTC).
AnalysisAI
Remote unauthenticated OS command injection in 9Router before 0.4.44 lets attackers run arbitrary commands as root via the POST /api/tunnel/tailscale-install endpoint, which is excluded from the dashboard authorization middleware. The attacker-supplied sudoPassword field is piped to the stdin of a 'sudo -S sh' child process; when sudo does not prompt for a password, sh interprets that value as a shell command. Active exploitation evidence was reported by the Shadowserver Foundation on 2026-07-04; this is not (yet) listed in CISA KEV, and no public exploit code is referenced in the supplied data.
Technical ContextAI
9Router is an open-source tunneling/router management application (decolua/9router) that exposes an HTTP API and dashboard. The flawed route, /api/tunnel/tailscale-install, is intended to install Tailscale by elevating privileges through 'sudo -S sh', reading the sudo password from stdin. The root cause is CWE-78 (Improper Neutralization of Special Elements used in an OS Command): rather than being consumed solely as a password, the sudoPassword body field flows into the stdin of an interactive shell ('sh'). Compounding this, the route path is not matched by the dashboard middleware matcher, so no authentication or authorization is enforced before the privileged command path is reached. When sudo returns without prompting - because the process already runs as root, NOPASSWD is set in sudoers, or a recent sudo timestamp cache is valid - the string that was meant to be a password is instead read by sh as a command line.
RemediationAI
Upgrade to 9Router 0.4.44 or later - Vendor-released patch: 0.4.44 - per GitHub advisory GHSA-g6g7-pvmx-m74p (https://github.com/decolua/9router/security/advisories/GHSA-g6g7-pvmx-m74p) and the VulnCheck advisory (https://www.vulncheck.com/advisories/9router-os-command-injection-via-sudopassword-parameter-in-tailscale-install-endpoint). If immediate patching is not possible, block or restrict network access to the /api/tunnel/tailscale-install endpoint at a reverse proxy or firewall (deny unauthenticated external access to the 9Router API/dashboard port), which prevents remote reach but will also break the Tailscale-install workflow. Reduce the impact of the sudo path by ensuring the 9Router service does not run as root and removing any NOPASSWD sudoers entry it relies on, and shorten or disable the sudo timestamp cache (timestamp_timeout=0) so a cached credential cannot be abused - note this may break other automation that depended on passwordless sudo. Because active exploitation has been observed, also inspect exposed hosts for post-exploitation activity rather than relying on mitigation alone.
Same weakness CWE-78 – OS Command Injection
View allSame technique Command Injection
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-42073
GHSA-g6g7-pvmx-m74p