{ "dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": { "cveId": "CVE-2026-93095", "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "state": "PUBLISHED", "assignerShortName": "Linux", "dateReserved": "2026-09-17T16:02:15.084Z", "datePublished": "2026-09-17T16:11:09.694Z", "dateUpdated": "2026-10-19T09:05:28.487Z" }, "containers": { "cna": { "providerMetadata": { "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67", "shortName": "Linux", "dateUpdated": "2026-10-19T09:05:28.487Z" }, "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->cat.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's 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": { "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" }, "scenarios": [ { "lang": "en", "value": "AV:L - The malformed value is on-disk catalog thread.nodeName.length. unlink(2) reaches it via do_unlinkat → vfs_unlink → 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->cat.name.unicode, which hfs_find_init() allocated as only cat_tree->max_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->tree_lock is held, crashing the machine or wedging further HFS+ operations." } ] } ], "affected": [ { "product": "Linux", "vendor": "Linux", "defaultStatus": "unaffected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "fs/hfsplus/catalog.c", "fs/hfsplus/hfsplus_fs.h" ], "versions": [ { "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2", "lessThan": "33cda0036bc683fc888c20b04a5fc030e3e8413b", "status": "affected", "versionType": "git" }, { "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2", "lessThan": "b9729c51a8b67f8b20b8a8cf395da4be63a0c15b", "status": "affected", "versionType": "git" }, { "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2", "lessThan": "af48abc1b00d865c3f4c4d76b901c44115cb7162", "status": "affected", "versionType": "git" }, { "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2", "lessThan": "e20f3b749ad241df77ec1c3e13a9c22209aa1eb3", "status": "affected", "versionType": "git" }, { "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2", "lessThan": "7898beee166c1145c0bca364d687b8437435bf1a", "status": "affected", "versionType": "git" }, { "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2", "lessThan": "e31985c67ba00a59d9b1340af473c1dbe6c87856", "status": "affected", "versionType": "git" }, { "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2", "lessThan": "473ea7aa35615829f0de7a71e8691d69dc24e328", "status": "affected", "versionType": "git" }, { "version": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2", "lessThan": "e2ea5cac61acfc11dad22f1d2d4bc71d56c52a20", "status": "affected", "versionType": "git" } ] }, { "product": "Linux", "vendor": "Linux", "defaultStatus": "affected", "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git", "programFiles": [ "fs/hfsplus/catalog.c", "fs/hfsplus/hfsplus_fs.h" ], "versions": [ { "version": "2.6.12", "status": "affected" }, { "version": "0", "lessThan": "2.6.12", "status": "unaffected", "versionType": "semver" }, { "version": "5.10.270", "lessThanOrEqual": "5.10.*", "status": "unaffected", "versionType": "semver" }, { "version": "5.15.221", "lessThanOrEqual": "5.15.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.1.188", "lessThanOrEqual": "6.1.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.6.157", "lessThanOrEqual": "6.6.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.12.110", "lessThanOrEqual": "6.12.*", "status": "unaffected", "versionType": "semver" }, { "version": "6.18.52", "lessThanOrEqual": "6.18.*", "status": "unaffected", "versionType": "semver" }, { "version": "7.2.6", "lessThanOrEqual": "7.2.*", "status": "unaffected", "versionType": "semver" }, { "version": "7.3", "lessThanOrEqual": "*", "status": "unaffected", "versionType": "original_commit_for_fix" } ] } ], "cpeApplicability": [ { "nodes": [ { "operator": "OR", "negate": false, "cpeMatch": [ { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "2.6.12", "versionEndExcluding": "5.10.270" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "2.6.12", "versionEndExcluding": "5.15.221" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "2.6.12", "versionEndExcluding": "6.1.188" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "2.6.12", "versionEndExcluding": "6.6.157" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "2.6.12", "versionEndExcluding": "6.12.110" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "2.6.12", "versionEndExcluding": "6.18.52" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "2.6.12", "versionEndExcluding": "7.2.6" }, { "vulnerable": true, "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*", "versionStartIncluding": "2.6.12", "versionEndExcluding": "7.3" } ] } ] } ], "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" } } } }