Skip to main content

Nezha Monitoring EUVDEUVD-2026-101303

| CVE-2026-100394 MEDIUM
Race Condition (CWE-362)
2026-10-14 GitHub_M GHSA-qjpp-gffx-2wm9
6.5
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Authenticate as RoleMember
  2. Delivery
    Report TCP/ICMP via owned agent
  3. Exploit
    Concurrently delete the same service
  4. Execution
    Race worker into nil pointer dereference
  5. Impact
    Panic 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

nezha 2.2.7, < 2.2.11

Affected Packages

go github.com/nezhahq/nezha fix: 0.0.0-20260721131105-c893aa57867d
euvd nezha fix: 2.2.11

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

Vendor (GitHub_M) PRIMARY 6.5 MEDIUM
AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
vuln.today AI 5.3 MEDIUM

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.

3.1 AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:P/PR:L/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
High

Lifecycle Timeline

1
Patch available
Oct 14, 2026 - 17:18 EUVD

DescriptionCVE.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

EPSS Score
0.4%
Top 65% exploitable
Prevalence
Low
niche self-hostable open-source monitoring tool, limited enterprise footprint
Threat Intel
1
1 source
Data Quality
4 sources
Confidence: Medium

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact· derived
Medium

Priority Score

32
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +32
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

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).

More in Nezha

View all
CVE-2026-101090 CRITICAL POC
9.3 Sep 27

Host header injection in Nezha 2.2.3's OAuth2 redirect endpoint (/api/v1/oauth2/{provider}) allows an unauthenticated re

CVE-2026-53519 CRITICAL POC
9.1 Jun 12

Unauthenticated path traversal in Nezha Monitoring (nezhahq/nezha) before 2.0.13 allows remote attackers to read arbitra

CVE-2026-62283 CRITICAL
9.9 Aug 21

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

CVE-2026-111383 HIGH
7.1 Oct 16

Resource exhaustion in Nezha 2.0.13 through 2.3.14 allows an authenticated user to open unbounded concurrent connections

CVE-2026-111387 HIGH
7.1 Oct 16

Cleartext third-party credentials are exposed to any authenticated principal holding DDNS read access in Nezha versions

CVE-2026-105113 HIGH
7.1 Oct 03

Permanent deadlock of the alerting subsystem in Nezha Dashboard 1.8.0 through 2.3.12 allows any authenticated non-admin

CVE-2026-111384 HIGH
7.1 Oct 16

Nezha monitoring dashboards running versions 1.0.0 through 2.3.14 can be knocked offline by an authenticated user who ho

CVE-2026-101086 HIGH
7.1 Sep 27

Authenticated privilege escalation in Nezha Dashboard before 2.3.5 lets any account holding the nezha:service:write scop

CVE-2026-101085 HIGH
7.1 Sep 27

Denial of service in the Nezha monitoring dashboard before 2.3.8 lets any authenticated non-administrator account crash

CVE-2026-59155 MEDIUM
6.9 Jul 10

Nezha Monitoring versions prior to 2.2.5 expose stored third-party API credentials in plaintext through two listing API

CVE-2026-53523 MEDIUM POC
6.8 Jun 12

Host header injection in Nezha Monitoring versions 1.0.0 through 2.2.0 allows unauthenticated remote attackers to redire

CVE-2026-53522 MEDIUM POC
6.5 Jun 12

Unbounded WebSocket stream allocation in Nezha Monitoring versions 1.0.0 through 2.1.x allows any authenticated dashboar

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy