CVE-2026-89096: Nfs-utils: nfs-utils: denial of service via memory leak in rpc.statd

Published Apr 26, 2026
·
Updated

A flaw was found in nfs-utils. An unauthenticated remote attacker can trigger a Denial of Service (DoS) by sending repeated state notification requests to an exposed rpc.statd service. The service fails to properly release memory allocated during callback processing, leading to continuous memory growth. Sustained requests can exhaust system resources, eventually causing the service to degrade or crash.

Other sources

AIONLYREPORT package: nfs-utils-2.8.3-5.el102 ------ Summary: Memory Leak in nlistfree Leading to Remote Denial of Service: rpc.statd leaks notifylist structures during matching SMNOTIFY callback cleanup, allowing sustained heap growth and eventual denial of service in exposed deployments. Requirements to exploit: The attacker needs network reachability to rpc.statd on a deployment that accepts remote SMNOTIFY requests, at least one monitored host present in rtnl, and a monname or source address that matches that monitored host while alternating state values. Host-based access controls or firewalling can reduce or block reachability in some deployments. Component affected: nfs-utils rpc.statd: utils/statd/notlist.c (nlistfree), remote SMNOTIFY handling in utils/statd/callback.c, callback cleanup in utils/statd/rmtcall.c, and related rtnl cleanup in utils/statd/monitor.c Version affected: nfs-utils-2.8.3-5.el102 when rpc.statd is running, accepts remote SMNOTIFY traffic, and has at least one monitored host entry present Patch available: no released package fix established; proposed patch included below Version fixed: unknown Upstream coordination: Not notified. CVSS: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H - 5.9 (MEDIUM) AV:N - The vulnerable entry point is the network-facing SMNOTIFY path in rpc.statd. AC:H - Successful exploitation requires a reachable deployment, a matching monitored host, and sustained state-changing SMNOTIFY traffic. PR:N - The vulnerable code path itself does not require prior authentication. UI:N - No user interaction is required once the service is reachable. S:U - The impact remains within the rpc.statd service boundary. C:N - No confidentiality impact is established by the available evidence. I:N - No integrity impact is established by the available evidence. A:H - Repeated requests can drive unbounded heap growth in rpc.statd and eventually degrade or stop service. Impact: Moderate. Under Red Hat's severity guidance, remote denial of service issues are often Important when they are easy to trigger. Here, exploitation is more constrained because it depends on exposed rpc.statd, an existing monitored-host match, and repeated state toggling, so Moderate is the better fit. Embargo: no Reason: This is a configuration-dependent availability issue with no demonstrated confidentiality or integrity impact, and exposure can be reduced immediately by restricting access to rpc.statd. Acknowledgement: Aisle Research Vulnerability Details: The code shows an ownership mismatch around nlistfree(). The function removes an entry from its list and frees internal strings, but it does not free the notifylist structure itself: c void nlistfree(notifylist head, notifylist entry) { if (head && (head)) nlistremove(head, entry); if (NLMYNAME(entry)) free(NLMYNAME(entry)); if (NLMONNAME(entry)) free(NLMONNAME(entry)); free(entry->dnsname); } Remote SMNOTIFY handling can allocate fresh notifylist objects by cloning a matched monitored-host entry and queueing it on notify whenever the state changes: c for (lp = rtnl ; lp ; lp = lp->next) if (NLSTATE(lp) != argp->state && (statdmatchhostname(argp->monname, lp->dnsname) || statdmatchhostname(ipaddr, lp->dnsname))) { NLSTATE(lp) = argp->state; call = nlistclone(lp); nlistinsert(&notify, call); } Those queued entries are later cleaned only with nlistfree() in the callback processing paths, without a corresponding free() of the structure: c } else { xlog(DGENERAL, "%s: Callback to %s (for %s) succeeded", func, NLMYNAME(lp), NLMONNAME(lp)); } nlistfree(&notify, lp); return 1; } ... } else { xlog(LERROR, "%s: Can't callback %s (%d,%d), giving up", func, NLMYNAME(entry), NLMYPROG(entry), NLMYVERS(entry)); nlistfree(&notify, entry); } } Taken together, these observed code paths create a repeatable allocate-then-leak cycle on the notify queue. The established impact is denial of service through memory growth. The same ownership mismatch also appears in SMUNMON and SMUNMONALL cleanup for rtnl entries, which is why the proposed patch below also adds explicit free(clnt) calls in utils/statd/monitor.c. Remote exploitability remains deployment-dependent because the request must reach rpc.statd and satisfy the monitored-host matching logic. Steps to reproduce: 1. Start rpc.statd in a deployment where it accepts remote SMNOTIFY traffic and has at least one monitored host entry loaded or registered (rtnl != NULL). 2. Identify a monitored host name or source address that satisfies the statdmatchhostname() comparison against lp->dnsname. 3. Send repeated SMNOTIFY RPC requests for that host while alternating state values so NLSTATE(lp) != argp->state remains true. 4. Allow the event loop to process queued entries through processnotifylist() and processreply(). 5. Observe rpc.statd RSS or heap usage growing over time until the service becomes degraded or unavailable. Mitigation: Until a fix is available, restrict network access to rpc.statd to trusted NFS peers only. Where supported by the build and deployment, host-based access controls and firewall rules can block untrusted SMNOTIFY sources. Restarting rpc.statd reclaims leaked memory but does not remove the underlying flaw. Proposed Fix: A minimally scoped correction is to keep nlistfree() ownership semantics unchanged and explicitly free callers that currently leak after cleanup: diff diff --git a/utils/statd/rmtcall.c b/utils/statd/rmtcall.c @@ nlistfree(&notify, lp); + free(lp); return 1; @@ nlistfree(&notify, entry); + free(entry); } } diff --git a/utils/statd/monitor.c b/utils/statd/monitor.c @@ nsmdeletemonitoredhost(clnt->dnsname, monname, myname, 1); nlistfree(&rtnl, clnt); + free(clnt); return (&result); @@ nsmdeletemonitoredhost(clnt->dnsname, monname, myname, 1); nlistfree(&rtnl, clnt); + free(clnt); ++count; clnt = temp; This avoids changing nlistfree() ownership semantics globally and prevents introducing double-free bugs at mixed call sites. ------ This report was generated using AI technology. Always review AI-generated content prior to use

