266 lines
16 KiB
JSON
266 lines
16 KiB
JSON
{
|
|
"dataType": "CVE_RECORD",
|
|
"dataVersion": "5.2",
|
|
"cveMetadata": {
|
|
"cveId": "CVE-2026-99180",
|
|
"assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
|
|
"state": "PUBLISHED",
|
|
"assignerShortName": "Linux",
|
|
"dateReserved": "2026-09-25T10:25:14.399Z",
|
|
"datePublished": "2026-10-28T10:35:33.578Z",
|
|
"dateUpdated": "2026-10-31T12:44:50.381Z"
|
|
},
|
|
"containers": {
|
|
"cna": {
|
|
"providerMetadata": {
|
|
"orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
|
|
"shortName": "Linux",
|
|
"dateUpdated": "2026-10-31T12:44:50.381Z"
|
|
},
|
|
"descriptions": [
|
|
{
|
|
"lang": "en",
|
|
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\nunicode: free the map after a grace period\n\ngeneric_ci_d_hash() and generic_ci_d_compare() read sb->s_encoding and\ndereference the unicode map while a pathwalk in rcu mode holds nothing\nbut rcu_read_lock(). The filesystems that use them, ext4, f2fs and\ntmpfs, drop the map with utf8_unload() from ->put_super(), which runs\nwhen the last reference to the mount goes away. A lookup that is still\ninside such a filesystem at that point reads a freed map.\n\nWith a pathwalk held up in utf8_casefold_hash() while the last reference\nto a casefolded tmpfs goes away:\n\n BUG: KASAN: slab-use-after-free in utf8nlookup+0x74c/0x950\n Read of size 8 at addr ff110001030fe658 by task walker/98\n Call Trace:\n <TASK>\n utf8nlookup+0x74c/0x950\n utf8byte+0x160/0x1560\n utf8_casefold_hash+0x167/0x230\n generic_ci_d_hash+0xdd/0x1c0\n link_path_walk+0x11ad/0x1d30\n path_lookupat+0x63/0xb00\n filename_lookup+0x1f1/0x5b0\n vfs_statx+0xd7/0x3b0\n [...]\n Allocated by task 94:\n __kmalloc_cache_noprof+0x249/0x560\n utf8_load+0x4e/0x570\n shmem_parse_opt_casefold.isra.0+0x92/0x270\n [...]\n Freed by task 97:\n kfree+0x1db/0x5b0\n shmem_put_super+0x72/0x170\n generic_shutdown_super+0x14c/0x530\n kill_anon_super+0x3a/0x60\n deactivate_locked_super+0x9c/0xf0\n cleanup_mnt+0x9f/0x130\n\nSo far that has been hard to hit. umount(2) waits for a grace period\nin namespace_unlock() before it drops the mount, so only a mount whose\nlast reference goes away elsewhere, like the close of a file or a chdir\nout of a lazily unmounted directory, can race a walker. So it is\nreachable.\n\nDelay the free until a grace period has passed. The map and the data\ntable it holds a reference to then outlive any pathwalk that found the\nsuperblock before the mount went away. The reference on the data table\nmodule is dropped from the rcu callback as well. utf8-core is built in\nwhenever CONFIG_UNICODE is set, so there is no module exit that would\nhave to wait for the callbacks.\n\nOverlayfs points the s_encoding of an overlay at the map of its first\nlayer without taking a reference of its own. That stays correct. The\nlayer is held by the overlay, so its map is dropped only after the\noverlay is gone."
|
|
}
|
|
],
|
|
"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 - Local statx() pathwalks reach generic_ci_d_hash() and utf8_casefold_hash(), while chdir() and final mount teardown reach shmem_put_super() and the patched utf8_unload(); no network protocol carries the trigger.\nAC:L - After umount2(MNT_DETACH), one attacker can loop Unicode statx() lookups from a retained cwd while a sibling chdir() drops the final mount reference; the attacker controls both sides and can repeatedly retry the race.\nPR:L - shmem_fs_type includes FS_USERNS_MOUNT, so an unprivileged user can mount casefolded tmpfs in their own user/mount namespace and, as inode owner, pass vfs_fileattr_set() to set FS_CASEFOLD_FL.\nUI:N - The same attacker performs the casefolded tmpfs mount, FS_IOC_SETFLAGS, lazy unmount, statx(), and chdir() operations; no victim action is required.\nS:U - The utf8nlookup() use-after-free occurs within the host kernel reached by the local process, and any resulting kernel compromise remains under that same security authority.\nC:H - utf8nlookup() dereferences reclaimed unicode_map tables and ntab[] pointers, including tables->utf8data and utf8agetab; reclaiming the generic-kmalloc object can turn these stale pointer dereferences into attacker-directed kernel reads.\nI:H - utf8_unload() frees a still-referenced generic-kmalloc unicode_map; attacker-controlled heap reclamation can replace its tables and ntab[] pointers used by utf8nlookup(), making this heap use-after-free exploitable for memory corruption and control-flow hijacking.\nA:H - The demonstrated stale unicode_map dereference in utf8nlookup() produces a KASAN slab-use-after-free, and corrupted tables or ntab[] pointers can cause a kernel oops or panic."
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"affected": [
|
|
{
|
|
"product": "Linux",
|
|
"vendor": "Linux",
|
|
"defaultStatus": "unaffected",
|
|
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
|
|
"programFiles": [
|
|
"fs/unicode/utf8-core.c",
|
|
"include/linux/unicode.h"
|
|
],
|
|
"versions": [
|
|
{
|
|
"version": "b886ee3e778ec2ad43e276fd378ab492cf6819b7",
|
|
"lessThan": "092e14e1479a39157ca01668d43e4649793f39ed",
|
|
"status": "affected",
|
|
"versionType": "git"
|
|
},
|
|
{
|
|
"version": "b886ee3e778ec2ad43e276fd378ab492cf6819b7",
|
|
"lessThan": "6472455f2b015cad43adb790cb63fe1d3cff2f57",
|
|
"status": "affected",
|
|
"versionType": "git"
|
|
},
|
|
{
|
|
"version": "b886ee3e778ec2ad43e276fd378ab492cf6819b7",
|
|
"lessThan": "f96c2731a105d6663c606388f5dc21781e00ade5",
|
|
"status": "affected",
|
|
"versionType": "git"
|
|
},
|
|
{
|
|
"version": "b886ee3e778ec2ad43e276fd378ab492cf6819b7",
|
|
"lessThan": "5d7687b0b71601cc32f1bfd62f56cf5eea3e5a07",
|
|
"status": "affected",
|
|
"versionType": "git"
|
|
},
|
|
{
|
|
"version": "b886ee3e778ec2ad43e276fd378ab492cf6819b7",
|
|
"lessThan": "69a0d6b31d05e856c7335509222f25321e3c69ca",
|
|
"status": "affected",
|
|
"versionType": "git"
|
|
},
|
|
{
|
|
"version": "b886ee3e778ec2ad43e276fd378ab492cf6819b7",
|
|
"lessThan": "2b54d3c971a1e5df3c9b0bcc10311ae6c29e79d8",
|
|
"status": "affected",
|
|
"versionType": "git"
|
|
},
|
|
{
|
|
"version": "b886ee3e778ec2ad43e276fd378ab492cf6819b7",
|
|
"lessThan": "6560c3d9a6925e3747d9ad8463e16010c31ba715",
|
|
"status": "affected",
|
|
"versionType": "git"
|
|
},
|
|
{
|
|
"version": "b886ee3e778ec2ad43e276fd378ab492cf6819b7",
|
|
"lessThan": "a96c5299bd7305eb984377681eb3222a57376405",
|
|
"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/unicode/utf8-core.c",
|
|
"include/linux/unicode.h"
|
|
],
|
|
"versions": [
|
|
{
|
|
"version": "5.2",
|
|
"status": "affected"
|
|
},
|
|
{
|
|
"version": "0",
|
|
"lessThan": "5.2",
|
|
"status": "unaffected",
|
|
"versionType": "semver"
|
|
},
|
|
{
|
|
"version": "5.10.273",
|
|
"lessThanOrEqual": "5.10.*",
|
|
"status": "unaffected",
|
|
"versionType": "semver"
|
|
},
|
|
{
|
|
"version": "5.15.224",
|
|
"lessThanOrEqual": "5.15.*",
|
|
"status": "unaffected",
|
|
"versionType": "semver"
|
|
},
|
|
{
|
|
"version": "6.1.191",
|
|
"lessThanOrEqual": "6.1.*",
|
|
"status": "unaffected",
|
|
"versionType": "semver"
|
|
},
|
|
{
|
|
"version": "6.6.161",
|
|
"lessThanOrEqual": "6.6.*",
|
|
"status": "unaffected",
|
|
"versionType": "semver"
|
|
},
|
|
{
|
|
"version": "6.12.115",
|
|
"lessThanOrEqual": "6.12.*",
|
|
"status": "unaffected",
|
|
"versionType": "semver"
|
|
},
|
|
{
|
|
"version": "6.18.59",
|
|
"lessThanOrEqual": "6.18.*",
|
|
"status": "unaffected",
|
|
"versionType": "semver"
|
|
},
|
|
{
|
|
"version": "7.2.13",
|
|
"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": "5.2",
|
|
"versionEndExcluding": "5.10.273"
|
|
},
|
|
{
|
|
"vulnerable": true,
|
|
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
|
|
"versionStartIncluding": "5.2",
|
|
"versionEndExcluding": "5.15.224"
|
|
},
|
|
{
|
|
"vulnerable": true,
|
|
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
|
|
"versionStartIncluding": "5.2",
|
|
"versionEndExcluding": "6.1.191"
|
|
},
|
|
{
|
|
"vulnerable": true,
|
|
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
|
|
"versionStartIncluding": "5.2",
|
|
"versionEndExcluding": "6.6.161"
|
|
},
|
|
{
|
|
"vulnerable": true,
|
|
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
|
|
"versionStartIncluding": "5.2",
|
|
"versionEndExcluding": "6.12.115"
|
|
},
|
|
{
|
|
"vulnerable": true,
|
|
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
|
|
"versionStartIncluding": "5.2",
|
|
"versionEndExcluding": "6.18.59"
|
|
},
|
|
{
|
|
"vulnerable": true,
|
|
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
|
|
"versionStartIncluding": "5.2",
|
|
"versionEndExcluding": "7.2.13"
|
|
},
|
|
{
|
|
"vulnerable": true,
|
|
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
|
|
"versionStartIncluding": "5.2",
|
|
"versionEndExcluding": "7.3"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"references": [
|
|
{
|
|
"url": "https://git.kernel.org/stable/c/092e14e1479a39157ca01668d43e4649793f39ed"
|
|
},
|
|
{
|
|
"url": "https://git.kernel.org/stable/c/6472455f2b015cad43adb790cb63fe1d3cff2f57"
|
|
},
|
|
{
|
|
"url": "https://git.kernel.org/stable/c/f96c2731a105d6663c606388f5dc21781e00ade5"
|
|
},
|
|
{
|
|
"url": "https://git.kernel.org/stable/c/5d7687b0b71601cc32f1bfd62f56cf5eea3e5a07"
|
|
},
|
|
{
|
|
"url": "https://git.kernel.org/stable/c/69a0d6b31d05e856c7335509222f25321e3c69ca"
|
|
},
|
|
{
|
|
"url": "https://git.kernel.org/stable/c/2b54d3c971a1e5df3c9b0bcc10311ae6c29e79d8"
|
|
},
|
|
{
|
|
"url": "https://git.kernel.org/stable/c/6560c3d9a6925e3747d9ad8463e16010c31ba715"
|
|
},
|
|
{
|
|
"url": "https://git.kernel.org/stable/c/a96c5299bd7305eb984377681eb3222a57376405"
|
|
}
|
|
],
|
|
"title": "unicode: free the map after a grace period",
|
|
"x_generator": {
|
|
"engine": "bippy-1.2.0"
|
|
}
|
|
}
|
|
}
|
|
} |