Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as RoleMember
-
DeliveryHarvest live stream UUID from logs/referer/telemetry
-
ExploitConnect to /ws/terminal/:id or /ws/file/:id
-
ExecutionPass existence-only auth check
-
PersistAttach to victim WebSocket pipe
-
ImpactExecute shell commands / read-write files on target server
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Object-level authorization, IDOR prevention
|
| Exploitation Conditions | Requires an authenticated Nezha dashboard account of at least RoleMember (PR:L), plus a currently-live terminal or file-manager stream created by another user, plus knowledge of that session's stream UUID obtained from a side channel - specifically reverse-proxy access logs, Referer headers, browser history/bookmark sync, frontend telemetry (Sentry/Bugsnag) breadcrumbs, or a shared-tenant log viewer, because the UUID is exposed as the URL path component of /ws/terminal/:id or /ws/file/:id. Limiting factors: exploitation is not possible against a single-user instance (needs another victim user), the target session must be active at attach time, and the attacker must first authenticate to the dashboard; it does NOT require admin rights, user interaction from the victim, or any non-default configuration - the missing ownership check is present in default builds of the affected versions. |
| Impact | Signals are largely consistent toward high priority. The CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H, 9.9) reflects network-reachable, low-privilege, no-interaction attack with a scope change into the monitored server yielding full CIA loss - plausible given the outcome is shell/file access. The one nuance: exploitation is not fully deterministic because it requires obtaining a currently-live stream UUID via a side channel and racing an active session, which is an attacker-external condition arguably closer to AC:H than AC:L; this is why my independent assessment lowers the score somewhat. EPSS is not provided and cannot be cited. KEV: not listed, so no confirmed active exploitation. POC: no standalone exploit is published, but the fix commit ships explicit ownership-hijack regression tests that document the exact preconditions, materially lowering the bar to weaponization. Net: a legitimately high-priority issue for any multi-user/multi-tenant Nezha deployment, tempered mainly by the need for a UUID leak and a concurrently live victim session rather than any high-CVSS-but-low-real-risk mismatch. |
| Exploit ScenarioDerived | A low-privileged RoleMember on a shared Nezha dashboard monitors the reverse-proxy access logs (or a shared log viewer / Sentry breadcrumbs) and spots an admin opening wss://dashboard/ws/terminal/<UUID> to a production server. While that session is live, the member connects to the same /ws/terminal/<UUID>, which only checks that the UUID exists, and is joined into the bidirectional pipe - gaining an interactive shell on the target server and full file-manager read/write. No public standalone exploit exists, but the fix commit's regression tests demonstrate the exact hijack. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 21, 2026
Cross-tenant session hijacking in Nezha Monitoring (v1.14.13-1.14.14 and v2.0.0-2.0.9) lets any authenticated low-privilege RoleMember attach to another user's live WebSocket terminal or file-manager session and gain interactive shell access and full file read/write on the monitored target server. The flaw stems from stream UUIDs at GET /ws/terminal/:id and GET /ws/file/:id being validated only for existence, never bound to their creating user, so an attacker who learns a live UUID from access logs, referer headers, browser history, or telemetry breadcrumbs achieves cross-tenant remote code execution. Fixed in v2.0.10; no public exploit identified at time of analysis, though the upstream commit and its regression tests fully disclose the mechanism.
RemediationAI
Vendor-released patch: upgrade to Nezha v2.0.10, which binds each stream to its creator UID and enforces IsStreamAuthorizedForUser before the WebSocket upgrade (commit 6661d6a, advisory GHSA-q6xx-5vr8-p898, release https://github.com/nezhahq/nezha/releases/tag/v2.0.10). Deployments still on the 1.14.x line have no patched release on that branch and should migrate to the 2.0.10 release line. Where immediate upgrade is impossible, reduce exposure by restricting dashboard membership to fully trusted operators only (since exploitation requires an authenticated RoleMember) and by eliminating the UUID-leak channels: strip or avoid logging the /ws/terminal/:id and /ws/file/:id paths in reverse-proxy access logs (nginx/Caddy/Cloudflare), suppress Referer leakage and disable frontend error-reporting/telemetry (Sentry/Bugsnag) breadcrumbs that capture WebSocket URLs, and disable terminal and file-manager features entirely if not required - noting the trade-off that this removes legitimate remote O&M capability. These are mitigations, not fixes; only 2.0.10 removes the missing ownership check.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 3 packages in go, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Nezha is a self-hostable, lightweight server/website monitoring and operations tool with a dashboard-to-agent RPC channel that brokers interactive terminals and a web file manager over WebSockets. When a user opens a session, createTerminal/createFM allocate an in-memory stream keyed by a random UUID in service/rpc/io_stream.go (CreateStream), and the client then connects to /ws/terminal/:id or /ws/file/:id. The vulnerable CreateStream stored only channel handles with no owner field, and the attach handlers (terminalStream in terminal.go, fmStream in fm.go) authorized the caller solely via GetStream(streamId) - an existence check on the map - never comparing getUid(c) against the stream's creator. This is a textbook CWE-639 (Authorization Bypass Through User-Controlled Key / IDOR): the UUID is treated as an unguessable capability token, but it travels as a URL path component and therefore leaks into logs and side channels, collapsing the security boundary. The vendor fix adds an owner UID to CreateStream and an IsStreamAuthorizedForUser(streamId, uid, isAdmin) check before the WebSocket upgrade.
Know when Nezha 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:C/C:H/I:H/A:H
AV:N and PR:L (any authenticated member); AC:H because the attacker must obtain a live UUID via an out-of-band leak and race an active session; S:C and C/I/A:H reflect RCE on a separate monitored server.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Nezha Monitoring is a self-hostable, lightweight, servers and websites monitoring and O&M tool. Nezha versions 1.14.13 through 1.14.14 and 2.0.0 through 2.0.9 do not bind stream identifiers created by CreateStream in service/rpc/io_stream.go to their creating user, and GET /ws/terminal/:id and GET /ws/file/:id only check whether the supplied UUID exists. An authenticated RoleMember who obtains a live stream UUID from logs, browser history, referer data, or telemetry can attach to another user's terminal or file-manager session, read and write target-server files, and execute shell commands. This issue is fixed in version 2.0.10.
Executive ViewAI
Nezha Monitoring v1.14.13-1.14.14 and v2.0.0-2.0.9 are vulnerable to critical cross-tenant session hijacking, allowing any low-privilege user to gain remote code execution and file system access on monitored servers. No public exploit identified at time of analysis; however, the CVSS 9.9 rating and immediate availability of vendor-released patch v2.0.10 require urgent deployment.
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.
Host header injection in Nezha 2.2.3's OAuth2 redirect endpoint (/api/v1/oauth2/{provider}) allows an unauthenticated re
Unauthenticated path traversal in Nezha Monitoring (nezhahq/nezha) before 2.0.13 allows remote attackers to read arbitra
Host header injection in Nezha Monitoring versions 1.0.0 through 2.2.0 allows unauthenticated remote attackers to redire
Unbounded WebSocket stream allocation in Nezha Monitoring versions 1.0.0 through 2.1.x allows any authenticated dashboar
Nezha Monitoring versions 2.0.14 through 2.1.0 (exclusive) allows any authenticated user to exploit the NAT-based Host c
Nezha monitoring dashboards running versions 1.0.0 through 2.3.14 can be knocked offline by an authenticated user who ho
Resource exhaustion in Nezha 2.0.13 through 2.3.14 allows an authenticated user to open unbounded concurrent connections
Cleartext third-party credentials are exposed to any authenticated principal holding DDNS read access in Nezha versions
Permanent deadlock of the alerting subsystem in Nezha Dashboard 1.8.0 through 2.3.12 allows any authenticated non-admin
Authenticated privilege escalation in Nezha Dashboard before 2.3.5 lets any account holding the nezha:service:write scop
Denial of service in the Nezha monitoring dashboard before 2.3.8 lets any authenticated non-administrator account crash
Nezha Monitoring versions prior to 2.2.5 expose stored third-party API credentials in plaintext through two listing API
EUVD-2026-64139
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB