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

CVE-2026-89600 (GCVE-0-2026-89600)

Vulnerability from cvelistv5 – Published: 2026-09-11 19:45 – Updated: 2026-09-13 06:31
VLAI
Title
fanotify: fix use-after-free of file range info
Summary
In the Linux kernel, the following vulnerability has been resolved: fanotify: fix use-after-free of file range info fsnotify_pre_content() builds its file_range on the triggering task's stack. fanotify_alloc_perm_event() saves a pointer to range.pos in the heap-allocated permission event so copy_range_info_to_user() can report the offset later. The event reader can set the event state to FAN_EVENT_REPORTED and then sleep while preparing the file descriptor. If a signal interrupts the triggering task at that point, fanotify_get_response() changes the state to FAN_EVENT_CANCELED and returns. This unwinds the file_range stack frame while the reader still owns the event. The reader then dereferences pevent->ppos and copies the stale stack value to userspace. KASAN reported: BUG: KASAN: use-after-free in fanotify_read+0x293e/0x2970 Read of size 8 at addr ffff88811434fc50 by task fanotify_inotif/95 Call Trace: fanotify_read+0x293e/0x2970 vfs_read+0x177/0xa20 ksys_read+0xf7/0x1c0 do_syscall_64+0xf9/0x540 entry_SYSCALL_64_after_hwframe+0x77/0x7f Store the range position directly in the permission event and use FANOTIFY_NO_RANGE when range information is unavailable. The event remains alive until the reader finishes, so the reported offset no longer depends on the triggering task's stack.
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: 870499bc1d4dc04cba1f63dd5e7bc02b983e2458 , < 66aa9a9e6481bfa512ee5b6380eaaec455a954d2 (git)
Affected: 870499bc1d4dc04cba1f63dd5e7bc02b983e2458 , < b8f73b163b646bc56d4dce9c697a578e333f4894 (git)
Affected: 870499bc1d4dc04cba1f63dd5e7bc02b983e2458 , < d7f1cf5be33ef0175a4e8ed8687aeb98fb00a851 (git)
guessed Create a notification for this product.
Linux Linux Affected: 6.14
Unaffected: 0 , < 6.14 (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/notify/fanotify/fanotify.c",
            "fs/notify/fanotify/fanotify.h",
            "fs/notify/fanotify/fanotify_user.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "66aa9a9e6481bfa512ee5b6380eaaec455a954d2",
              "status": "affected",
              "version": "870499bc1d4dc04cba1f63dd5e7bc02b983e2458",
              "versionType": "git"
            },
            {
              "lessThan": "b8f73b163b646bc56d4dce9c697a578e333f4894",
              "status": "affected",
              "version": "870499bc1d4dc04cba1f63dd5e7bc02b983e2458",
              "versionType": "git"
            },
            {
              "lessThan": "d7f1cf5be33ef0175a4e8ed8687aeb98fb00a851",
              "status": "affected",
              "version": "870499bc1d4dc04cba1f63dd5e7bc02b983e2458",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "fs/notify/fanotify/fanotify.c",
            "fs/notify/fanotify/fanotify.h",
            "fs/notify/fanotify/fanotify_user.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "6.14"
            },
            {
              "lessThan": "6.14",
              "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.14",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2.4",
                  "versionStartIncluding": "6.14",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3-rc1",
                  "versionStartIncluding": "6.14",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nfanotify: fix use-after-free of file range info\n\nfsnotify_pre_content() builds its file_range on the triggering task\u0027s\nstack. fanotify_alloc_perm_event() saves a pointer to range.pos in the\nheap-allocated permission event so copy_range_info_to_user() can report\nthe offset later.\n\nThe event reader can set the event state to FAN_EVENT_REPORTED and then\nsleep while preparing the file descriptor. If a signal interrupts the\ntriggering task at that point, fanotify_get_response() changes the state\nto FAN_EVENT_CANCELED and returns. This unwinds the file_range stack\nframe while the reader still owns the event. The reader then dereferences\npevent-\u003eppos and copies the stale stack value to userspace.\n\nKASAN reported:\n\n  BUG: KASAN: use-after-free in fanotify_read+0x293e/0x2970\n  Read of size 8 at addr ffff88811434fc50 by task fanotify_inotif/95\n  Call Trace:\n   fanotify_read+0x293e/0x2970\n   vfs_read+0x177/0xa20\n   ksys_read+0xf7/0x1c0\n   do_syscall_64+0xf9/0x540\n   entry_SYSCALL_64_after_hwframe+0x77/0x7f\n\nStore the range position directly in the permission event and use\nFANOTIFY_NO_RANGE when range information is unavailable. The event remains\nalive until the reader finishes, so the reported offset no longer depends\non the triggering task\u0027s stack."
        }
      ],
      "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 bug is reached only through local syscalls: fanotify_init/fanotify_mark to install a FAN_CLASS_PRE_CONTENT watch, read() on the fanotify fd, and a local read/write/mmap/truncate of a watched regular file that hits fsnotify_pre_content(). No network protocol handler delivers these events to an attacker.\nAC:L - The attacker owns both sides of the race: a listener that sets FAN_EVENT_REPORTED then sleeps in create_fd() or copy_to_user, and a triggering task they SIGKILL while it waits in fanotify_get_response(). That cancels the wait, unwinds the file_range stack, and leaves pevent-\u003eppos dangling for the reader.\nPR:L - FAN_CLASS_PRE_CONTENT requires capable(CAP_SYS_ADMIN), which a user-namespace root obtains via unshare. Inode FAN_PRE_ACCESS marks do not require init-namespace root; FANOTIFY_UNPRIV only suppresses event fds/pids and does not block permission events or the copy_range_info_to_user() UAF.\nUI:N - The attacker creates the watch, triggers pre-content access on their own file, and reads the fanotify fd themselves. No other user must open, mount, or otherwise interact with the system.\nS:U - The use-after-free and its impact stay inside the host kernel. This is a same-authority memory-safety issue, not a VM escape, IOMMU bypass, or other cross-boundary sandbox breakout.\nC:H - copy_range_info_to_user() dereferences the dangling pevent-\u003eppos and copies eight bytes of the triggering task\u0027s freed kernel stack to userspace. After that task exits, the stack can be reused, so the UAF read discloses kernel pointers or other object contents.\nI:H - This is a kernel use-after-free of stack memory retained via a heap permission event. After the triggering task is killed, the freed stack can be reallocated while the dangling pointer remains, which is a UAF memory-corruption primitive usable for write/control-flow hijack.\nA:H - KASAN already reports a use-after-free in fanotify_read(). If the triggering task exits and its vmap kernel stack is unmapped before the listener loads *ppos, the kernel takes a fault/oops and the system crashes."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-09-13T06:31:32.178Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/66aa9a9e6481bfa512ee5b6380eaaec455a954d2"
        },
        {
          "url": "https://git.kernel.org/stable/c/b8f73b163b646bc56d4dce9c697a578e333f4894"
        },
        {
          "url": "https://git.kernel.org/stable/c/d7f1cf5be33ef0175a4e8ed8687aeb98fb00a851"
        }
      ],
      "title": "fanotify: fix use-after-free of file range info",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-89600",
    "datePublished": "2026-09-11T19:45:03.450Z",
    "dateReserved": "2026-09-11T19:38:34.732Z",
    "dateUpdated": "2026-09-13T06:31:32.178Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-89600",
      "date": "2026-09-15",
      "epss": "0.00124",
      "percentile": "0.02409"
    },
    "nvd": "{\"cve\":{\"id\":\"CVE-2026-89600\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2026-09-11T20:19:44.870\",\"lastModified\":\"2026-09-13T07:17:25.393\",\"vulnStatus\":\"Received\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"In the Linux kernel, the following vulnerability has been resolved:\\n\\nfanotify: fix use-after-free of file range info\\n\\nfsnotify_pre_content() builds its file_range on the triggering task\u0027s\\nstack. fanotify_alloc_perm_event() saves a pointer to range.pos in the\\nheap-allocated permission event so copy_range_info_to_user() can report\\nthe offset later.\\n\\nThe event reader can set the event state to FAN_EVENT_REPORTED and then\\nsleep while preparing the file descriptor. If a signal interrupts the\\ntriggering task at that point, fanotify_get_response() changes the state\\nto FAN_EVENT_CANCELED and returns. This unwinds the file_range stack\\nframe while the reader still owns the event. The reader then dereferences\\npevent-\u003eppos and copies the stale stack value to userspace.\\n\\nKASAN reported:\\n\\n  BUG: KASAN: use-after-free in fanotify_read+0x293e/0x2970\\n  Read of size 8 at addr ffff88811434fc50 by task fanotify_inotif/95\\n  Call Trace:\\n   fanotify_read+0x293e/0x2970\\n   vfs_read+0x177/0xa20\\n   ksys_read+0xf7/0x1c0\\n   do_syscall_64+0xf9/0x540\\n   entry_SYSCALL_64_after_hwframe+0x77/0x7f\\n\\nStore the range position directly in the permission event and use\\nFANOTIFY_NO_RANGE when range information is unavailable. The event remains\\nalive until the reader finishes, so the reported offset no longer depends\\non the triggering task\u0027s stack.\"}],\"affected\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"affectedData\":[{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"unaffected\",\"programFiles\":[\"fs/notify/fanotify/fanotify.c\",\"fs/notify/fanotify/fanotify.h\",\"fs/notify/fanotify/fanotify_user.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"870499bc1d4dc04cba1f63dd5e7bc02b983e2458\",\"lessThan\":\"66aa9a9e6481bfa512ee5b6380eaaec455a954d2\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"870499bc1d4dc04cba1f63dd5e7bc02b983e2458\",\"lessThan\":\"b8f73b163b646bc56d4dce9c697a578e333f4894\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"870499bc1d4dc04cba1f63dd5e7bc02b983e2458\",\"lessThan\":\"d7f1cf5be33ef0175a4e8ed8687aeb98fb00a851\",\"versionType\":\"git\",\"status\":\"affected\"}]},{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"affected\",\"programFiles\":[\"fs/notify/fanotify/fanotify.c\",\"fs/notify/fanotify/fanotify.h\",\"fs/notify/fanotify/fanotify_user.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"6.14\",\"status\":\"affected\"},{\"version\":\"0\",\"lessThan\":\"6.14\",\"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/66aa9a9e6481bfa512ee5b6380eaaec455a954d2\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/b8f73b163b646bc56d4dce9c697a578e333f4894\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/d7f1cf5be33ef0175a4e8ed8687aeb98fb00a851\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"}]}}",
    "redhat_vex": {
      "aggregate_severity": "Moderate",
      "current_release_date": "2026-09-13T06:58:45+00:00",
      "cve": "CVE-2026-89600",
      "id": "CVE-2026-89600",
      "initial_release_date": "2026-09-11T19:45:03.450000+00:00",
      "product_status:known_affected": "2",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: Linux Kernel: Information Disclosure via fanotify Use-After-Free",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-89600.json",
      "version": "3"
    },
    "suse_vex": {
      "aggregate_severity": "important",
      "current_release_date": "2026-09-13T16:58:18Z",
      "cve": "CVE-2026-89600",
      "id": "CVE-2026-89600",
      "initial_release_date": "2026-09-12T16:25:23Z",
      "source": "SUSE CSAF VEX",
      "status": "interim",
      "title": "SUSE CVE CVE-2026-89600",
      "url": "https://ftp.suse.com/pub/projects/security/csaf-vex/cve-2026-89600.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…

Loading…