Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate with normal low-privilege account
-
DeliveryHarvest victim/admin userId from member list or UI
-
ExploitPOST invalidateUser with victim userId + bogus deviceId
-
ExecutionHandler takes no-device branch and sets isActive=false
-
ImpactVictim admin locked out, org management denied
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Authorization checks on every request
MITRE ATT&CK
1 technique across 1 tactic: Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires (1) a valid authenticated ZTNET account of any privilege level - the attacker uses their own normal session, so deployments that allow open self-registration are directly exposed while closed/admin-approved registration raises the bar; and (2) knowledge of the target's userId, which the advisory notes can be gleaned from member lists, UI responses, logs, or other application metadata. The specific trigger is supplying the victim's userId together with a deviceId that has no matching row in the UserDevice table, which forces the handler into the branch that sets the target's isActive=false. Limiting factors: affects only ZTNET <= 0.7.18 (fixed in 0.8.0); no confidentiality exposure and no code execution - impact is limited to deactivating accounts/denial of login; no user interaction is required from the victim. |
| Impact | Signals mostly align toward a genuine but bounded priority. The CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N) describes a network-reachable, low-complexity flaw requiring a low-privilege authenticated account - matching CWE-862 (missing authorization): the handler calls getServerSession/getSession to confirm a session exists but never compares session.user.id to the client-supplied userId. The real-world impact is denial of service / account takeover-level lockout, not confidentiality loss (C:N), so despite the 8.1 score this is a DoS/integrity issue rather than code execution or data theft. There is NO CISA KEV entry and NO EPSS score in the supplied data, so exploitation-in-the-wild and statistical exploitation probability are both unknown and must not be assumed; however a detailed public proof-of-concept exists in the GHSA advisory and was confirmed dynamically on v0.7.18, so the barrier to exploitation is low for anyone who can obtain an account. No SSVC exploitation/automatable/technical-impact decision tree was provided - only the vuln.today 'this_week' priority label, which is consistent with 'patch within the week' rather than emergency. Net: for any multi-user or organization ZTNET instance where untrusted users can register, this is a real near-term priority because any normal user can permanently lock out administrators; for single-admin or closed-registration deployments the practical risk is much lower because the attacker must first hold a valid account. |
| Exploit ScenarioDerived | A low-privilege user who already holds (or can self-register) a normal ZTNET account logs in to obtain a session cookie, learns an administrator's user ID from a member list or UI response, and sends a single POST to /api/auth/user/invalidateUser with the victim's userId and a random non-existent deviceId. Because the (userId, deviceId) pair is not found in UserDevice, the handler sets the admin's isActive to false, and that admin can no longer log in (rejected as account-expired). A working step-by-step PoC is published in the GHSA advisory and was confirmed dynamically against v0.7.18; the network vector and low attack complexity make the request trivial to replay. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 30, 2026
ZTNET through 0.7.18 allows any authenticated low-privilege user to deactivate another account, including an administrator, by submitting a victim's userId together with a deviceId that has no matching UserDevice row to POST /api/auth/user/invalidateUser; the handler then sets isActive=false and the victim's login is refused with account-expired. The root cause is a missing authorization check (CWE-862) in a Next.js API route, so impact is confined to account availability and administrative disruption, with no confidentiality exposure or code execution. A public proof-of-concept procedure confirmed against v0.7.18 is published in the vendor advisory, and the issue is fixed in 0.8.0; no CISA KEV entry is associated with this CVE.
RemediationAI
Vendor-released patch: upgrade to ZTNET 0.8.0 (https://github.com/sinamics/ztnet/releases/tag/v0.8.0), which is the version the advisory names as fixed. The upstream fix is PR #941 (https://github.com/sinamics/ztnet/pull/941), which deletes src/pages/api/auth/user/invalidateUser.ts entirely, and the corresponding commit is 7966af6e62aa5778d3a698cee97053fdcb07d742; the advisory is GHSA-vqfc-cmp9-c33q. No vendor-documented workaround exists for 0.7.18, so organizations that cannot upgrade immediately should reduce the pool of accounts able to reach the endpoint - if open self-registration is enabled, disable it or require administrator approval, since the attack needs only a normal authenticated session and a victim userId, which the advisory notes may be exposed in member lists, UI responses, logs, or other application metadata. Accounts already locked out can be restored only by setting isActive back to true for the affected user, which requires database or administrative access rather than user self-service. Removal of the endpoint in 0.8.0 is the only complete fix; blocking the route at a reverse proxy is a stopgap whose side effects depend on whether legitimate device-activity updates rely on it.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
ZTNET is a Next.js application fronting a ZeroTier private controller, using better-auth for sessions and Prisma for persistence. The vulnerable route, src/pages/api/auth/user/invalidateUser.ts, calls auth.api.getSession and only verifies that a session exists; it never compares session.user.id with the userId supplied in the request body. It then performs a Prisma userDevice.findUnique lookup on the composite (userId, deviceId) key and, in an inverted branch, treats a missing pairing as a reason to run prisma.user.update setting isActive=false on the client-supplied userId rather than merely failing or updating lastActive. Because src/server/auth.ts refuses login when user.isActive is false, the target is locked out with an account-expired error. This is CWE-862 Missing Authorization: an authenticated function lacks an ownership/role check on the object identifier it acts upon. The supplied CPE, cpe:2.3:a:sinamics:ztnet:*:*:*:*:*:*:*:*, is version-wildcarded, but the advisory and release metadata bound the issue to releases up to and including 0.7.18, fixed in 0.8.0. The 8.1 vendor score reflects High integrity impact; the independent assessment rates integrity as Low because the state change is a single account flag rather than modification of application data, while availability remains High.
Know when Ztnet gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
Network API, trivial single request (AC:L) needing any authenticated account (PR:L); no data read (C:N), only one flag flipped (I:L), but full account/admin lockout (A:H). NVD rated I:H.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
ZTNET is a ZeroTier web UI for private controllers with multiuser and organization support. Prior to 0.8.0, any authenticated low-privilege user can permanently deactivate another account, including an administrator, through POST /api/auth/user/invalidateUser. In src/pages/api/auth/user/invalidateUser.ts, getServerSession checks only that a session exists and does not compare session.user.id with the client-supplied userId. Supplying a victim's userId and a deviceId for which no matching pair exists in UserDevice makes the handler set the target account's isActive to false. Login is then refused by src/server/auth.ts with account-expired. An attacker needs only a normal authenticated account and the victim's user ID, which may be obtainable from member lists, UI responses, logs, or other application metadata. This can lock administrators out, disrupt organization management, and deny access to any targeted user. This issue is fixed in version 0.8.0.
Technical POC Analysis
CWE-862 (Missing Authorization) in a Next.js API route: src/pages/api/auth/user/invalidateUser.ts.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
ZTNET, a zero-trust networking platform, contains a high-severity authorization flaw (CVE-2026-62967) enabling any authenticated low-privilege user to deactivate administrator accounts, causing operational disruption and lockout of critical personnel. While no data breach or code execution is possible, the potential for administrative denial-of-service warrants immediate remediation to prevent insider misuse or lateral abuse of valid credentials.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
EUVD-2026-114470
NVD
CVE.org
EPSS
GitHub
Exploit-DB