GCVE Workshop - 22 September 2026 (14:00-18:00), Luxembourg Before The Vulnopticon Conference - Registration

CVE-2026-89659 (GCVE-0-2026-89659)

Vulnerability from cvelistv5 – Published: 2026-09-11 19:45 – Updated: 2026-09-13 06:32
VLAI
Title
NFSD: Prevent client use-after-free during delegation revoke
Summary
In the Linux kernel, the following vulnerability has been resolved: NFSD: Prevent client use-after-free during delegation revoke A delegation stateid holds only a bare pointer to its owning nfs4_client and does not keep it alive. The client survives its stateids only because __destroy_client() drains cl_delegations and cl_revoked before free_client() runs. nfs4_laundromat() breaks that invariant: it unhashes an expired delegation from cl_delegations, drops deleg_lock, then revoke_delegation() relinks it onto cl_revoked under cl_lock. In that window the delegation is on neither list, so client_has_state() can report no remaining state. Every teardown path first requires cl_rpc_users to be zero, but the laundromat holds no such reference. A client whose recalled delegation has just timed out can therefore reach free_client() while revoke_delegation() is still about to dereference cl_lock, a use-after-free. Pin the client with cl_rpc_users across the revoke so teardown blocks until it completes, then reap the delegation from cl_revoked. A client already expiring reaps its own, so skip it and leave the delegation on del_recall_lru.
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: 3bd64a5ba1719c2bb6cba4493dfd3e23a7653e54 , < 3c0a53ee0b442348d8d2286d6960d3f07bb3a3d3 (git)
Affected: 3bd64a5ba1719c2bb6cba4493dfd3e23a7653e54 , < 2a9d637c2a8fd8ac29ad9b29f28d122ef75c1a56 (git)
Affected: 3bd64a5ba1719c2bb6cba4493dfd3e23a7653e54 , < 4683ca76b3b7e5808338491c6eb3c20e6b4894d5 (git)
guessed Create a notification for this product.
Linux Linux Affected: 3.10
Unaffected: 0 , < 3.10 (semver)
Unaffected: 6.18.51 , ≤ 6.18.* (semver)
Unaffected: 7.2.4 , ≤ 7.2.* (semver)
Unaffected: 7.3-rc1 , ≤ * (original_commit_for_fix)
guessed Create a notification for this product.
Show details on NVD website

