{"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-09-18T17:55:54.948Z"},"containers":{"cna":{"providerMetadata":{"orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux","dateUpdated":"2026-09-18T17:55:54.948Z"},"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-rc1","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-rc1"}]}]}],"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"}}}}