— Red Hat

Affected Software

9 affected components
redhat/nfs-utils=2.8.3-5.el10_2
ubuntu/nfs-utils*
ubuntu/nfs-utils*
ubuntu/nfs-utils*
ubuntu/nfs-utils*
ubuntu/nfs-utils*
ubuntu/nfs-utils*
ubuntu/nfs-utils*
ubuntu/nfs-utils*

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Compensating control

    Restrict network access to rpc.statd so that it accepts remote SM_NOTIFY traffic only from trusted NFS peers, using host-based access controls or firewall rules.

  2. Compensating control

    Implement the proposed source correction: preserve nlist_free() ownership semantics and explicitly free callback allocations, including clnt and the relevant notify_list entries, in the callback-processing paths.

  3. Operational

    Restart rpc.statd to reclaim memory leaked by the affected code path; this is only a temporary measure and does not remove the underlying flaw.

Event History

Apr 26, 2026
Data Sourced
via Red Hat·06:58 PM
DescriptionSeverityAffected Software
Oct 16, 2026
CVE Published
via MITRE·11:06 PM
Data Sourced
via MITRE·11:06 PM
DescriptionSeverityWeakness
Data Sourced
via OSV·11:17 PM
DescriptionSeverityAffected Software
Data Sourced
via NVD·11:17 PM
DescriptionSeverityWeakness

Frequently Asked Questions

1

What conditions must exist for exploitation?

The attacker needs network reachability to rpc.statd on a deployment that accepts remote SM_NOTIFY requests. At least one monitored host must be present in rtnl, and the attacker must use a mon_name or source address matching that host while alternating state values.

2

Is an exposed rpc.statd service always exploitable?

No. Exposure alone is not sufficient based on the available information: the service must accept remote SM_NOTIFY requests and have a matching monitored-host entry. The described attack also depends on alternating state values in repeated requests.

3

What can be done if patching is not immediately possible?

Restrict or block network access to rpc.statd with host-based access controls or firewall rules. This can reduce or eliminate an attacker's ability to send the required SM_NOTIFY requests.

4

What operational impact should responders watch for?

Repeated matching state-notification requests can cause continuous memory growth in rpc.statd during callback processing. Sustained activity may exhaust system resources and cause service degradation or a crash.

5

Which reported package build is associated with this issue?

The supplied report identifies nfs-utils-2.8.3-5.el10_2. The affected component is rpc.statd in nfs-utils.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203