{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "fs/nfsd/netns.h",
            "fs/nfsd/nfs4state.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "3c0a53ee0b442348d8d2286d6960d3f07bb3a3d3",
              "status": "affected",
              "version": "3bd64a5ba1719c2bb6cba4493dfd3e23a7653e54",
              "versionType": "git"
            },
            {
              "lessThan": "2a9d637c2a8fd8ac29ad9b29f28d122ef75c1a56",
              "status": "affected",
              "version": "3bd64a5ba1719c2bb6cba4493dfd3e23a7653e54",
              "versionType": "git"
            },
            {
              "lessThan": "4683ca76b3b7e5808338491c6eb3c20e6b4894d5",
              "status": "affected",
              "version": "3bd64a5ba1719c2bb6cba4493dfd3e23a7653e54",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "fs/nfsd/netns.h",
            "fs/nfsd/nfs4state.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "3.10"
            },
            {
              "lessThan": "3.10",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.18.*",
              "status": "unaffected",
              "version": "6.18.51",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "7.2.*",
              "status": "unaffected",
              "version": "7.2.4",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "unaffected",
              "version": "7.3-rc1",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18.51",
                  "versionStartIncluding": "3.10",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2.4",
                  "versionStartIncluding": "3.10",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3-rc1",
                  "versionStartIncluding": "3.10",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nNFSD: Prevent client use-after-free during delegation revoke\n\nA delegation stateid holds only a bare pointer to its owning\nnfs4_client and does not keep it alive.  The client survives its\nstateids only because __destroy_client() drains cl_delegations and\ncl_revoked before free_client() runs.\n\nnfs4_laundromat() breaks that invariant: it unhashes an\nexpired delegation from cl_delegations, drops deleg_lock, then\nrevoke_delegation() relinks it onto cl_revoked under cl_lock.  In that\nwindow the delegation is on neither list, so client_has_state() can\nreport no remaining state.\n\nEvery teardown path first requires cl_rpc_users to be zero, but\nthe laundromat holds no such reference.  A client whose recalled\ndelegation has just timed out can therefore reach free_client()\nwhile revoke_delegation() is still about to dereference cl_lock,\na use-after-free.\n\nPin the client with cl_rpc_users across the revoke so teardown blocks\nuntil it completes, then reap the delegation from cl_revoked.  A client\nalready expiring reaps its own, so skip it and leave the delegation on\ndel_recall_lru."
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "baseScore": 9.8,
            "baseSeverity": "CRITICAL",
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
            "version": "3.1"
          },
          "scenarios": [
            {
              "lang": "en",
              "value": "AV:N - The bug is in nfsd nfs4_laundromat()/revoke_delegation() in fs/nfsd/nfs4state.c. A remote NFSv4 client reaches it over TCP/2049 by OPEN to obtain a delegation, a conflicting OPEN to force CB_RECALL, then DESTROY_CLIENTID or CREATE_SESSION replacement while the laundromat revokes.\nAC:L - The attacker controls both sides: it creates the recalled delegation, learns FATTR4_LEASE_TIME, and issues DESTROY_CLIENTID or same-name CREATE_SESSION/SETCLIENTID_CONFIRM while laundromat unhashes. Many recalled delegations widen the unhash-to-revoke window, and the sequence is retryable.\nPR:N - Default AUTH_SYS nfsd exports do no cryptographic authentication; any host allowed by the export ACL can EXCHANGE_ID/SETCLIENTID, OPEN to get a delegation, and DESTROY_CLIENTID. No local account or capability on the NFS server is required.\nUI:N - The attacking NFS client performs the full sequence itself (delegation, recall, teardown). No local user or administrator action on the NFS server is required at attack time.\nS:U - The use-after-free corrupts the nfs4_client object in the host kernel\u0027s nfsd state tables. Impact stays in that kernel security authority and does not cross a VM, IOMMU, or sandbox boundary.\nC:H - revoke_delegation() and nfs4_put_stid() dereference sc_client (cl_lock, cl_revoked, cl_stateids) after free_client() kmem_cache_free\u0027s the mergeable client_slab object (KMEM_CACHE flags 0), a UAF the attacker can reallocate via EXCHANGE_ID to disclose kernel memory.\nI:H - The UAF writes include spin_lock/unlock of freed cl_lock, list_add onto cl_revoked, and refcount_dec_and_lock in nfs4_put_stid on a reclaimable nfs4_client, enabling heap corruption and control-flow hijack.\nA:H - Use-after-free of nfs4_client in an nfsd/laundromat thread oopses or panics the NFS server even without full exploitation, and the attacker can repeat the RPC sequence to deny service."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-09-13T06:32:42.114Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/3c0a53ee0b442348d8d2286d6960d3f07bb3a3d3"
        },
        {
          "url": "https://git.kernel.org/stable/c/2a9d637c2a8fd8ac29ad9b29f28d122ef75c1a56"
        },
        {
          "url": "https://git.kernel.org/stable/c/4683ca76b3b7e5808338491c6eb3c20e6b4894d5"
        }
      ],
      "title": "NFSD: Prevent client use-after-free during delegation revoke",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-89659",
    "datePublished": "2026-09-11T19:45:47.587Z",
    "dateReserved": "2026-09-11T19:38:34.744Z",
    "dateUpdated": "2026-09-13T06:32:42.114Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-89659",
      "date": "2026-09-16",
      "epss": "0.00435",
      "percentile": "0.37071"
    },
    "microsoft_vex": {
      "current_release_date": "2026-09-14T15:01:48.000Z",
      "cve": "CVE-2026-89659",
      "id": "msrc_CVE-2026-89659",
      "initial_release_date": "2026-09-13T01:13:55.000Z",
      "product_status:known_affected": "1",
      "source": "Microsoft CSAF VEX",
      "status": "final",
      "title": "NFSD: Prevent client use-after-free during delegation revoke",
      "url": "https://msrc.microsoft.com/csaf/vex/2026/msrc_cve-2026-89659.json",
      "version": "2"
    },
    "nvd": "{\"cve\":{\"id\":\"CVE-2026-89659\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2026-09-11T20:19:52.180\",\"lastModified\":\"2026-09-13T07:17:31.523\",\"vulnStatus\":\"Received\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"In the Linux kernel, the following vulnerability has been resolved:\\n\\nNFSD: Prevent client use-after-free during delegation revoke\\n\\nA delegation stateid holds only a bare pointer to its owning\\nnfs4_client and does not keep it alive.  The client survives its\\nstateids only because __destroy_client() drains cl_delegations and\\ncl_revoked before free_client() runs.\\n\\nnfs4_laundromat() breaks that invariant: it unhashes an\\nexpired delegation from cl_delegations, drops deleg_lock, then\\nrevoke_delegation() relinks it onto cl_revoked under cl_lock.  In that\\nwindow the delegation is on neither list, so client_has_state() can\\nreport no remaining state.\\n\\nEvery teardown path first requires cl_rpc_users to be zero, but\\nthe laundromat holds no such reference.  A client whose recalled\\ndelegation has just timed out can therefore reach free_client()\\nwhile revoke_delegation() is still about to dereference cl_lock,\\na use-after-free.\\n\\nPin the client with cl_rpc_users across the revoke so teardown blocks\\nuntil it completes, then reap the delegation from cl_revoked.  A client\\nalready expiring reaps its own, so skip it and leave the delegation on\\ndel_recall_lru.\"}],\"affected\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"affectedData\":[{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"unaffected\",\"programFiles\":[\"fs/nfsd/netns.h\",\"fs/nfsd/nfs4state.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"3bd64a5ba1719c2bb6cba4493dfd3e23a7653e54\",\"lessThan\":\"3c0a53ee0b442348d8d2286d6960d3f07bb3a3d3\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"3bd64a5ba1719c2bb6cba4493dfd3e23a7653e54\",\"lessThan\":\"2a9d637c2a8fd8ac29ad9b29f28d122ef75c1a56\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"3bd64a5ba1719c2bb6cba4493dfd3e23a7653e54\",\"lessThan\":\"4683ca76b3b7e5808338491c6eb3c20e6b4894d5\",\"versionType\":\"git\",\"status\":\"affected\"}]},{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"affected\",\"programFiles\":[\"fs/nfsd/netns.h\",\"fs/nfsd/nfs4state.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"3.10\",\"status\":\"affected\"},{\"version\":\"0\",\"lessThan\":\"3.10\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.18.51\",\"lessThanOrEqual\":\"6.18.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"7.2.4\",\"lessThanOrEqual\":\"7.2.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"7.3-rc1\",\"lessThanOrEqual\":\"*\",\"versionType\":\"original_commit_for_fix\",\"status\":\"unaffected\"}]}]}],\"metrics\":{\"cvssMetricV31\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"type\":\"Secondary\",\"cvssData\":{\"version\":\"3.1\",\"vectorString\":\"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H\",\"baseScore\":9.8,\"baseSeverity\":\"CRITICAL\",\"attackVector\":\"NETWORK\",\"attackComplexity\":\"LOW\",\"privilegesRequired\":\"NONE\",\"userInteraction\":\"NONE\",\"scope\":\"UNCHANGED\",\"confidentialityImpact\":\"HIGH\",\"integrityImpact\":\"HIGH\",\"availabilityImpact\":\"HIGH\"},\"exploitabilityScore\":3.9,\"impactScore\":5.9}]},\"references\":[{\"url\":\"https://git.kernel.org/stable/c/2a9d637c2a8fd8ac29ad9b29f28d122ef75c1a56\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/3c0a53ee0b442348d8d2286d6960d3f07bb3a3d3\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/4683ca76b3b7e5808338491c6eb3c20e6b4894d5\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"}]}}",
    "redhat_vex": {
      "aggregate_severity": "Important",
      "current_release_date": "2026-09-15T15:02:13+00:00",
      "cve": "CVE-2026-89659",
      "id": "CVE-2026-89659",
      "initial_release_date": "2026-09-11T00:00:00+00:00",
      "product_status:known_affected": "262",
      "product_status:under_investigation": "14",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: NFSD: Prevent client use-after-free during delegation revoke",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-89659.json",
      "version": "3"
    },
    "suse_vex": {
      "aggregate_severity": "important",
      "current_release_date": "2026-09-16T00:00:54Z",
      "cve": "CVE-2026-89659",
      "id": "CVE-2026-89659",
      "initial_release_date": "2026-09-12T16:24:06Z",
      "product_status:known_affected": "349",
      "product_status:known_not_affected": "4",
      "source": "SUSE CSAF VEX",
      "status": "interim",
      "title": "SUSE CVE CVE-2026-89659",
      "url": "https://ftp.suse.com/pub/projects/security/csaf-vex/cve-2026-89659.json",
      "version": "4"
    }
  }
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.

Loading…

Detection rules are retrieved from Rulezet.

Loading…

Loading…

Related by attack behaviour

Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.


Loading…