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

CVE-2026-89690 (GCVE-0-2026-89690)

Vulnerability from cvelistv5 – Published: 2026-09-11 19:46 – Updated: 2026-09-13 06:33
VLAI
Title
nfsd: defer vfree of compound ops to fix rpc_status UAF
Summary
In the Linux kernel, the following vulnerability has been resolved: nfsd: defer vfree of compound ops to fix rpc_status UAF The rpc_status netlink dumpit walks every in-flight svc_rqst under rcu_read_lock and, for NFSv4 requests, reads opnums out of args->ops[]. But args->ops is a separate vmalloc buffer freed synchronously by vfree() in nfsd4_release_compoundargs() at the end of every compound. The dumpit's rcu_read_lock pins the svc_rqst struct itself (freed via kfree_rcu), but nothing defers the vfree of the ops buffer across the RCU grace period. A concurrent compound completion can therefore free the buffer while the dumpit is reading it — a use-after-free on vmalloc memory. The trailing seqcount recheck (smp_load_acquire of rq_status_counter) cannot undo a load that already retired against freed memory. Fix by replacing vfree(args->ops) with kvfree_rcu_mightsleep(), which defers the free until after an RCU grace period. This makes the existing rcu_read_lock in the dumpit sufficient to protect the read. The tradeoff is that completed compound ops buffers (up to 200 * sizeof(struct nfsd4_op)) persist in memory slightly longer, across one grace period, before being reclaimed.
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: bd9d6a3efa9709e653aafbeb859289feccb8e70c , < 48f72aff24f7a7329209dc6cbc27c869f3e3595c (git)
Affected: bd9d6a3efa9709e653aafbeb859289feccb8e70c , < 6703199f4d7e7f37d6a726a849eb358e8fae72fb (git)
Affected: bd9d6a3efa9709e653aafbeb859289feccb8e70c , < 19413ccc45070a7270b9e25c2a258daf7f91de42 (git)
Affected: bd9d6a3efa9709e653aafbeb859289feccb8e70c , < fca26a3fc19ed02278aa2a150af82d43db0302cb (git)
guessed Create a notification for this product.
Linux Linux Affected: 6.7
Unaffected: 0 , < 6.7 (semver)
Unaffected: 6.12.109 , ≤ 6.12.* (semver)
Unaffected: 6.18.50 , ≤ 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/nfs4xdr.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "48f72aff24f7a7329209dc6cbc27c869f3e3595c",
              "status": "affected",
              "version": "bd9d6a3efa9709e653aafbeb859289feccb8e70c",
              "versionType": "git"
            },
            {
              "lessThan": "6703199f4d7e7f37d6a726a849eb358e8fae72fb",
              "status": "affected",
              "version": "bd9d6a3efa9709e653aafbeb859289feccb8e70c",
              "versionType": "git"
            },
            {
              "lessThan": "19413ccc45070a7270b9e25c2a258daf7f91de42",
              "status": "affected",
              "version": "bd9d6a3efa9709e653aafbeb859289feccb8e70c",
              "versionType": "git"
            },
            {
              "lessThan": "fca26a3fc19ed02278aa2a150af82d43db0302cb",
              "status": "affected",
              "version": "bd9d6a3efa9709e653aafbeb859289feccb8e70c",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "fs/nfsd/nfs4xdr.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "6.7"
            },
            {
              "lessThan": "6.7",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.12.*",
              "status": "unaffected",
              "version": "6.12.109",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.18.*",
              "status": "unaffected",
              "version": "6.18.50",
              "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.12.109",
                  "versionStartIncluding": "6.7",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18.50",
                  "versionStartIncluding": "6.7",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2.4",
                  "versionStartIncluding": "6.7",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3-rc1",
                  "versionStartIncluding": "6.7",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nnfsd: defer vfree of compound ops to fix rpc_status UAF\n\nThe rpc_status netlink dumpit walks every in-flight svc_rqst under\nrcu_read_lock and, for NFSv4 requests, reads opnums out of\nargs-\u003eops[]. But args-\u003eops is a separate vmalloc buffer freed\nsynchronously by vfree() in nfsd4_release_compoundargs() at the end\nof every compound. The dumpit\u0027s rcu_read_lock pins the svc_rqst\nstruct itself (freed via kfree_rcu), but nothing defers the vfree\nof the ops buffer across the RCU grace period. A concurrent compound\ncompletion can therefore free the buffer while the dumpit is reading\nit \u2014 a use-after-free on vmalloc memory.\n\nThe trailing seqcount recheck (smp_load_acquire of rq_status_counter)\ncannot undo a load that already retired against freed memory.\n\nFix by replacing vfree(args-\u003eops) with kvfree_rcu_mightsleep(), which\ndefers the free until after an RCU grace period. This makes the\nexisting rcu_read_lock in the dumpit sufficient to protect the read.\nThe tradeoff is that completed compound ops buffers (up to\n200 * sizeof(struct nfsd4_op)) persist in memory slightly longer,\nacross one grace period, before being reclaimed."
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "baseScore": 7.8,
            "baseSeverity": "HIGH",
            "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
            "version": "3.1"
          },
          "scenarios": [
            {
              "lang": "en",
              "value": "AV:L - The UAF is in nfsd_nl_rpc_status_get_dumpit(), reached only via the NFSD_CMD_RPC_STATUS_GET generic-netlink dump over AF_NETLINK. Remote NFSv4 compounds drive the vfree of args-\u003eops in nfsd4_release_compoundargs() but never enter dumpit, so exploitation requires local access.\nAC:L - The attacker fully controls the dumpit reader and can loop it while sending NFSv4 COMPOUNDs with more than eight ops so nfsd vcalloc()s args-\u003eops and vfree()s it on every request. That is an attacker-driven race; the seqcount recheck does not prevent the already-retired load against freed vmalloc memory.\nPR:L - NFSD_CMD_RPC_STATUS_GET is registered with GENL_CMD_CAP_DUMP and no GENL_ADMIN_PERM, so any unprivileged process in the nfsd network namespace can invoke the dump. Exploitation does not require CAP_NET_ADMIN or root.\nUI:N - The attacker issues the netlink dump themselves and can generate the concurrent NFSv4 compounds; no separate victim action such as mounting a filesystem or opening a device is required.\nS:U - This is a kernel vmalloc use-after-free in nfsd on the local host. Impact stays inside the kernel\u0027s security authority and does not cross a VM, IOMMU, or other security boundary.\nC:H - dumpit reads opnums from the vfree\u0027d args-\u003eops[] buffer and returns them to userspace via NFSD_A_RPC_STATUS_COMPOUND_OPS. A kernel UAF with reuse of that vmalloc region yields an arbitrary-read primitive, which CVSS treats as high confidentiality impact.\nI:H - This is a use-after-free of a vmalloc compound-ops array that dumpit walks under rcu_read_lock while nfsd vfree()s it. UAF of attacker-reclaimable kernel memory enables corruption and control-flow hijacking primitives, not crash-only impact.\nA:H - Use-after-free of a vfree\u0027d vmalloc buffer while dumpit still loads args-\u003eops[j].opnum oopses or panics the kernel even if the UAF is not turned into code execution, fully disrupting the NFS server host."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-09-13T06:33:14.771Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/48f72aff24f7a7329209dc6cbc27c869f3e3595c"
        },
        {
          "url": "https://git.kernel.org/stable/c/6703199f4d7e7f37d6a726a849eb358e8fae72fb"
        },
        {
          "url": "https://git.kernel.org/stable/c/19413ccc45070a7270b9e25c2a258daf7f91de42"
        },
        {
          "url": "https://git.kernel.org/stable/c/fca26a3fc19ed02278aa2a150af82d43db0302cb"
        }
      ],
      "title": "nfsd: defer vfree of compound ops to fix rpc_status UAF",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-89690",
    "datePublished": "2026-09-11T19:46:10.632Z",
    "dateReserved": "2026-09-11T19:38:34.749Z",
    "dateUpdated": "2026-09-13T06:33:14.771Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-89690",
      "date": "2026-09-16",
      "epss": "0.00159",
      "percentile": "0.05427"
    },
    "nvd": "{\"cve\":{\"id\":\"CVE-2026-89690\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2026-09-11T20:19:56.030\",\"lastModified\":\"2026-09-13T07:17:34.850\",\"vulnStatus\":\"Received\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"In the Linux kernel, the following vulnerability has been resolved:\\n\\nnfsd: defer vfree of compound ops to fix rpc_status UAF\\n\\nThe rpc_status netlink dumpit walks every in-flight svc_rqst under\\nrcu_read_lock and, for NFSv4 requests, reads opnums out of\\nargs-\u003eops[]. But args-\u003eops is a separate vmalloc buffer freed\\nsynchronously by vfree() in nfsd4_release_compoundargs() at the end\\nof every compound. The dumpit\u0027s rcu_read_lock pins the svc_rqst\\nstruct itself (freed via kfree_rcu), but nothing defers the vfree\\nof the ops buffer across the RCU grace period. A concurrent compound\\ncompletion can therefore free the buffer while the dumpit is reading\\nit \u2014 a use-after-free on vmalloc memory.\\n\\nThe trailing seqcount recheck (smp_load_acquire of rq_status_counter)\\ncannot undo a load that already retired against freed memory.\\n\\nFix by replacing vfree(args-\u003eops) with kvfree_rcu_mightsleep(), which\\ndefers the free until after an RCU grace period. This makes the\\nexisting rcu_read_lock in the dumpit sufficient to protect the read.\\nThe tradeoff is that completed compound ops buffers (up to\\n200 * sizeof(struct nfsd4_op)) persist in memory slightly longer,\\nacross one grace period, before being reclaimed.\"}],\"affected\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"affectedData\":[{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"unaffected\",\"programFiles\":[\"fs/nfsd/nfs4xdr.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"bd9d6a3efa9709e653aafbeb859289feccb8e70c\",\"lessThan\":\"48f72aff24f7a7329209dc6cbc27c869f3e3595c\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"bd9d6a3efa9709e653aafbeb859289feccb8e70c\",\"lessThan\":\"6703199f4d7e7f37d6a726a849eb358e8fae72fb\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"bd9d6a3efa9709e653aafbeb859289feccb8e70c\",\"lessThan\":\"19413ccc45070a7270b9e25c2a258daf7f91de42\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"bd9d6a3efa9709e653aafbeb859289feccb8e70c\",\"lessThan\":\"fca26a3fc19ed02278aa2a150af82d43db0302cb\",\"versionType\":\"git\",\"status\":\"affected\"}]},{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"affected\",\"programFiles\":[\"fs/nfsd/nfs4xdr.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"6.7\",\"status\":\"affected\"},{\"version\":\"0\",\"lessThan\":\"6.7\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.12.109\",\"lessThanOrEqual\":\"6.12.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.18.50\",\"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:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H\",\"baseScore\":7.8,\"baseSeverity\":\"HIGH\",\"attackVector\":\"LOCAL\",\"attackComplexity\":\"LOW\",\"privilegesRequired\":\"LOW\",\"userInteraction\":\"NONE\",\"scope\":\"UNCHANGED\",\"confidentialityImpact\":\"HIGH\",\"integrityImpact\":\"HIGH\",\"availabilityImpact\":\"HIGH\"},\"exploitabilityScore\":1.8,\"impactScore\":5.9}]},\"references\":[{\"url\":\"https://git.kernel.org/stable/c/19413ccc45070a7270b9e25c2a258daf7f91de42\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/48f72aff24f7a7329209dc6cbc27c869f3e3595c\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/6703199f4d7e7f37d6a726a849eb358e8fae72fb\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/fca26a3fc19ed02278aa2a150af82d43db0302cb\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"}]}}",
    "redhat_vex": {
      "aggregate_severity": "Important",
      "current_release_date": "2026-09-13T06:52:07+00:00",
      "cve": "CVE-2026-89690",
      "id": "CVE-2026-89690",
      "initial_release_date": "2026-09-11T19:46:10.632000+00:00",
      "product_status:known_affected": "2",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: Linux kernel nfsd: Memory corruption via use-after-free in compound operations",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-89690.json",
      "version": "3"
    },
    "suse_vex": {
      "aggregate_severity": "moderate",
      "current_release_date": "2026-09-16T00:00:10Z",
      "cve": "CVE-2026-89690",
      "id": "CVE-2026-89690",
      "initial_release_date": "2026-09-15T00:56:54Z",
      "product_status:known_affected": "29",
      "product_status:known_not_affected": "324",
      "source": "SUSE CSAF VEX",
      "status": "interim",
      "title": "SUSE CVE CVE-2026-89690",
      "url": "https://ftp.suse.com/pub/projects/security/csaf-vex/cve-2026-89690.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…

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…