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

CVE-2026-89668 (GCVE-0-2026-89668)

Vulnerability from cvelistv5 – Published: 2026-09-11 19:45 – Updated: 2026-09-13 06:32
VLAI
Title
nfsd: move nfsd_debugfs_init() after nfsd4_init_slabs() in init_nfsd()
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 CPE status
Linux Linux Affected: 9fe5ea760e64f04412dbed51645a0dac7220d40a , < 4ae5d7490ae6a7b83b3d607f88c499f4f85e753a (git)
Affected: 9fe5ea760e64f04412dbed51645a0dac7220d40a , < ab43ff94f5dfc2b6a080b167b69855eb7655c98b (git)
Affected: 9fe5ea760e64f04412dbed51645a0dac7220d40a , < 2c390c8a1764d67095fe444401861fac4c049362 (git)
guessed Create a notification for this product.
Linux Linux Affected: 6.16
Unaffected: 0 , < 6.16 (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/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-rc1",
              "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-rc1",
                  "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-09-13T06:32:50.192Z",
        "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-09-13T06:32:50.192Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-89668",
      "date": "2026-09-17",
      "epss": "0.00171",
      "percentile": "0.06855"
    },
    "nvd": "{\"cve\":{\"id\":\"CVE-2026-89668\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2026-09-11T20:19:53.290\",\"lastModified\":\"2026-09-13T07:17:32.423\",\"vulnStatus\":\"Received\",\"cveTags\":[],\"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.\"}],\"affected\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"affectedData\":[{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"unaffected\",\"programFiles\":[\"fs/nfsd/nfsctl.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"9fe5ea760e64f04412dbed51645a0dac7220d40a\",\"lessThan\":\"4ae5d7490ae6a7b83b3d607f88c499f4f85e753a\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"9fe5ea760e64f04412dbed51645a0dac7220d40a\",\"lessThan\":\"ab43ff94f5dfc2b6a080b167b69855eb7655c98b\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"9fe5ea760e64f04412dbed51645a0dac7220d40a\",\"lessThan\":\"2c390c8a1764d67095fe444401861fac4c049362\",\"versionType\":\"git\",\"status\":\"affected\"}]},{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"affected\",\"programFiles\":[\"fs/nfsd/nfsctl.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"6.16\",\"status\":\"affected\"},{\"version\":\"0\",\"lessThan\":\"6.16\",\"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/2c390c8a1764d67095fe444401861fac4c049362\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/4ae5d7490ae6a7b83b3d607f88c499f4f85e753a\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/ab43ff94f5dfc2b6a080b167b69855eb7655c98b\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"}]}}",
    "redhat_vex": {
      "aggregate_severity": "Moderate",
      "current_release_date": "2026-09-15T11:02:28+00:00",
      "cve": "CVE-2026-89668",
      "id": "CVE-2026-89668",
      "initial_release_date": "2026-09-11T00:00:00+00:00",
      "product_status:known_affected": "76",
      "product_status:known_not_affected": "200",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: nfsd: move nfsd_debugfs_init() after nfsd4_init_slabs() in init_nfsd()",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-89668.json",
      "version": "3"
    },
    "suse_vex": {
      "aggregate_severity": "moderate",
      "current_release_date": "2026-09-16T00:00:42Z",
      "cve": "CVE-2026-89668",
      "id": "CVE-2026-89668",
      "initial_release_date": "2026-09-15T00:57:42Z",
      "product_status:known_not_affected": "353",
      "source": "SUSE CSAF VEX",
      "status": "interim",
      "title": "SUSE CVE CVE-2026-89668",
      "url": "https://ftp.suse.com/pub/projects/security/csaf-vex/cve-2026-89668.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…