Files
vuln-cve/data/2026/93xxx/CVE-2026-93095.json
T

266 lines
15 KiB
JSON

{
"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"
}
}
}
}