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

CVE-2026-89786 (GCVE-0-2026-89786)

Vulnerability from cvelistv5 – Published: 2026-09-16 08:48 – Updated: 2026-09-16 14:38
VLAI
Title
ext4: fix out-of-bounds read in ext4_read_inline_dir()
Summary
In the Linux kernel, the following vulnerability has been resolved: ext4: fix out-of-bounds read in ext4_read_inline_dir() ext4_read_inline_dir() can read a dirent header past the end of its inline buffer, triggering a slab-out-of-bounds read during getdents64(): BUG: KASAN: slab-out-of-bounds in __ext4_check_dir_entry Read of size 2 at addr ffff88800f3dd23c by task exploit/148 ... __ext4_check_dir_entry ext4_read_inline_dir iterate_dir The dirent payload lives in a buffer of exactly inline_size bytes: dir_buf = kmalloc(inline_size, GFP_NOFS); but iteration runs in a position space extra_offset bytes larger (extra_size = extra_offset + inline_size) so the synthetic "." and ".." land at their block-dir offsets. A dirent is formed at "dir_buf + pos - extra_offset", yet the ext4_check_dir_entry() length argument uses the larger extra_size. A position whose dirent header would extend past extra_size is therefore accepted, and the rescan loop's rec_len probe and ext4_check_dir_entry() dereference de->rec_len before the entry is rejected. Reject a position whose minimum-size dirent header would not fit within extra_size before forming de, in both the rescan and main loops, and pass inline_size rather than extra_size to ext4_check_dir_entry() so the length check matches the physical buffer.
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: c4d8b0235aa98f8c26bf94d308be3fdd24154572 , < d1e7c186555ad65554fd2f2b02f5a539aa35ae48 (git)
Affected: c4d8b0235aa98f8c26bf94d308be3fdd24154572 , < 5fd20d4e50dd6e460b3ea8e4396f8553d4526f8f (git)
Affected: c4d8b0235aa98f8c26bf94d308be3fdd24154572 , < 1a1dea633b724a1c042dbcdb1fed27f410916688 (git)
Affected: c4d8b0235aa98f8c26bf94d308be3fdd24154572 , < b060861f662d4826dc700a1c3584243bb3474cfe (git)
Affected: c4d8b0235aa98f8c26bf94d308be3fdd24154572 , < 6702c7da86d8cdb88d0fc57166286e115ffeb8c0 (git)
Affected: c4d8b0235aa98f8c26bf94d308be3fdd24154572 , < 36bf17bb90cdf7a623499b624b05acde4d2feef5 (git)
Affected: c4d8b0235aa98f8c26bf94d308be3fdd24154572 , < 9333cc809f0a89e001b814155a6cb8903a6274df (git)
guessed Create a notification for this product.
Linux Linux Affected: 3.10
Unaffected: 0 , < 3.10 (semver)
Unaffected: 5.15.221 , ≤ 5.15.* (semver)
Unaffected: 6.1.188 , ≤ 6.1.* (semver)
Unaffected: 6.6.157 , ≤ 6.6.* (semver)
Unaffected: 6.12.110 , ≤ 6.12.* (semver)
Unaffected: 6.18.52 , ≤ 6.18.* (semver)
Unaffected: 7.2.6 , ≤ 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/ext4/inline.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "d1e7c186555ad65554fd2f2b02f5a539aa35ae48",
              "status": "affected",
              "version": "c4d8b0235aa98f8c26bf94d308be3fdd24154572",
              "versionType": "git"
            },
            {
              "lessThan": "5fd20d4e50dd6e460b3ea8e4396f8553d4526f8f",
              "status": "affected",
              "version": "c4d8b0235aa98f8c26bf94d308be3fdd24154572",
              "versionType": "git"
            },
            {
              "lessThan": "1a1dea633b724a1c042dbcdb1fed27f410916688",
              "status": "affected",
              "version": "c4d8b0235aa98f8c26bf94d308be3fdd24154572",
              "versionType": "git"
            },
            {
              "lessThan": "b060861f662d4826dc700a1c3584243bb3474cfe",
              "status": "affected",
              "version": "c4d8b0235aa98f8c26bf94d308be3fdd24154572",
              "versionType": "git"
            },
            {
              "lessThan": "6702c7da86d8cdb88d0fc57166286e115ffeb8c0",
              "status": "affected",
              "version": "c4d8b0235aa98f8c26bf94d308be3fdd24154572",
              "versionType": "git"
            },
            {
              "lessThan": "36bf17bb90cdf7a623499b624b05acde4d2feef5",
              "status": "affected",
              "version": "c4d8b0235aa98f8c26bf94d308be3fdd24154572",
              "versionType": "git"
            },
            {
              "lessThan": "9333cc809f0a89e001b814155a6cb8903a6274df",
              "status": "affected",
              "version": "c4d8b0235aa98f8c26bf94d308be3fdd24154572",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "fs/ext4/inline.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "3.10"
            },
            {
              "lessThan": "3.10",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "5.15.*",
              "status": "unaffected",
              "version": "5.15.221",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.1.*",
              "status": "unaffected",
              "version": "6.1.188",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.6.*",
              "status": "unaffected",
              "version": "6.6.157",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.12.*",
              "status": "unaffected",
              "version": "6.12.110",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.18.*",
              "status": "unaffected",
              "version": "6.18.52",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "7.2.*",
              "status": "unaffected",
              "version": "7.2.6",
              "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": "5.15.221",
                  "versionStartIncluding": "3.10",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.1.188",
                  "versionStartIncluding": "3.10",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.6.157",
                  "versionStartIncluding": "3.10",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.12.110",
                  "versionStartIncluding": "3.10",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18.52",
                  "versionStartIncluding": "3.10",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2.6",
                  "versionStartIncluding": "3.10",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3-rc1",
                  "versionStartIncluding": "3.10",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\next4: fix out-of-bounds read in ext4_read_inline_dir()\n\next4_read_inline_dir() can read a dirent header past the end of its inline\nbuffer, triggering a slab-out-of-bounds read during getdents64():\n\n  BUG: KASAN: slab-out-of-bounds in __ext4_check_dir_entry\n  Read of size 2 at addr ffff88800f3dd23c by task exploit/148\n   ...\n   __ext4_check_dir_entry\n   ext4_read_inline_dir\n   iterate_dir\n\nThe dirent payload lives in a buffer of exactly inline_size bytes:\n\n\tdir_buf = kmalloc(inline_size, GFP_NOFS);\n\nbut iteration runs in a position space extra_offset bytes larger\n(extra_size = extra_offset + inline_size) so the synthetic \".\" and \"..\"\nland at their block-dir offsets. A dirent is formed at \"dir_buf + pos -\nextra_offset\", yet the ext4_check_dir_entry() length argument uses the\nlarger extra_size. A position whose dirent header would extend past\nextra_size is therefore accepted, and the rescan loop\u0027s rec_len probe and\next4_check_dir_entry() dereference de-\u003erec_len before the entry is rejected.\n\nReject a position whose minimum-size dirent header would not fit within\nextra_size before forming de, in both the rescan and main loops, and pass\ninline_size rather than extra_size to ext4_check_dir_entry() so the length\ncheck matches the physical buffer."
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "baseScore": 9.1,
            "baseSeverity": "CRITICAL",
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H",
            "version": "3.1"
          },
          "scenarios": [
            {
              "lang": "en",
              "value": "AV:N - The slab OOB is in ext4_read_inline_dir(), reached from getdents64 via iterate_dir\u2192ext4_readdir. nfsd_readdir does vfs_llseek plus iterate_dir, and ksmbd QUERY_DIRECTORY also calls iterate_dir, so a remote NFS/SMB client can trigger the same path on an ext4-backed export.\nAC:L - A crafted inline directory with attacker-controlled rec_len values (or a seek/NFS cookie that lands ctx-\u003epos near extra_size) deterministically forms a dirent past kmalloc(inline_size) and dereferences de-\u003erec_len. No race or attacker-uncontrollable heap layout is required.\nPR:N - READDIR on a guest/anonymous ksmbd share or AUTH_SYS NFS export needs no host account or capability. Automount of a malicious volume by udisks2/systemd also requires no attacker privileges on the victim.\nUI:N - Once the crafted or inline-data ext4 volume is exported or automounted, the attacker alone issues NFS/SMB READDIR or local getdents64. No separate victim must open a file or confirm a dialog at attack time.\nS:U - The out-of-bounds read and any resulting kernel crash stay within the host kernel\u0027s security authority. This is not a VM escape, IOMMU/DMA bypass, or other cross-boundary breakout.\nC:H - ext4_check_dir_entry over-reads de-\u003erec_len and adjacent dirent fields past the inline kmalloc buffer. If the inflated extra_size bound lets the check pass, dir_emit copies de-\u003ename for up to 255 bytes of adjacent kernel heap into the getdents/NFS/SMB reply.\nI:N - The defect is an over-read on the readdir path only. ext4_read_inline_dir does not write the over-read dirent, and there is no out-of-bounds write, type confusion, or control-flow hijack primitive.\nA:H - KASAN reports a slab-out-of-bounds read in __ext4_check_dir_entry. An over-read that reaches unmapped slab or guard pages oopses or panics the kernel, and the attacker can repeat READDIR/getdents against the crafted directory."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-09-16T14:38:36.340Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/d1e7c186555ad65554fd2f2b02f5a539aa35ae48"
        },
        {
          "url": "https://git.kernel.org/stable/c/5fd20d4e50dd6e460b3ea8e4396f8553d4526f8f"
        },
        {
          "url": "https://git.kernel.org/stable/c/1a1dea633b724a1c042dbcdb1fed27f410916688"
        },
        {
          "url": "https://git.kernel.org/stable/c/b060861f662d4826dc700a1c3584243bb3474cfe"
        },
        {
          "url": "https://git.kernel.org/stable/c/6702c7da86d8cdb88d0fc57166286e115ffeb8c0"
        },
        {
          "url": "https://git.kernel.org/stable/c/36bf17bb90cdf7a623499b624b05acde4d2feef5"
        },
        {
          "url": "https://git.kernel.org/stable/c/9333cc809f0a89e001b814155a6cb8903a6274df"
        }
      ],
      "title": "ext4: fix out-of-bounds read in ext4_read_inline_dir()",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-89786",
    "datePublished": "2026-09-16T08:48:23.730Z",
    "dateReserved": "2026-09-11T19:38:34.766Z",
    "dateUpdated": "2026-09-16T14:38:36.340Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2026-89786",
      "date": "2026-09-16",
      "epss": "0.00205",
      "percentile": "0.10809"
    },
    "nvd": "{\"cve\":{\"id\":\"CVE-2026-89786\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2026-09-16T09:17:09.330\",\"lastModified\":\"2026-09-16T15:18:08.860\",\"vulnStatus\":\"Received\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"In the Linux kernel, the following vulnerability has been resolved:\\n\\next4: fix out-of-bounds read in ext4_read_inline_dir()\\n\\next4_read_inline_dir() can read a dirent header past the end of its inline\\nbuffer, triggering a slab-out-of-bounds read during getdents64():\\n\\n  BUG: KASAN: slab-out-of-bounds in __ext4_check_dir_entry\\n  Read of size 2 at addr ffff88800f3dd23c by task exploit/148\\n   ...\\n   __ext4_check_dir_entry\\n   ext4_read_inline_dir\\n   iterate_dir\\n\\nThe dirent payload lives in a buffer of exactly inline_size bytes:\\n\\n\\tdir_buf = kmalloc(inline_size, GFP_NOFS);\\n\\nbut iteration runs in a position space extra_offset bytes larger\\n(extra_size = extra_offset + inline_size) so the synthetic \\\".\\\" and \\\"..\\\"\\nland at their block-dir offsets. A dirent is formed at \\\"dir_buf + pos -\\nextra_offset\\\", yet the ext4_check_dir_entry() length argument uses the\\nlarger extra_size. A position whose dirent header would extend past\\nextra_size is therefore accepted, and the rescan loop\u0027s rec_len probe and\\next4_check_dir_entry() dereference de-\u003erec_len before the entry is rejected.\\n\\nReject a position whose minimum-size dirent header would not fit within\\nextra_size before forming de, in both the rescan and main loops, and pass\\ninline_size rather than extra_size to ext4_check_dir_entry() so the length\\ncheck matches the physical buffer.\"}],\"affected\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"affectedData\":[{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"unaffected\",\"programFiles\":[\"fs/ext4/inline.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"c4d8b0235aa98f8c26bf94d308be3fdd24154572\",\"lessThan\":\"d1e7c186555ad65554fd2f2b02f5a539aa35ae48\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"c4d8b0235aa98f8c26bf94d308be3fdd24154572\",\"lessThan\":\"5fd20d4e50dd6e460b3ea8e4396f8553d4526f8f\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"c4d8b0235aa98f8c26bf94d308be3fdd24154572\",\"lessThan\":\"1a1dea633b724a1c042dbcdb1fed27f410916688\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"c4d8b0235aa98f8c26bf94d308be3fdd24154572\",\"lessThan\":\"b060861f662d4826dc700a1c3584243bb3474cfe\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"c4d8b0235aa98f8c26bf94d308be3fdd24154572\",\"lessThan\":\"6702c7da86d8cdb88d0fc57166286e115ffeb8c0\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"c4d8b0235aa98f8c26bf94d308be3fdd24154572\",\"lessThan\":\"36bf17bb90cdf7a623499b624b05acde4d2feef5\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"c4d8b0235aa98f8c26bf94d308be3fdd24154572\",\"lessThan\":\"9333cc809f0a89e001b814155a6cb8903a6274df\",\"versionType\":\"git\",\"status\":\"affected\"}]},{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"affected\",\"programFiles\":[\"fs/ext4/inline.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"3.10\",\"status\":\"affected\"},{\"version\":\"0\",\"lessThan\":\"3.10\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"5.15.221\",\"lessThanOrEqual\":\"5.15.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.1.188\",\"lessThanOrEqual\":\"6.1.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.6.157\",\"lessThanOrEqual\":\"6.6.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.12.110\",\"lessThanOrEqual\":\"6.12.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.18.52\",\"lessThanOrEqual\":\"6.18.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"7.2.6\",\"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:L/PR:N/UI:N/S:U/C:H/I:N/A:H\",\"baseScore\":9.1,\"baseSeverity\":\"CRITICAL\",\"attackVector\":\"NETWORK\",\"attackComplexity\":\"LOW\",\"privilegesRequired\":\"NONE\",\"userInteraction\":\"NONE\",\"scope\":\"UNCHANGED\",\"confidentialityImpact\":\"HIGH\",\"integrityImpact\":\"NONE\",\"availabilityImpact\":\"HIGH\"},\"exploitabilityScore\":3.9,\"impactScore\":5.2}]},\"references\":[{\"url\":\"https://git.kernel.org/stable/c/1a1dea633b724a1c042dbcdb1fed27f410916688\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/36bf17bb90cdf7a623499b624b05acde4d2feef5\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/5fd20d4e50dd6e460b3ea8e4396f8553d4526f8f\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/6702c7da86d8cdb88d0fc57166286e115ffeb8c0\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/9333cc809f0a89e001b814155a6cb8903a6274df\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/b060861f662d4826dc700a1c3584243bb3474cfe\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/d1e7c186555ad65554fd2f2b02f5a539aa35ae48\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"}]}}"
  }
}



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…