CVE-2026-89668 (GCVE-0-2026-89668)
Vulnerability from cvelistv5
Published
2026-09-11 19:45
Modified
2026-10-19 08:50
Summary
In the Linux kernel, the following vulnerability has been resolved: nfsd: move nfsd_debugfs_init() after nfsd4_init_slabs() in init_nfsd() nfsd_debugfs_init() runs before nfsd4_init_slabs() in init_nfsd(). If the slab allocation fails, the bare "return retval" bypasses nfsd_debugfs_exit(), leaving orphan debugfs files with stale fops pointers into the freed module text. Move nfsd_debugfs_init() to after the slab init succeeds, so the early return has no debugfs state to clean up. Since debugfs is now the more recently initialized of the two, also update the unwind paths to match reverse-initialization (LIFO) order: run nfsd_debugfs_exit() before nfsd4_free_slabs() in both the init_nfsd() error path and exit_nfsd(). The nfsd debugfs files only reference module-global state and have no dependency on the slab caches, so that reordering is a cleanup with no functional change.
Impacted products
Vendor Product Version
Linux Linux Version: 9fe5ea760e64f04412dbed51645a0dac7220d40a
Version: 9fe5ea760e64f04412dbed51645a0dac7220d40a
Version: 9fe5ea760e64f04412dbed51645a0dac7220d40a
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "fs/nfsd/nfsctl.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "4ae5d7490ae6a7b83b3d607f88c499f4f85e753a",
              "status": "affected",
              "version": "9fe5ea760e64f04412dbed51645a0dac7220d40a",
              "versionType": "git"
            },
            {
              "lessThan": "ab43ff94f5dfc2b6a080b167b69855eb7655c98b",
              "status": "affected",
              "version": "9fe5ea760e64f04412dbed51645a0dac7220d40a",
              "versionType": "git"
            },
            {
              "lessThan": "2c390c8a1764d67095fe444401861fac4c049362",
              "status": "affected",
              "version": "9fe5ea760e64f04412dbed51645a0dac7220d40a",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "fs/nfsd/nfsctl.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "6.16"
            },
            {
              "lessThan": "6.16",
              "status": "unaffected",
              "version": "0",
              "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",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18.50",
                  "versionStartIncluding": "6.16",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2.4",
                  "versionStartIncluding": "6.16",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3",
                  "versionStartIncluding": "6.16",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nnfsd: move nfsd_debugfs_init() after nfsd4_init_slabs() in init_nfsd()\n\nnfsd_debugfs_init() runs before nfsd4_init_slabs() in init_nfsd().\nIf the slab allocation fails, the bare \"return retval\" bypasses\nnfsd_debugfs_exit(), leaving orphan debugfs files with stale fops\npointers into the freed module text.\n\nMove nfsd_debugfs_init() to after the slab init succeeds, so the\nearly return has no debugfs state to clean up.\n\nSince debugfs is now the more recently initialized of the two, also\nupdate the unwind paths to match reverse-initialization (LIFO) order:\nrun nfsd_debugfs_exit() before nfsd4_free_slabs() in both the\ninit_nfsd() error path and exit_nfsd(). The nfsd debugfs files only\nreference module-global state and have no dependency on the slab\ncaches, so that reordering is a cleanup with no functional change."
        }
      ],
      "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 stale fops are reached only by a local open of leftover /sys/kernel/debug/nfsd files after a failed nfsd.ko load; init_nfsd() is module init, not NFS RPC dispatch, so a remote NFS peer cannot dereference the orphan debugfs inodes.\nAC:L - An attacker can force nfsd autoload via mount -t nfsd (get_fs_type() calls request_module(\"fs-nfsd\") before mount_capable()) while applying memory pressure so nfsd4_init_slabs() KMEM_CACHE allocations fail; once the module is freed, opening the orphan debugfs files hits the stale fops deterministically.\nPR:L - request_module(\"fs-nfsd\") runs in get_fs_type() before any capability check, so an unprivileged user namespace can trigger the failed init; leftover files are created 0644/S_IRUGO, and on common debugfs deployments (embedded/Android, mode=755) any local user can open them without capabilities.\nUI:N - The attacker performs the autoload, memory-pressure, and debugfs open sequence from their own process; no separate victim must start nfsd, mount a filesystem, or otherwise interact.\nS:U - The leftover debugfs inodes and the use-after-free of nfsd module text stay inside the host kernel\u0027s address space; this is a local privilege-escalation primitive and does not cross a VM, IOMMU, or sandbox boundary.\nC:H - Opening the orphan files is a use-after-free of module text: __debugfs_file_get() and open_proxy_open() dereference DEBUGFS_I()-\u003ereal_fops in the unloaded nfsd image, and reclaiming that memory lets the attacker disclose arbitrary kernel contents through the reused fops object.\nI:H - The leftover inodes hold pointers to nfsd_dsr_fops and nfsd_io_cache_*_fops in freed module memory; after reclaim the attacker controls those file_operations, so open_proxy_open()\u0027s replace_fops() and -\u003eopen install attacker-controlled callbacks and yield arbitrary write and code execution.\nA:H - Any open of leftover /sys/kernel/debug/nfsd files dereferences unmapped or reused module text (ops-\u003ellseek/read/owner in __debugfs_file_get/open_proxy_open), which oopses or panics the kernel even when the UAF is not fully turned into a write primitive."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-10-19T08:50:41.624Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/4ae5d7490ae6a7b83b3d607f88c499f4f85e753a"
        },
        {
          "url": "https://git.kernel.org/stable/c/ab43ff94f5dfc2b6a080b167b69855eb7655c98b"
        },
        {
          "url": "https://git.kernel.org/stable/c/2c390c8a1764d67095fe444401861fac4c049362"
        }
      ],
      "title": "nfsd: move nfsd_debugfs_init() after nfsd4_init_slabs() in init_nfsd()",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-89668",
    "datePublished": "2026-09-11T19:45:54.354Z",
    "dateReserved": "2026-09-11T19:38:34.745Z",
    "dateUpdated": "2026-10-19T08:50:41.624Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}


Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Sightings

Author Source Type Date

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
  • Confirmed: The vulnerability is confirmed from an analyst perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
  • Patched: This vulnerability was successfully patched by the user reporting the sighting.
  • Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
  • Not confirmed: The user expresses doubt about the veracity of the vulnerability.
  • Not patched: This vulnerability was not successfully patched by the user reporting the sighting.


Loading…

Loading…