CVE-2026-90048 (GCVE-0-2026-90048)
Vulnerability from cvelistv5 – Published: 2026-09-16 10:33 – Updated: 2026-09-16 14:42
VLAI
EPSS
VEX
Title
fs/ntfs3: fix slab-out-of-bounds write in ni_create_attr_list()
Summary
In the Linux kernel, the following vulnerability has been resolved:
fs/ntfs3: fix slab-out-of-bounds write in ni_create_attr_list()
ni_create_attr_list() allocates a fixed buffer of al_aligned(record_size)
(== record_size) bytes and then walks every attribute of the primary MFT
record, writing one ATTR_LIST_ENTRY per attribute and advancing the cursor
by le_size(name_len), with no check against the end of the buffer; the
total size is only computed after the loop.
A minimum-size resident attribute occupies SIZEOF_RESIDENT (0x18 = 24)
bytes on disk, but an unnamed attribute expands to le_size(0) (0x20 = 32)
bytes in the list. Because the number of attributes in a record is not
bounded (mi_enum_attr() accepts arbitrarily many equal-type, nameless
minimum-size attributes), a crafted record packed with such attributes
produces a list larger than record_size and overflows the heap buffer.
This is reachable from a crafted, loop-mounted NTFS image: opening the file
and adding an attribute (e.g. via setxattr) drives ntfs_set_ea() ->
ni_insert_resident() -> ni_insert_attr() -> ni_ins_attr_ext() ->
ni_create_attr_list().
BUG: KASAN: slab-out-of-bounds in ni_create_attr_list+0xc48/0x1058
Write of size 4 at addr ffff000008984c00 by task setfattr/345
ni_create_attr_list+0xc48/0x1058
ni_ins_attr_ext+0x510/0x7c0
ni_insert_attr+0x3f8/0x70c
ni_insert_resident+0xc8/0x3b0
ntfs_set_ea+0x66c/0xd28
ntfs_setxattr+0x4d8/0x5b0
__arm64_sys_setxattr+0xa4/0x124
Allocated by task 345:
ni_create_attr_list+0x188/0x1058
The buggy address belongs to the cache kmalloc-1k of size 1024
(the write lands at object+1024).
Size the buffer from the actual attributes instead of assuming a single
record_size is always enough.
Severity
9.8 (Critical)
Assigner
References
Impacted products
2 products
| Vendor | Product | Version | CPE status | |
|---|---|---|---|---|
| Linux | Linux |
Affected:
4342306f0f0d5ff4315a204d315c1b51b914fca5 , < 7e9aee7e4d9767cc3e423b3beecb01c7ebb6bbcd
(git)
Affected: 4342306f0f0d5ff4315a204d315c1b51b914fca5 , < fa2215cf451414b0512cd6f7d37a057893811f4d (git) Affected: 4342306f0f0d5ff4315a204d315c1b51b914fca5 , < d07e281f2a7710502985d6f80b95ddac8f4e81d5 (git) Affected: 4342306f0f0d5ff4315a204d315c1b51b914fca5 , < a84f3db72561c4d9281c5ff721ce46b9ffa7f30e (git) Affected: 4342306f0f0d5ff4315a204d315c1b51b914fca5 , < 7c4841e2a62794a3bab7c1ff0540580f387e377f (git) |
guessed | |
| Linux | Linux |
Affected:
5.15
Unaffected: 0 , < 5.15 (semver) Unaffected: 6.6.157 , ≤ 6.6.* (semver) Unaffected: 6.12.110 , ≤ 6.12.* (semver) Unaffected: 6.18.51 , ≤ 6.18.* (semver) Unaffected: 7.2.5 , ≤ 7.2.* (semver) Unaffected: 7.3-rc1 , ≤ * (original_commit_for_fix) |
guessed |
{
"containers": {
"cna": {
"affected": [
{
"defaultStatus": "unaffected",
"product": "Linux",
"programFiles": [
"fs/ntfs3/frecord.c"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"versions": [
{
"lessThan": "7e9aee7e4d9767cc3e423b3beecb01c7ebb6bbcd",
"status": "affected",
"version": "4342306f0f0d5ff4315a204d315c1b51b914fca5",
"versionType": "git"
},
{
"lessThan": "fa2215cf451414b0512cd6f7d37a057893811f4d",
"status": "affected",
"version": "4342306f0f0d5ff4315a204d315c1b51b914fca5",
"versionType": "git"
},
{
"lessThan": "d07e281f2a7710502985d6f80b95ddac8f4e81d5",
"status": "affected",
"version": "4342306f0f0d5ff4315a204d315c1b51b914fca5",
"versionType": "git"
},
{
"lessThan": "a84f3db72561c4d9281c5ff721ce46b9ffa7f30e",
"status": "affected",
"version": "4342306f0f0d5ff4315a204d315c1b51b914fca5",
"versionType": "git"
},
{
"lessThan": "7c4841e2a62794a3bab7c1ff0540580f387e377f",
"status": "affected",
"version": "4342306f0f0d5ff4315a204d315c1b51b914fca5",
"versionType": "git"
}
]
},
{
"defaultStatus": "affected",
"product": "Linux",
"programFiles": [
"fs/ntfs3/frecord.c"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"versions": [
{
"status": "affected",
"version": "5.15"
},
{
"lessThan": "5.15",
"status": "unaffected",
"version": "0",
"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.51",
"versionType": "semver"
},
{
"lessThanOrEqual": "7.2.*",
"status": "unaffected",
"version": "7.2.5",
"versionType": "semver"
},
{
"lessThanOrEqual": "*",
"status": "unaffected",
"version": "7.3-rc1",
"versionType": "original_commit_for_fix"
}
]
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.6.157",
"versionStartIncluding": "5.15",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.12.110",
"versionStartIncluding": "5.15",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.18.51",
"versionStartIncluding": "5.15",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "7.2.5",
"versionStartIncluding": "5.15",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "7.3-rc1",
"versionStartIncluding": "5.15",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
]
}
],
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\nfs/ntfs3: fix slab-out-of-bounds write in ni_create_attr_list()\n\nni_create_attr_list() allocates a fixed buffer of al_aligned(record_size)\n(== record_size) bytes and then walks every attribute of the primary MFT\nrecord, writing one ATTR_LIST_ENTRY per attribute and advancing the cursor\nby le_size(name_len), with no check against the end of the buffer; the\ntotal size is only computed after the loop.\n\nA minimum-size resident attribute occupies SIZEOF_RESIDENT (0x18 = 24)\nbytes on disk, but an unnamed attribute expands to le_size(0) (0x20 = 32)\nbytes in the list. Because the number of attributes in a record is not\nbounded (mi_enum_attr() accepts arbitrarily many equal-type, nameless\nminimum-size attributes), a crafted record packed with such attributes\nproduces a list larger than record_size and overflows the heap buffer.\n\nThis is reachable from a crafted, loop-mounted NTFS image: opening the file\nand adding an attribute (e.g. via setxattr) drives ntfs_set_ea() -\u003e\nni_insert_resident() -\u003e ni_insert_attr() -\u003e ni_ins_attr_ext() -\u003e\nni_create_attr_list().\n\n BUG: KASAN: slab-out-of-bounds in ni_create_attr_list+0xc48/0x1058\n Write of size 4 at addr ffff000008984c00 by task setfattr/345\n ni_create_attr_list+0xc48/0x1058\n ni_ins_attr_ext+0x510/0x7c0\n ni_insert_attr+0x3f8/0x70c\n ni_insert_resident+0xc8/0x3b0\n ntfs_set_ea+0x66c/0xd28\n ntfs_setxattr+0x4d8/0x5b0\n __arm64_sys_setxattr+0xa4/0x124\n Allocated by task 345:\n ni_create_attr_list+0x188/0x1058\n The buggy address belongs to the cache kmalloc-1k of size 1024\n (the write lands at object+1024).\n\nSize the buffer from the actual attributes instead of assuming a single\nrecord_size is always enough."
}
],
"metrics": [
{
"cvssV3_1": {
"baseScore": 9.8,
"baseSeverity": "CRITICAL",
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
"version": "3.1"
},
"scenarios": [
{
"lang": "en",
"value": "AV:N - ntfs3 registers export_operations, so ksmbd/nfsd VFS write and setxattr on an exported NTFS volume reach ni_create_attr_list() via ntfs_set_size/attr_set_size_ex and ntfs_setxattr\u2192ni_insert_resident\u2192ni_ins_attr_ext; NAS/router SMB sharing of USB NTFS is a reasonable high-impact path.\nAC:L - The attacker fully controls a primary MFT record packed with unnamed SIZEOF_RESIDENT attributes, so the ATTR_LIST_ENTRY walk overflows the fixed kzalloc(record_size) buffer on the first attribute insert or allocation extend; no race or attacker-uncontrollable layout is required.\nPR:N - Triggering needs only write or setxattr permission on the crafted file, including guest/anonymous SMB or a permissive NFS export; no local account, init-namespace root, or CAP_SYS_ADMIN is required on the trigger path.\nUI:N - Once the crafted NTFS volume is mounted and exported, or automounted from removable/shared storage, the attacker triggers the overflow with an ordinary write, truncate, or setxattr; no extra victim clicks, prompts, or confirmation are required.\nS:U - The slab out-of-bounds write corrupts kernel heap in the same host OS security authority as ntfs3; it can enable privilege escalation but does not cross a VM, IOMMU, or sandbox boundary.\nC:H - The overflow writes attacker-controlled ATTR_LIST_ENTRY fields (type, name, id) past the kmalloc-1k object into adjacent slab, a heap-corruption primitive that can be leveraged for kernel memory disclosure.\nI:H - The unbounded ATTR_LIST_ENTRY walk is a slab out-of-bounds write of attacker-influenced attribute metadata into adjacent heap objects, enabling arbitrary kernel writes and potential control-flow hijack.\nA:H - KASAN reports a slab-out-of-bounds write in ni_create_attr_list(); overflowing the kmalloc object corrupts adjacent heap and causes a kernel oops, panic, or hang."
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-09-16T14:42:04.456Z",
"orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"shortName": "Linux"
},
"references": [
{
"url": "https://git.kernel.org/stable/c/7e9aee7e4d9767cc3e423b3beecb01c7ebb6bbcd"
},
{
"url": "https://git.kernel.org/stable/c/fa2215cf451414b0512cd6f7d37a057893811f4d"
},
{
"url": "https://git.kernel.org/stable/c/d07e281f2a7710502985d6f80b95ddac8f4e81d5"
},
{
"url": "https://git.kernel.org/stable/c/a84f3db72561c4d9281c5ff721ce46b9ffa7f30e"
},
{
"url": "https://git.kernel.org/stable/c/7c4841e2a62794a3bab7c1ff0540580f387e377f"
}
],
"title": "fs/ntfs3: fix slab-out-of-bounds write in ni_create_attr_list()",
"x_generator": {
"engine": "bippy-1.2.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"assignerShortName": "Linux",
"cveId": "CVE-2026-90048",
"datePublished": "2026-09-16T10:33:44.538Z",
"dateReserved": "2026-09-11T19:38:34.783Z",
"dateUpdated": "2026-09-16T14:42:04.456Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"vulnerability-lookup:meta": {
"nvd": "{\"cve\":{\"id\":\"CVE-2026-90048\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2026-09-16T11:17:18.140\",\"lastModified\":\"2026-09-16T15:18:27.570\",\"vulnStatus\":\"Received\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"In the Linux kernel, the following vulnerability has been resolved:\\n\\nfs/ntfs3: fix slab-out-of-bounds write in ni_create_attr_list()\\n\\nni_create_attr_list() allocates a fixed buffer of al_aligned(record_size)\\n(== record_size) bytes and then walks every attribute of the primary MFT\\nrecord, writing one ATTR_LIST_ENTRY per attribute and advancing the cursor\\nby le_size(name_len), with no check against the end of the buffer; the\\ntotal size is only computed after the loop.\\n\\nA minimum-size resident attribute occupies SIZEOF_RESIDENT (0x18 = 24)\\nbytes on disk, but an unnamed attribute expands to le_size(0) (0x20 = 32)\\nbytes in the list. Because the number of attributes in a record is not\\nbounded (mi_enum_attr() accepts arbitrarily many equal-type, nameless\\nminimum-size attributes), a crafted record packed with such attributes\\nproduces a list larger than record_size and overflows the heap buffer.\\n\\nThis is reachable from a crafted, loop-mounted NTFS image: opening the file\\nand adding an attribute (e.g. via setxattr) drives ntfs_set_ea() -\u003e\\nni_insert_resident() -\u003e ni_insert_attr() -\u003e ni_ins_attr_ext() -\u003e\\nni_create_attr_list().\\n\\n BUG: KASAN: slab-out-of-bounds in ni_create_attr_list+0xc48/0x1058\\n Write of size 4 at addr ffff000008984c00 by task setfattr/345\\n ni_create_attr_list+0xc48/0x1058\\n ni_ins_attr_ext+0x510/0x7c0\\n ni_insert_attr+0x3f8/0x70c\\n ni_insert_resident+0xc8/0x3b0\\n ntfs_set_ea+0x66c/0xd28\\n ntfs_setxattr+0x4d8/0x5b0\\n __arm64_sys_setxattr+0xa4/0x124\\n Allocated by task 345:\\n ni_create_attr_list+0x188/0x1058\\n The buggy address belongs to the cache kmalloc-1k of size 1024\\n (the write lands at object+1024).\\n\\nSize the buffer from the actual attributes instead of assuming a single\\nrecord_size is always enough.\"}],\"affected\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"affectedData\":[{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"unaffected\",\"programFiles\":[\"fs/ntfs3/frecord.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"4342306f0f0d5ff4315a204d315c1b51b914fca5\",\"lessThan\":\"7e9aee7e4d9767cc3e423b3beecb01c7ebb6bbcd\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"4342306f0f0d5ff4315a204d315c1b51b914fca5\",\"lessThan\":\"fa2215cf451414b0512cd6f7d37a057893811f4d\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"4342306f0f0d5ff4315a204d315c1b51b914fca5\",\"lessThan\":\"d07e281f2a7710502985d6f80b95ddac8f4e81d5\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"4342306f0f0d5ff4315a204d315c1b51b914fca5\",\"lessThan\":\"a84f3db72561c4d9281c5ff721ce46b9ffa7f30e\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"4342306f0f0d5ff4315a204d315c1b51b914fca5\",\"lessThan\":\"7c4841e2a62794a3bab7c1ff0540580f387e377f\",\"versionType\":\"git\",\"status\":\"affected\"}]},{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"affected\",\"programFiles\":[\"fs/ntfs3/frecord.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"5.15\",\"status\":\"affected\"},{\"version\":\"0\",\"lessThan\":\"5.15\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.6.157\",\"lessThanOrEqual\":\"6.6.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.12.110\",\"lessThanOrEqual\":\"6.12.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.18.51\",\"lessThanOrEqual\":\"6.18.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"7.2.5\",\"lessThanOrEqual\":\"7.2.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"7.3-rc1\",\"lessThanOrEqual\":\"*\",\"versionType\":\"original_commit_for_fix\",\"status\":\"unaffected\"}]}]}],\"metrics\":{\"cvssMetricV31\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"type\":\"Secondary\",\"cvssData\":{\"version\":\"3.1\",\"vectorString\":\"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H\",\"baseScore\":9.8,\"baseSeverity\":\"CRITICAL\",\"attackVector\":\"NETWORK\",\"attackComplexity\":\"LOW\",\"privilegesRequired\":\"NONE\",\"userInteraction\":\"NONE\",\"scope\":\"UNCHANGED\",\"confidentialityImpact\":\"HIGH\",\"integrityImpact\":\"HIGH\",\"availabilityImpact\":\"HIGH\"},\"exploitabilityScore\":3.9,\"impactScore\":5.9}]},\"references\":[{\"url\":\"https://git.kernel.org/stable/c/7c4841e2a62794a3bab7c1ff0540580f387e377f\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/7e9aee7e4d9767cc3e423b3beecb01c7ebb6bbcd\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/a84f3db72561c4d9281c5ff721ce46b9ffa7f30e\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/d07e281f2a7710502985d6f80b95ddac8f4e81d5\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"},{\"url\":\"https://git.kernel.org/stable/c/fa2215cf451414b0512cd6f7d37a057893811f4d\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\"}]}}"
}
}
Loading…
Loading…
Experimental. This forecast is provided for visualization only and may change without notice. Do not use it for operational decisions.
Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Loading…
The MITRE ATT&CK techniques below are AI-generated suggestions, inferred from the description of the
vulnerability by the CIRCL/vulnerability-attack-technique-classification-roberta-base
model, served locally by ML-Gateway.
They have not been verified by an analyst and are provided for guidance only.
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
Loading…
Related by attack behaviour
Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.
Loading…