CVE-2026-93095 (GCVE-0-2026-93095)
Vulnerability from cvelistv5
Published
2026-09-17 16:11
Modified
2026-10-19 09:05
Summary
In the Linux kernel, the following vulnerability has been resolved: hfsplus: validate thread record before delete key rebuild hfsplus_delete_cat() is called with str == NULL when the last open reference to an unlinked HFS+ hardlink backing inode is closed. In that case, the function finds the catalog thread by CNID and rebuilds the catalog key from thread.nodeName. That reconstruction path reads thread.nodeName.length directly from the catalog B-tree into fd.search_key and then copies length * 2 bytes into fd.search_key->cat.name.unicode. It does not first check that the found record is a thread record or that its size matches the thread name. A corrupted image can therefore provide an oversized thread name length and make hfs_bnode_read() write past the catalog search-key allocation. Read the CNID record through hfsplus_brec_read_cat(), which bounds the record read to sizeof(hfsplus_cat_entry) and verifies that a thread record's size exactly matches nodeName.length. Together, these checks ensure an accepted thread name fits HFSPLUS_MAX_STRLEN. Reject non-thread records before building the delete key from the validated thread name. Share the thread-record-type helper between hfsplus_find_cat() and hfsplus_delete_cat().
Impacted products
Vendor Product Version
Linux Linux Version: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2
Version: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2
Version: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2
Version: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2
Version: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2
Version: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2
Version: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2
Version: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "fs/hfsplus/catalog.c",
            "fs/hfsplus/hfsplus_fs.h"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "33cda0036bc683fc888c20b04a5fc030e3e8413b",
              "status": "affected",
              "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
              "versionType": "git"
            },
            {
              "lessThan": "b9729c51a8b67f8b20b8a8cf395da4be63a0c15b",
              "status": "affected",
              "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
              "versionType": "git"
            },
            {
              "lessThan": "af48abc1b00d865c3f4c4d76b901c44115cb7162",
              "status": "affected",
              "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
              "versionType": "git"
            },
            {
              "lessThan": "e20f3b749ad241df77ec1c3e13a9c22209aa1eb3",
              "status": "affected",
              "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
              "versionType": "git"
            },
            {
              "lessThan": "7898beee166c1145c0bca364d687b8437435bf1a",
              "status": "affected",
              "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
              "versionType": "git"
            },
            {
              "lessThan": "e31985c67ba00a59d9b1340af473c1dbe6c87856",
              "status": "affected",
              "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
              "versionType": "git"
            },
            {
              "lessThan": "473ea7aa35615829f0de7a71e8691d69dc24e328",
              "status": "affected",
              "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
              "versionType": "git"
            },
            {
              "lessThan": "e2ea5cac61acfc11dad22f1d2d4bc71d56c52a20",
              "status": "affected",
              "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
              "versionType": "git"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "fs/hfsplus/catalog.c",
            "fs/hfsplus/hfsplus_fs.h"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "2.6.12"
            },
            {
              "lessThan": "2.6.12",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "5.10.*",
              "status": "unaffected",
              "version": "5.10.270",
              "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",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "5.10.270",
                  "versionStartIncluding": "2.6.12",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "5.15.221",
                  "versionStartIncluding": "2.6.12",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.1.188",
                  "versionStartIncluding": "2.6.12",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.6.157",
                  "versionStartIncluding": "2.6.12",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.12.110",
                  "versionStartIncluding": "2.6.12",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.18.52",
                  "versionStartIncluding": "2.6.12",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.2.6",
                  "versionStartIncluding": "2.6.12",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "7.3",
                  "versionStartIncluding": "2.6.12",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nhfsplus: validate thread record before delete key rebuild\n\nhfsplus_delete_cat() is called with str == NULL when the last open\nreference to an unlinked HFS+ hardlink backing inode is closed. In that\ncase, the function finds the catalog thread by CNID and rebuilds the\ncatalog key from thread.nodeName.\n\nThat reconstruction path reads thread.nodeName.length directly from the\ncatalog B-tree into fd.search_key and then copies length * 2 bytes into\nfd.search_key-\u003ecat.name.unicode. It does not first check that the found\nrecord is a thread record or that its size matches the thread name.\n\nA corrupted image can therefore provide an oversized thread name length\nand make hfs_bnode_read() write past the catalog search-key allocation.\n\nRead the CNID record through hfsplus_brec_read_cat(), which bounds the\nrecord read to sizeof(hfsplus_cat_entry) and verifies that a thread\nrecord\u0027s size exactly matches nodeName.length. Together, these checks\nensure an accepted thread name fits HFSPLUS_MAX_STRLEN. Reject non-thread\nrecords before building the delete key from the validated thread name.\n\nShare the thread-record-type helper between hfsplus_find_cat() and\nhfsplus_delete_cat()."
        }
      ],
      "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 malformed value is on-disk catalog thread.nodeName.length. unlink(2) reaches it via do_unlinkat \u2192 vfs_unlink \u2192 hfsplus_unlink, and close via hfsplus_file_release; both call hfsplus_delete_cat() with str==NULL so hfs_bnode_read() copies that length into fd.search_key. This is local block/loop/USB VFS data, not a ksmbd/nfsd/packet field.\nAC:L - A crafted HFS+ catalog thread with nodeName.length above HFSPLUS_MAX_STRLEN (255) makes hfs_bnode_read() write length*2 bytes into fd.search_key-\u003ecat.name.unicode, which hfs_find_init() allocated as only cat_tree-\u003emax_key_len*2+4 bytes (~1036). The overflow is deterministic on unlink/close of that hardlink backing inode; no race or uninfluenced layout is required.\nPR:L - hfsplus_fs_type is FS_REQUIRES_DEV without FS_USERNS_MOUNT, so raw mount(2) needs CAP_SYS_ADMIN, but the highest-impact case is an unprivileged user whose USB/loop HFS+ image is mounted by udisks2/polkit or a desktop automounter. After mount, may_delete_dentry only requires MAY_WRITE|MAY_EXEC on the attacker-owned directory.\nUI:N - The attacker supplies the crafted volume and then issues unlink(2) or close on the hardlink themselves. Automount of that local/removable image is not a separate victim action once the vector is Local.\nS:U - The hfs_find_init() kmalloc overflow and any resulting kernel memory corruption stay inside the host kernel that is parsing the HFS+ catalog B-tree. No KVM/Xen guest-to-host, IOMMU, or sandbox boundary is crossed.\nC:H - hfs_bnode_read() copies attacker-chosen catalog bytes past the search-key object into adjacent heap. That out-of-bounds write is a memory-corruption primitive that can be leveraged for arbitrary kernel-memory disclosure.\nI:H - The same unbounded write from hfs_bnode_read() into the hfs_find_init() search-key allocation overwrites neighboring slab objects, which is sufficient for an arbitrary kernel write and control-flow hijacking.\nA:H - Writing past the ~1036-byte search-key object oopses or panics the kernel (slab-out-of-bounds or GP fault) while cat_tree-\u003etree_lock is held, crashing the machine or wedging further HFS+ operations."
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-10-19T09:05:28.487Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/33cda0036bc683fc888c20b04a5fc030e3e8413b"
        },
        {
          "url": "https://git.kernel.org/stable/c/b9729c51a8b67f8b20b8a8cf395da4be63a0c15b"
        },
        {
          "url": "https://git.kernel.org/stable/c/af48abc1b00d865c3f4c4d76b901c44115cb7162"
        },
        {
          "url": "https://git.kernel.org/stable/c/e20f3b749ad241df77ec1c3e13a9c22209aa1eb3"
        },
        {
          "url": "https://git.kernel.org/stable/c/7898beee166c1145c0bca364d687b8437435bf1a"
        },
        {
          "url": "https://git.kernel.org/stable/c/e31985c67ba00a59d9b1340af473c1dbe6c87856"
        },
        {
          "url": "https://git.kernel.org/stable/c/473ea7aa35615829f0de7a71e8691d69dc24e328"
        },
        {
          "url": "https://git.kernel.org/stable/c/e2ea5cac61acfc11dad22f1d2d4bc71d56c52a20"
        }
      ],
      "title": "hfsplus: validate thread record before delete key rebuild",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2026-93095",
    "datePublished": "2026-09-17T16:11:09.694Z",
    "dateReserved": "2026-09-17T16:02:15.084Z",
    "dateUpdated": "2026-10-19T09:05:28.487Z",
    "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…