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

CVE-2026-90038 (GCVE-0-2026-90038)

Vulnerability from cvelistv5 – Published: 2026-09-16 10:33 – Updated: 2026-09-16 14:41
VLAI
Title
NFSD: Prevent client use-after-free during export state revocation
Summary
In the Linux kernel, the following vulnerability has been resolved: NFSD: Prevent client use-after-free during export state revocation nfsd4_revoke_export_states() has the same use-after-free as nfsd4_revoke_states(): it drops nn->client_lock across revoke_one_stid() and the following read of clp->cl_minorversion, but the stateid reference it holds does not pin the client. A teardown racing the dropped lock can free the client while revoke_one_stid() still dereferences it. exportfs -u drives this path through NFSD_CMD_UNLOCK_EXPORT, so an administrator removing an export can race a client expiry. Skip a client that is already expiring and otherwise pin it with cl_rpc_users under client_lock before dropping the lock, matching nfsd4_revoke_states().
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: 2eac189bb059d31a29937b29ee0f477394198610 , < c05ae58fe06ce2ac34312f649e71c3596bdde358 (git)
Affected: 2eac189bb059d31a29937b29ee0f477394198610 , < 2108de53568a64936a0da3e04d85c35df98d3fb6 (git)
guessed Create a notification for this product.
Linux Linux Affected: 7.2
Unaffected: 0 , < 7.2 (semver)
Unaffected: 7.2.5 , ≤ 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": "c05ae58fe06ce2ac34312f649e71c3596bdde358",
              "status": "affected",
              "version": "2eac189bb059d31a29937b29ee0f477394198610",
              "versionType": "git"
            },
            {
              "lessThan": "2108de53568a64936a0da3e04d85c35df98d3fb6",
              "status": "affected",
              "version": "2eac189bb059d31a29937b29ee0f477394198610",
              "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": "7.2"
            },
            {
              "lessThan": "7.2",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "7.2.*",
              "status": "unaffected",
              "version": "7.2.5",
              "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": "7.2.5",
                  "versionStartIncluding": "7.2",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3-rc1",
                  "versionStartIncluding": "7.2",
                  "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 export state revocation\n\nnfsd4_revoke_export_states() has the same use-after-free as\nnfsd4_revoke_states(): it drops nn-\u003eclient_lock across\nrevoke_one_stid() and the following read of clp-\u003ecl_minorversion, but\nthe stateid reference it holds does not pin the client.  A teardown\nracing the dropped lock can free the client while revoke_one_stid()\nstill dereferences it.\n\nexportfs -u drives this path through NFSD_CMD_UNLOCK_EXPORT, so an\nadministrator removing an export can race a client expiry.\n\nSkip a client that is already expiring and otherwise pin it with\ncl_rpc_users under client_lock before dropping the lock, matching\nnfsd4_revoke_states()."
        }
      ],
      "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_export_states(). A remote NFSv4 peer reaches the racing expire_client() over TCP/2049 via svc_recv to nfsd_dispatch to nfsd4_proc_compound: EXCHANGE_ID/CREATE_SESSION, SETCLIENTID_CONFIRM, or DESTROY_CLIENTID (ALLOWED_WITHOUT_FH), which free nfs4_client while the export-revoke walk still dereferences it.\nAC:L - The attacker controls the teardown side: they hold many stateids on the export 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. The window is retryable and attacker-created.\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 on an export and trigger expire.\nUI:N - The attacker drives the NFS compounds that create state and expire the client. Administrative exportfs -u / NFSD_CMD_UNLOCK_EXPORT is a server operational condition (unexport of the last client for a path so the filesystem can be unmounted), 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 export-revoke path oopses or panics the NFS server even without full exploitation, fully denying service of the host."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-09-16T14:41:51.107Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/c05ae58fe06ce2ac34312f649e71c3596bdde358"
        },
        {
          "url": "https://git.kernel.org/stable/c/2108de53568a64936a0da3e04d85c35df98d3fb6"
        }
      ],
      "title": "NFSD: Prevent client use-after-free during export state revocation",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-90038",
    "datePublished": "2026-09-16T10:33:37.366Z",
    "dateReserved": "2026-09-11T19:38:34.782Z",
    "dateUpdated": "2026-09-16T14:41:51.107Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "nvd": "{\"cve\":{\"id\":\"CVE-2026-90038\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2026-09-16T11:17:17.010\",\"lastModified\":\"2026-09-16T15:18:26.650\",\"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 export state revocation\\n\\nnfsd4_revoke_export_states() has the same use-after-free as\\nnfsd4_revoke_states(): it drops nn-\u003eclient_lock across\\nrevoke_one_stid() and the following read of clp-\u003ecl_minorversion, but\\nthe stateid reference it holds does not pin the client.  A teardown\\nracing the dropped lock can free the client while revoke_one_stid()\\nstill dereferences it.\\n\\nexportfs -u drives this path through NFSD_CMD_UNLOCK_EXPORT, so an\\nadministrator removing an export can race a client expiry.\\n\\nSkip a client that is already expiring and otherwise pin it with\\ncl_rpc_users under client_lock before dropping the lock, matching\\nnfsd4_revoke_states().\"}],\"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\":\"2eac189bb059d31a29937b29ee0f477394198610\",\"lessThan\":\"c05ae58fe06ce2ac34312f649e71c3596bdde358\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"2eac189bb059d31a29937b29ee0f477394198610\",\"lessThan\":\"2108de53568a64936a0da3e04d85c35df98d3fb6\",\"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\":\"7.2\",\"status\":\"affected\"},{\"version\":\"0\",\"lessThan\":\"7.2\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"7.2.5\",\"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/2108de53568a64936a0da3e04d85c35df98d3fb6\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/c05ae58fe06ce2ac34312f649e71c3596bdde358\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"}]}}"
  }
}



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…