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

CVE-2026-89667 (GCVE-0-2026-89667)

Vulnerability from cvelistv5 – Published: 2026-09-11 19:45 – Updated: 2026-09-13 06:32
VLAI
Title
nfsd: close shrinker/GC/fsnotify vs per-net shutdown race in filecache
Summary
In the Linux kernel, the following vulnerability has been resolved: nfsd: close shrinker/GC/fsnotify vs per-net shutdown race in filecache The shrinker, GC worker, and fsnotify/lease callbacks can unhash an nfsd_file from the rhashtable and then call nfsd_file_dispose_list_delayed() to move it to the per-net dispose list. If nfsd_file_cache_shutdown_net() runs concurrently, its rhashtable walk misses the already-unhashed file, and its drain of the per-net dispose list can run before the file has been queued. The file then sits on the per-net list with no thread to drain it, leaking both the file and its associated state. The GC worker and shrinker already hold nfsd_gc_lock while walking the LRU, but in the original code they release it before calling nfsd_file_dispose_list_delayed(). The fsnotify/lease path (nfsd_file_close_inode) has no synchronization at all. Fix this by: 1. Widening nfsd_gc_lock in both nfsd_file_gc() and nfsd_file_lru_scan() to cover the nfsd_file_dispose_list_delayed() call. 2. Wrapping nfsd_file_close_inode() in nfsd_gc_lock so that all three callers of nfsd_file_dispose_list_delayed() hold the lock. 3. Adding a spin_lock/unlock(nfsd_gc_lock) barrier in nfsd_file_cache_shutdown_net() after the purge, so that any in-progress disposal has fully completed before the per-net list is drained. All operations inside the lock are non-sleeping (rhashtable lookups, atomic bit/refcount ops, list moves, svc_wake_up), so the spinlock is appropriate.
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: ffb402596147ac583f3464ff5c48feb9423e3838 , < 6d6b9f6a75c3767250e9c23ace4e384ab8f7843e (git)
Affected: ffb402596147ac583f3464ff5c48feb9423e3838 , < 08af9593e2b472fd98c00faf1bf03bdbb7203477 (git)
Affected: ffb402596147ac583f3464ff5c48feb9423e3838 , < 40162cfea79b9510380decfdd1795b754dc9f972 (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/filecache.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "6d6b9f6a75c3767250e9c23ace4e384ab8f7843e",
              "status": "affected",
              "version": "ffb402596147ac583f3464ff5c48feb9423e3838",
              "versionType": "git"
            },
            {
              "lessThan": "08af9593e2b472fd98c00faf1bf03bdbb7203477",
              "status": "affected",
              "version": "ffb402596147ac583f3464ff5c48feb9423e3838",
              "versionType": "git"
            },
            {
              "lessThan": "40162cfea79b9510380decfdd1795b754dc9f972",
              "status": "affected",
              "version": "ffb402596147ac583f3464ff5c48feb9423e3838",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "fs/nfsd/filecache.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: close shrinker/GC/fsnotify vs per-net shutdown race in filecache\n\nThe shrinker, GC worker, and fsnotify/lease callbacks can unhash an\nnfsd_file from the rhashtable and then call\nnfsd_file_dispose_list_delayed() to move it to the per-net dispose list.\nIf nfsd_file_cache_shutdown_net() runs concurrently, its rhashtable walk\nmisses the already-unhashed file, and its drain of the per-net dispose\nlist can run before the file has been queued.  The file then sits on\nthe per-net list with no thread to drain it, leaking both the file and\nits associated state.\n\nThe GC worker and shrinker already hold nfsd_gc_lock while walking the\nLRU, but in the original code they release it before calling\nnfsd_file_dispose_list_delayed().  The fsnotify/lease path\n(nfsd_file_close_inode) has no synchronization at all.\n\nFix this by:\n\n  1. Widening nfsd_gc_lock in both nfsd_file_gc() and nfsd_file_lru_scan()\n     to cover the nfsd_file_dispose_list_delayed() call.\n\n  2. Wrapping nfsd_file_close_inode() in nfsd_gc_lock so that all three\n     callers of nfsd_file_dispose_list_delayed() hold the lock.\n\n  3. Adding a spin_lock/unlock(nfsd_gc_lock) barrier in\n     nfsd_file_cache_shutdown_net() after the purge, so that any\n     in-progress disposal has fully completed before the per-net list\n     is drained.\n\nAll operations inside the lock are non-sleeping (rhashtable lookups,\natomic bit/refcount ops, list moves, svc_wake_up), so the spinlock is\nappropriate."
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "baseScore": 8.1,
            "baseSeverity": "HIGH",
            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H",
            "version": "3.1"
          },
          "scenarios": [
            {
              "lang": "en",
              "value": "AV:N - The vulnerable nfsd filecache GC, shrinker, and fsnotify close paths run in the in-kernel NFS server and are reached by NFS RPCs (OPEN/READ/WRITE/REMOVE) on TCP/UDP 2049 from a remote client; no local login is required.\nAC:H - Hitting the bug requires nfsd_file_cache_shutdown_net() to interleave with unhash plus delayed dispose; a remote client can populate the cache and trigger GC, shrinker, or fsnotify close, but cannot itself stop nfsd or destroy the server net namespace.\nPR:N - Typical nfsd deployments allow AUTH_SYS/AUTH_NULL with IP-based exports, so a remote peer that can reach the export self-asserts credentials with no cryptographic authentication and can populate the filecache via READ/WRITE.\nUI:N - Attacker-sent NFS operations drive the filecache side; no victim user action such as mounting a filesystem or opening a local file is required.\nS:U - The use-after-free or leak corrupts kernel nfsd_file/nfsd_net state within the host nfsd authority and does not cross a VM, IOMMU, or sandbox boundary.\nC:H - Delayed dispose can call net_generic() and list_move on nfsd_net after per-net teardown frees it, a use-after-free of slab per-net data that enables reuse/spray and arbitrary kernel memory disclosure.\nI:H - The same freed nfsd_net is used for spin_lock and list_move_tail, a use-after-free write primitive that enables heap spraying, object corruption, and control-flow hijacking.\nA:H - Use-after-free of nfsd_net can oops or panic, and leaked nfsd_file objects permanently pin struct file/inode state so filesystem and netns teardown can hang, fully disrupting the NFS server host."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-09-13T06:32:48.837Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/6d6b9f6a75c3767250e9c23ace4e384ab8f7843e"
        },
        {
          "url": "https://git.kernel.org/stable/c/08af9593e2b472fd98c00faf1bf03bdbb7203477"
        },
        {
          "url": "https://git.kernel.org/stable/c/40162cfea79b9510380decfdd1795b754dc9f972"
        }
      ],
      "title": "nfsd: close shrinker/GC/fsnotify vs per-net shutdown race in filecache",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-89667",
    "datePublished": "2026-09-11T19:45:53.609Z",
    "dateReserved": "2026-09-11T19:38:34.745Z",
    "dateUpdated": "2026-09-13T06:32:48.837Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-89667",
      "date": "2026-09-15",
      "epss": "0.00512",
      "percentile": "0.42208"
    },
    "nvd": "{\"cve\":{\"id\":\"CVE-2026-89667\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2026-09-11T20:19:53.177\",\"lastModified\":\"2026-09-13T07:17:32.307\",\"vulnStatus\":\"Received\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"In the Linux kernel, the following vulnerability has been resolved:\\n\\nnfsd: close shrinker/GC/fsnotify vs per-net shutdown race in filecache\\n\\nThe shrinker, GC worker, and fsnotify/lease callbacks can unhash an\\nnfsd_file from the rhashtable and then call\\nnfsd_file_dispose_list_delayed() to move it to the per-net dispose list.\\nIf nfsd_file_cache_shutdown_net() runs concurrently, its rhashtable walk\\nmisses the already-unhashed file, and its drain of the per-net dispose\\nlist can run before the file has been queued.  The file then sits on\\nthe per-net list with no thread to drain it, leaking both the file and\\nits associated state.\\n\\nThe GC worker and shrinker already hold nfsd_gc_lock while walking the\\nLRU, but in the original code they release it before calling\\nnfsd_file_dispose_list_delayed().  The fsnotify/lease path\\n(nfsd_file_close_inode) has no synchronization at all.\\n\\nFix this by:\\n\\n  1. Widening nfsd_gc_lock in both nfsd_file_gc() and nfsd_file_lru_scan()\\n     to cover the nfsd_file_dispose_list_delayed() call.\\n\\n  2. Wrapping nfsd_file_close_inode() in nfsd_gc_lock so that all three\\n     callers of nfsd_file_dispose_list_delayed() hold the lock.\\n\\n  3. Adding a spin_lock/unlock(nfsd_gc_lock) barrier in\\n     nfsd_file_cache_shutdown_net() after the purge, so that any\\n     in-progress disposal has fully completed before the per-net list\\n     is drained.\\n\\nAll operations inside the lock are non-sleeping (rhashtable lookups,\\natomic bit/refcount ops, list moves, svc_wake_up), so the spinlock is\\nappropriate.\"}],\"affected\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"affectedData\":[{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"unaffected\",\"programFiles\":[\"fs/nfsd/filecache.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"ffb402596147ac583f3464ff5c48feb9423e3838\",\"lessThan\":\"6d6b9f6a75c3767250e9c23ace4e384ab8f7843e\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"ffb402596147ac583f3464ff5c48feb9423e3838\",\"lessThan\":\"08af9593e2b472fd98c00faf1bf03bdbb7203477\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"ffb402596147ac583f3464ff5c48feb9423e3838\",\"lessThan\":\"40162cfea79b9510380decfdd1795b754dc9f972\",\"versionType\":\"git\",\"status\":\"affected\"}]},{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"affected\",\"programFiles\":[\"fs/nfsd/filecache.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:H/PR:N/UI:N/S:U/C:H/I:H/A:H\",\"baseScore\":8.1,\"baseSeverity\":\"HIGH\",\"attackVector\":\"NETWORK\",\"attackComplexity\":\"HIGH\",\"privilegesRequired\":\"NONE\",\"userInteraction\":\"NONE\",\"scope\":\"UNCHANGED\",\"confidentialityImpact\":\"HIGH\",\"integrityImpact\":\"HIGH\",\"availabilityImpact\":\"HIGH\"},\"exploitabilityScore\":2.2,\"impactScore\":5.9}]},\"references\":[{\"url\":\"https://git.kernel.org/stable/c/08af9593e2b472fd98c00faf1bf03bdbb7203477\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/40162cfea79b9510380decfdd1795b754dc9f972\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/6d6b9f6a75c3767250e9c23ace4e384ab8f7843e\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"}]}}",
    "redhat_vex": {
      "aggregate_severity": "Moderate",
      "current_release_date": "2026-09-15T14:05:52+00:00",
      "cve": "CVE-2026-89667",
      "id": "CVE-2026-89667",
      "initial_release_date": "2026-09-11T00:00:00+00:00",
      "product_status:known_affected": "185",
      "product_status:known_not_affected": "91",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: nfsd: close shrinker/GC/fsnotify vs per-net shutdown race in filecache",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-89667.json",
      "version": "3"
    },
    "suse_vex": {
      "aggregate_severity": "moderate",
      "current_release_date": "2026-09-16T00:00:44Z",
      "cve": "CVE-2026-89667",
      "id": "CVE-2026-89667",
      "initial_release_date": "2026-09-12T16:24:00Z",
      "product_status:known_affected": "168",
      "product_status:known_not_affected": "185",
      "source": "SUSE CSAF VEX",
      "status": "interim",
      "title": "SUSE CVE CVE-2026-89667",
      "url": "https://ftp.suse.com/pub/projects/security/csaf-vex/cve-2026-89667.json",
      "version": "5"
    }
  }
}



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…