Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as low-privileged dashboard user
-
DeliveryPOST /api/v1/batch-delete/service to delete own service
-
ExploitOrphaned service_histories rows remain
-
ExecutionNULL pointer dereference in loadTodayStats on next startup
-
ImpactDashboard panics in crash loop until rows removed
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A10:2025 - Mishandling of Exceptional Conditions
ASVS 5.0
V16 - Security Logging and Error Handling Null pointer safety, defensive checks
MITRE ATT&CK
1 technique across 1 tactic: Impact The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires an authenticated dashboard account (PR:L) capable of calling POST /api/v1/batch-delete/service to delete its own service, and it only harms deployments running the dashboard in non-TSDB mode - the description scopes the crash to 'the non-TSDB dashboard.' The denial of service is not instantaneous: it manifests only on the dashboard's next startup/restart, when loadTodayStats processes the orphaned service_histories rows, and persists across restarts until an operator manually deletes those rows. Limiting factors: authentication is mandatory (no anonymous path), TSDB-backed configurations appear unaffected, and the attacker cannot directly choose the trigger moment since it depends on a restart occurring. |
| Impact | This is a genuine but low-urgency availability issue, not a widespread-exploitation priority. The CVSS 4.0 vector (AV:N/AC:H/AT:P/PR:L/UI:N) and the 6.0 Medium score align well with the description: impact is confined to availability (VA:H; VC:N/VI:N), the attacker must be authenticated (PR:L), and the crash does not fire on demand but only on the dashboard's next startup - consistent with AC:H and the AT:P attack-requirement, since the attacker does not control when the restart occurs. There is no KEV listing and no verified public exploit code (only a vendor advisory and the patch commit are referenced), so exploitation status is 'no public exploit identified at time of analysis'; EPSS was not supplied. vuln.today assigns the decision label 'this_month', and SSVC-style signals agree: a low-privileged but legitimate user can self-inflict the condition, technical impact is a denial of service rather than code execution or data loss. One important conditional limit the raw vector does not convey: the crash only affects the non-TSDB dashboard configuration, so TSDB-backed deployments are not in scope per the description. Net: a real, patch-worthy robustness bug in a self-hosted product, but low real-world risk relative to its score - no confidentiality or integrity impact and a prerequisite of authenticated access. |
| Exploit ScenarioDerived | A low-privileged but authenticated Nezha dashboard user issues POST /api/v1/batch-delete/service to delete their own service, which hard-deletes the service but leaves orphaned service_histories rows behind. On the dashboard's next startup, ServiceSentinel.loadTodayStats dereferences a nil status map entry for that orphaned history and the process panics, producing a crash that recurs on each startup until the rows are removed manually. No public exploit code is identified; the bug and fix are confirmed from the vendor commit and VulnCheck advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 30, 2026
An authenticated dashboard user in Nezha 2.0.0 through 2.3.x can cause a persistent denial of service against non-TSDB deployments by deleting a service through POST /api/v1/batch-delete/service, which leaves orphaned service_histories rows behind. On the dashboard's next startup, ServiceSentinel.loadTodayStats dereferences the missing per-service status map entries for those leftover rows and panics, and the crash repeats on every restart until an operator manually removes the orphaned history. The trigger is not immediate and depends on a restart occurring, and TSDB-backed configurations appear unaffected; no public exploit code was identified at time of analysis and the issue is not in CISA KEV. Vendor-released patch: 2.4.0.
RemediationAI
Upgrade to Nezha 2.4.0 or later, which contains commit efd3e07b901d6acf7ef2ab3b26458cc07e7605dc adding nil checks in ServiceSentinel.loadTodayStats (release notes at https://github.com/nezhahq/nezha/releases/tag/v2.4.0). For instances that cannot be upgraded immediately, operators running a non-TSDB dashboard should proactively purge orphaned history rows (service_histories rows whose service_id no longer exists in the services table) before the next restart, since that is the only thing that clears an already-triggered crash loop; the trade-off is permanent loss of that historical monitoring data. Restricting dashboard accounts that can call POST /api/v1/batch-delete/service limits the authenticated attack surface, but the deletion API is a normal administrative capability and narrowing it may disrupt legitimate workflows. Transitioning the dashboard to TSDB-backed storage avoids the affected loadTodayStats accumulation path, at the cost of a storage migration. Note that neither workaround removes the underlying defect, so the version upgrade is the complete fix.
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
Nezha is a Go-based server and service monitoring panel. The affected code is ServiceSentinel.loadTodayStats (service/singleton/servicesentinel.go), which on startup iterates aggregated service_histories rows and accumulates Up/Down counters into two maps keyed by service ID, serviceStatusToday and monthlyStatus. Those maps are populated only for services that actually exist at startup, so history rows belonging to a service that has been hard-deleted (or to a quarantined service with a legacy invalid type) have no corresponding map entry; the unguarded map lookups return nil pointers and the subsequent field increments panic, aborting dashboard startup. The root cause class is CWE-476 (NULL Pointer Dereference), a reliability defect rather than a memory-safety issue, which is why the impact is scored as availability-only. The upstream fix in commit efd3e07b901d6acf7ef2ab3b26458cc07e7605dc hoists both map lookups into local variables and skips rows where either is nil, with a regression test covering retained, deleted, and quarantined service states. The storage backend matters: the affected accumulation path is the non-TSDB path, and the vulnerability description scopes the crash to the non-TSDB dashboard.
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
CVSS:4.0/AV:N/AC:H/AT:P/PR:L/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Authenticated API call (PR:L) over the network; AC:H because the panic only fires on an attacker-uncontrolled next startup; impact is availability-only (A:H, C:N/I:N) in non-TSDB mode.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
DescriptionCVE.org
Nezha 2.0.0 before 2.4.0 contains a NULL pointer dereference vulnerability in ServiceSentinel.loadTodayStats that allows authenticated users to crash the dashboard by deleting a service. Attackers can delete their own service via POST /api/v1/batch-delete/service, leaving orphaned service_histories rows that crash the non-TSDB dashboard on its next startup until removed manually.
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
A null pointer dereference occurs when a program attempts to access memory through a pointer that has been set to NULL (address 0x0).
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
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
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
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
EUVD-2026-114328
GHSA-9764-g6f6-xvmw
NVD
CVE.org
EPSS
Exploit-DB