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

CVE-2026-89660 (GCVE-0-2026-89660)

Vulnerability from cvelistv5 – Published: 2026-09-11 19:45 – Updated: 2026-09-13 06:32
VLAI
Title
NFSD: Prevent client use-after-free during admin state revocation
Summary
In the Linux kernel, the following vulnerability has been resolved: NFSD: Prevent client use-after-free during admin state revocation A stateid holds only a bare pointer to its nfs4_client; a stateid reference does not pin it. The client survives only because __destroy_client() drains its stateids before free_client() runs. nfsd4_revoke_states() drops nn->client_lock across revoke_one_stid(), which dereferences the client to revoke a stateid and read clp->cl_minorversion. A teardown racing the dropped lock can free the client first. Pinning cl_rpc_users under client_lock blocks the DESTROY_CLIENTID and EXCHANGE_ID teardown, which refuses while cl_rpc_users is non-zero. force_expire_client() ignores it: once its wait for cl_rpc_users to reach zero has passed, a later pin goes unnoticed. Under client_lock, skip a client whose cl_time is already zero -- force_expire_client() clears it there before waiting -- otherwise pin cl_rpc_users before dropping the lock. The walk then either sees the expiry and skips, or pins in time for that wait to cover the revoke.
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: 1c13bf9f2e3cd5a59ef988c6c5a49fe0f02bcdfc , < 549bd9868e9d77b07ea94870940d64342829c6ad (git)
Affected: 1c13bf9f2e3cd5a59ef988c6c5a49fe0f02bcdfc , < bf1f948691523282cc4905bc6cd325e0c0b49e6a (git)
Affected: 1c13bf9f2e3cd5a59ef988c6c5a49fe0f02bcdfc , < e270e5a0778e5bff852c8862ce9576ce70359393 (git)
guessed Create a notification for this product.
Linux Linux Affected: 6.9
Unaffected: 0 , < 6.9 (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/nfs4state.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "549bd9868e9d77b07ea94870940d64342829c6ad",
              "status": "affected",
              "version": "1c13bf9f2e3cd5a59ef988c6c5a49fe0f02bcdfc",
              "versionType": "git"
            },
            {
              "lessThan": "bf1f948691523282cc4905bc6cd325e0c0b49e6a",
              "status": "affected",
              "version": "1c13bf9f2e3cd5a59ef988c6c5a49fe0f02bcdfc",
              "versionType": "git"
            },
            {
              "lessThan": "e270e5a0778e5bff852c8862ce9576ce70359393",
              "status": "affected",
              "version": "1c13bf9f2e3cd5a59ef988c6c5a49fe0f02bcdfc",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "fs/nfsd/nfs4state.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "6.9"
            },
            {
              "lessThan": "6.9",
              "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": "6.9",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2.4",
                  "versionStartIncluding": "6.9",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3-rc1",
                  "versionStartIncluding": "6.9",
                  "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 admin state revocation\n\nA stateid holds only a bare pointer to its nfs4_client; a stateid\nreference does not pin it.  The client survives only because\n__destroy_client() drains its stateids before free_client() runs.\n\nnfsd4_revoke_states() drops nn-\u003eclient_lock across revoke_one_stid(),\nwhich dereferences the client to revoke a stateid and read\nclp-\u003ecl_minorversion.  A teardown racing the dropped lock can free\nthe client first.\n\nPinning cl_rpc_users under client_lock blocks the DESTROY_CLIENTID and\nEXCHANGE_ID teardown, which refuses while cl_rpc_users is non-zero.\nforce_expire_client() ignores it: once its wait for cl_rpc_users to\nreach zero has passed, a later pin goes unnoticed.\n\nUnder client_lock, skip a client whose cl_time is already zero --\nforce_expire_client() clears it there before waiting -- otherwise pin\ncl_rpc_users before dropping the lock.  The walk then either sees the\nexpiry and skips, or pins in time for that wait to cover the revoke."
        }
      ],
      "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 UAF is in nfsd nfsd4_revoke_states(). A remote NFSv4 peer reaches the racing expire_client() over TCP/2049 via EXCHANGE_ID/CREATE_SESSION, SETCLIENTID_CONFIRM, or DESTROY_CLIENTID (ALLOWED_WITHOUT_FH), which free nfs4_client while the revoke walk still dereferences it.\nAC:L - The attacker controls the teardown side: they hold many stateids so the revoke walk drops client_lock once per stid, and concurrently retry EXCHANGE_ID/CREATE_SESSION or SETCLIENTID_CONFIRM so mark_client_expired_locked() succeeds while cl_rpc_users is unpinned.\nPR:N - EXCHANGE_ID, CREATE_SESSION, SETCLIENTID, SETCLIENTID_CONFIRM, and DESTROY_CLIENTID are ALLOWED_WITHOUT_FH with no export check. Typical AUTH_SYS/AUTH_NULL nfsd deployments do not verify RPC credentials, so any host that can reach TCP/2049 can establish state and trigger expire.\nUI:N - The attacker drives the NFS compounds that create state and expire the client. Administrative unlock_filesystem/unexport is a server operational condition (unexport or response to a misbehaving client), not a required victim user action.\nS:U - The freed object is struct nfs4_client in the NFS server kernel. Impact remains in that kernel security authority; there is no VM, IOMMU, or sandbox boundary crossing.\nC:H - revoke_one_stid() and the subsequent clp-\u003ecl_minorversion read dereference nfs4_client after free_client() kmem_cache_free\u0027s the mergeable client_slab object (KMEM_CACHE flags 0). Reclaim via EXCHANGE_ID discloses kernel memory; a UAF is C:H.\nI:H - revoke_one_stid() takes cl_lock and nfs4_put_stid() does refcount_dec_and_lock/idr_remove on the freed client\u0027s cl_lock/cl_stateids, concurrent with __destroy_client(), a slab UAF write primitive for heap corruption and control-flow hijacking.\nA:H - Use-after-free of nfs4_client in the nfsd revoke path oopses or panics the NFS server even without full exploitation, fully denying service of the host."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-09-13T06:32:43.237Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/549bd9868e9d77b07ea94870940d64342829c6ad"
        },
        {
          "url": "https://git.kernel.org/stable/c/bf1f948691523282cc4905bc6cd325e0c0b49e6a"
        },
        {
          "url": "https://git.kernel.org/stable/c/e270e5a0778e5bff852c8862ce9576ce70359393"
        }
      ],
      "title": "NFSD: Prevent client use-after-free during admin state revocation",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-89660",
    "datePublished": "2026-09-11T19:45:48.341Z",
    "dateReserved": "2026-09-11T19:38:34.744Z",
    "dateUpdated": "2026-09-13T06:32:43.237Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-89660",
      "date": "2026-09-15",
      "epss": "0.00588",
      "percentile": "0.46399"
    },
    "nvd": "{\"cve\":{\"id\":\"CVE-2026-89660\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2026-09-11T20:19:52.300\",\"lastModified\":\"2026-09-13T07:17:31.647\",\"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 admin state revocation\\n\\nA stateid holds only a bare pointer to its nfs4_client; a stateid\\nreference does not pin it.  The client survives only because\\n__destroy_client() drains its stateids before free_client() runs.\\n\\nnfsd4_revoke_states() drops nn-\u003eclient_lock across revoke_one_stid(),\\nwhich dereferences the client to revoke a stateid and read\\nclp-\u003ecl_minorversion.  A teardown racing the dropped lock can free\\nthe client first.\\n\\nPinning cl_rpc_users under client_lock blocks the DESTROY_CLIENTID and\\nEXCHANGE_ID teardown, which refuses while cl_rpc_users is non-zero.\\nforce_expire_client() ignores it: once its wait for cl_rpc_users to\\nreach zero has passed, a later pin goes unnoticed.\\n\\nUnder client_lock, skip a client whose cl_time is already zero --\\nforce_expire_client() clears it there before waiting -- otherwise pin\\ncl_rpc_users before dropping the lock.  The walk then either sees the\\nexpiry and skips, or pins in time for that wait to cover the revoke.\"}],\"affected\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"affectedData\":[{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"unaffected\",\"programFiles\":[\"fs/nfsd/nfs4state.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"1c13bf9f2e3cd5a59ef988c6c5a49fe0f02bcdfc\",\"lessThan\":\"549bd9868e9d77b07ea94870940d64342829c6ad\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"1c13bf9f2e3cd5a59ef988c6c5a49fe0f02bcdfc\",\"lessThan\":\"bf1f948691523282cc4905bc6cd325e0c0b49e6a\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"1c13bf9f2e3cd5a59ef988c6c5a49fe0f02bcdfc\",\"lessThan\":\"e270e5a0778e5bff852c8862ce9576ce70359393\",\"versionType\":\"git\",\"status\":\"affected\"}]},{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"affected\",\"programFiles\":[\"fs/nfsd/nfs4state.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"6.9\",\"status\":\"affected\"},{\"version\":\"0\",\"lessThan\":\"6.9\",\"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/549bd9868e9d77b07ea94870940d64342829c6ad\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/bf1f948691523282cc4905bc6cd325e0c0b49e6a\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/e270e5a0778e5bff852c8862ce9576ce70359393\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"}]}}",
    "redhat_vex": {
      "aggregate_severity": "Important",
      "current_release_date": "2026-09-13T06:51:25+00:00",
      "cve": "CVE-2026-89660",
      "id": "CVE-2026-89660",
      "initial_release_date": "2026-09-11T19:45:48.341000+00:00",
      "product_status:known_affected": "2",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: Linux kernel: NFSD use-after-free during client state revocation",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-89660.json",
      "version": "3"
    }
  }
}



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…

Loading…