Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as RoleMember
-
DeliveryReport TCP/ICMP via owned agent
-
ExploitConcurrently delete the same service
-
ExecutionRace worker into nil pointer dereference
-
ImpactPanic crashes entire dashboard process
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V15 - Secure Coding and Architecture Concurrency control, locking
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 an authenticated Nezha account with RoleMember privileges plus a member-controlled agent bound to a service the member owns (versions 2.2.7 through 2.2.10). The attacker must concurrently (1) report TCP or ICMP results through their own agent and (2) invoke Delete on that same owned service, racing ServiceSentinel.worker so the delete removes serviceStatusToday/serviceCurrentStatusData entries after the owned-service check but before the worker dereferences those pointers under serviceResponseDataStoreLock. Limiting factors: authentication as RoleMember is mandatory (no unauthenticated path), the attacker needs control of their own agent, and exploitation hinges on winning the concurrency window (retriable). Not exploitable on versions before 2.2.7 or on fixed 2.2.11 / 2.3.0, which revalidate the entries and add serialization. |
| Impact | This is a genuine but bounded availability risk, best treated as a medium-priority denial-of-service issue rather than a top-tier emergency. The provided CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H, base 6.5) agrees with CWE-362 (race condition) and the description: impact is A:H only, with C:N/I:N confirming no data exposure. PR:L is consistent with the description's 'RoleMember' actor, so this is an authenticated attack, not an anonymous internet one. The one signal I would contest is AC:L - exploitation depends on winning a TOCTOU window between ServiceSentinel.Delete and the worker's dereference, which is more realistically AC:H; however, because the attacker controls both racing operations (their own agent's report and the delete of their own service) and can retry freely, the window is practically reachable, so the vendor's AC:L is defensible. No EPSS score, KEV entry, or public POC is present in the input: exploitation probability is therefore unquantified (EPSS unknown), and there is no public exploit identified at time of analysis. The amplifying factor not captured by the base score is multi-tenancy - a single low-privileged member can panic the entire gRPC process and take down every tenant's dashboard, REST API, and agent connectivity, so the blast radius exceeds the attacker's own authorization scope. Net: real and worth patching promptly in multi-tenant deployments, but not evidence of active, widespread exploitation. |
| Exploit ScenarioDerived | A low-privileged RoleMember on a shared Nezha instance points their own agent at an owned TCP/ICMP service and begins submitting monitoring results while simultaneously issuing a delete for that same service. By repeating this until the delete lands between the worker's validation and its pointer dereference, they trigger a nil pointer dereference; with no gRPC recovery interceptor, the resulting panic crashes the whole dashboard process and knocks every tenant offline. No public exploit is identified at time of analysis, though the fixing commit ships a lifecycle test that reproduces the stale-report-after-deletion condition. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 14, 2026
Denial of service in Nezha Monitoring 2.2.7 through 2.2.10 lets an authenticated RoleMember crash the whole dashboard process by racing their own agent's TCP/ICMP result report against deletion of a service the member owns, producing a nil pointer dereference in ServiceSentinel.worker that panics the process and takes down every tenant's web interface, REST API, and agent connections until the service is restarted. Confirmed actively exploited? No - no public exploit code or active exploitation has been identified at time of analysis, and the issue is availability-only (C:N/I:N/A:H) with no data disclosure or modification. The published CVSS of 6.5 (AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H) matches the assessed impact, but independent analysis rates attack complexity as High (AC:H) because the attacker must win a concurrency window between the ownership check and the pointer dereference; that window is retriable, so practical reliability is higher than a one-shot race would suggest.
RemediationAI
Vendor-released patch: upgrade to Nezha Monitoring 2.2.11 or 2.3.0, which revalidate the serviceStatusToday, serviceCurrentStatusData, and service registry entries and serialize Delete against report processing; the fixing change is upstream commit c893aa57867d8a3d608e2f2f16d1594c9766cdf3 and release notes are at https://github.com/nezhahq/nezha/releases/tag/v2.2.11 and https://github.com/nezhahq/nezha/releases/tag/v2.3.0, with full details in https://github.com/nezhahq/nezha/security/advisories/GHSA-qjpp-gffx-2wm9. If an immediate upgrade is not possible (2.2.7-2.2.10), the practical compensating controls are to run the dashboard under a supervisor that restarts it automatically (for example systemd Restart=always with a short RestartSec) so a panic-induced outage is measured in seconds rather than hours - the trade-off is that each crash still drops all tenants' agent connections, in-flight API calls and unpersisted state, and gives the attacker a repeatable tenant-wide disruption primitive; and to minimize the Blast radius by restricting RoleMember account creation and the ability for members to register their own agents and own services, since both the concurrent report and the concurrent delete must come from the same member's own resources. Isolating tenants onto separate dashboard instances or network segments reduces the scope of any single panic but does not remove the underlying race. There is no configuration flag that disables the vulnerable worker path short of upgrading, and note that the advisory's 'Information Disclosure' tag is not supported by the impact metrics (C:N/I:N/A:H) - do not prioritize this as a confidentiality issue.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 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
CVE-2026-100394 is a classic check-then-act race (CWE-362) layered on an unchecked nil dereference in Go. Nezha's ServiceSentinel singleton maintains per-service state in maps such as serviceStatusToday and serviceCurrentStatusData, guarded by serviceResponseDataStoreLock, while the service registry is guarded by servicesLock. The worker validated that the reporting member owned the service under servicesLock, then, after releasing that lock, dereferenced the pointer-valued entries taken from serviceStatusToday and serviceCurrentStatusData without re-checking that ServiceSentinel.Delete had not concurrently removed them under serviceResponseDataStoreLock. A RoleMember submitting TCP or ICMP results through their own bound agent while deleting the same owned service could therefore remove the map entries in the gap, leaving the worker with nil pointers and triggering a panic. Because the gRPC server had no recovery interceptor, the panic propagated out of the worker goroutine and terminated the entire dashboard process rather than a single handler, which is what escalates a local logic bug into a multi-tenant outage. The upstream fix in commit c893aa57867d8a3d608e2f2f16d1594c9766cdf3 tightens this in several ways: it takes serviceResponseDataStoreLock before reading the per-service state so that Delete and Update are serialized around the accepted report, revalidates that serviceStatusToday, serviceCurrentStatusData, and the service itself still exist and that the reporter may still report results for it, deletes the serviceResponsePing entry during Delete, and adds validation/before-TLS-side-effect hooks used by the new lifecycle test that asserts stale reports after deletion are ignored. The advisory and the accompanying servicesentinel_lifecycle_test.go confirm the maintainers treated this specifically as a stale-report-after-deletion lifecycle bug.
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:U/C:N/I:N/A:H
AV:N via remote gRPC agent reporting, PR:L for the required RoleMember account, AC:H because it depends on winning a TOCTOU race, impact A:H only with C:N/I:N.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
Nezha Monitoring is a self-hostable, lightweight, servers and websites monitoring and O&M tool. From 2.2.7 until 2.2.11, ServiceSentinel.worker in service/singleton/servicesentinel.go checked an owned service under servicesLock and later dereferenced pointer-valued serviceStatusToday and serviceCurrentStatusData entries under serviceResponseDataStoreLock without revalidating that ServiceSentinel.Delete had not removed them. A RoleMember could concurrently report TCP or ICMP results through the member's own agent and delete the same owned service, causing a nil pointer dereference. Because the gRPC server had no recovery interceptor, the worker panic terminated the whole dashboard process and disrupted every tenant's web interface, REST API, and agent connections. The issue affects availability only and does not disclose or modify data. This issue is fixed in versions 2.2.11 and 2.3.0.
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
Race conditions occur when multiple concurrent requests exploit the brief time gap between checking a condition and acting upon it (TOCTOU - Time of Check, Time of Use).
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
Cross-tenant session hijacking in Nezha Monitoring (v1.14.13-1.14.14 and v2.0.0-2.0.9) lets any authenticated low-privil
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
Nezha monitoring dashboards running versions 1.0.0 through 2.3.14 can be knocked offline by an authenticated user who ho
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
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
EUVD-2026-101303
GHSA-qjpp-gffx-2wm9
NVD
CVE.org
EPSS
Exploit-DB