Files
vuln-cve/data/2026/98xxx/CVE-2026-98443.json
T

222 lines
12 KiB
JSON

{
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"cveMetadata": {
"cveId": "CVE-2026-98443",
"assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"state": "PUBLISHED",
"assignerShortName": "Linux",
"dateReserved": "2026-09-25T10:25:14.349Z",
"datePublished": "2026-10-18T15:14:53.597Z",
"dateUpdated": "2026-10-30T12:38:08.950Z"
},
"containers": {
"cna": {
"providerMetadata": {
"orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"shortName": "Linux",
"dateUpdated": "2026-10-30T12:38:08.950Z"
},
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\nxfs: fix cursor and pointer handling when recovering iunlink buckets\n\nLOLLM pointed out a bug in xlog_recover_iunlink_bucket:\n\n1. We don't null out prev_ip after releasing it, which can lead to UAF\n problems if the inodegc flush call in the loop fails.\n\nat which point I noticed even more bugs:\n\n2. If the inodegc flush inside the loop fails, we also leak @ip.\n\n3. We set prev_agino to agino having already advanced agino, which\n results in inodes with i_prev_unlinked set to itself.\n\n4. If we exit the bottom of the loop with prev_ip set, then prev_ip\n aliases ip and we also set its i_prev_unlinked to itself.\n\nBugs 3 and 4 introduce loops into the unlinked list, though these loops\ndon't surface because we immediately flush each unlinked inode after\nloading it.\n\nFix all of these issues."
}
],
"metrics": [
{
"cvssV3_1": {
"version": "3.1",
"vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H",
"baseScore": 7.8,
"baseSeverity": "HIGH"
},
"scenarios": [
{
"lang": "en",
"value": "AV:L - Malformed agi_unlinked, di_next_unlinked, and inode-fork data enter from a local XFS image when mount(2) reaches xlog_recover_iunlink_bucket through xfs_log_mount_finish and xlog_recover_finish; no remote protocol carries these bytes.\nAC:L - The image author can create a dirty log, two inodes in one unlinked bucket, and corrupt external btree metadata that makes xfs_inactive fail through xfs_inodegc_flush. This deterministically enters the stale-prev_ip error path without requiring an uncontrollable hardware fault.\nPR:N - The attacker only creates and supplies the XFS image, requiring no target account or capability. XFS omits FS_USERNS_MOUNT, so the privileged mount_capable check applies to the interacting victim and is captured by UI:R.\nUI:R - A victim or administrator must mount the attacker-supplied dirty XFS image so xfs_log_mount_finish invokes xlog_recover_finish and the patched xlog_recover_iunlink_bucket.\nS:U - The stale xfs_inode and resulting memory corruption affect the mounting host kernel within its existing security authority; no VM, IOMMU, or other isolation boundary is crossed.\nC:H - After xfs_inodegc_flush makes prev_ip reclaimable, the stale pointer can reference an xfs_inode_cache object reclaimed and replaced before the second xfs_irele; reuse and secondary UAF of the replacement inode support kernel-memory disclosure.\nI:H - The second xfs_irele can decrement i_count in a reused xfs_inode, prematurely destroying a live replacement inode and producing secondary use-after-free memory corruption exploitable for control-flow hijacking.\nA:H - The stale xfs_irele can dereference a freed inode or underflow its reference count; DEBUG_VFS BUGs on the invalid inode state/count, while non-debug builds can corrupt a replacement inode and later 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/xfs/xfs_log_recover.c"
],
"versions": [
{
"version": "04755d2e5821b3afbaadd09fe5df58d04de36484",
"lessThan": "8cfde7b2fb7288f4f6b90293e8702ff897c682fe",
"status": "affected",
"versionType": "git"
},
{
"version": "04755d2e5821b3afbaadd09fe5df58d04de36484",
"lessThan": "47a948ba653a463d429e02fda2f06a3d6b78666d",
"status": "affected",
"versionType": "git"
},
{
"version": "04755d2e5821b3afbaadd09fe5df58d04de36484",
"lessThan": "8c9d5b8a96d6b93eb24e07b4163c89341ba29bd1",
"status": "affected",
"versionType": "git"
},
{
"version": "04755d2e5821b3afbaadd09fe5df58d04de36484",
"lessThan": "66a2179d02668f8df44b1a249899006f3ba38ea0",
"status": "affected",
"versionType": "git"
},
{
"version": "04755d2e5821b3afbaadd09fe5df58d04de36484",
"lessThan": "961c717e6bf0e53c2c2b1fe4aef1add9390fedab",
"status": "affected",
"versionType": "git"
},
{
"version": "04755d2e5821b3afbaadd09fe5df58d04de36484",
"lessThan": "65f39d09d73718611cee40399179323b5d4ead00",
"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/xfs/xfs_log_recover.c"
],
"versions": [
{
"version": "6.0",
"status": "affected"
},
{
"version": "0",
"lessThan": "6.0",
"status": "unaffected",
"versionType": "semver"
},
{
"version": "6.1.191",
"lessThanOrEqual": "6.1.*",
"status": "unaffected",
"versionType": "semver"
},
{
"version": "6.6.160",
"lessThanOrEqual": "6.6.*",
"status": "unaffected",
"versionType": "semver"
},
{
"version": "6.12.113",
"lessThanOrEqual": "6.12.*",
"status": "unaffected",
"versionType": "semver"
},
{
"version": "6.18.55",
"lessThanOrEqual": "6.18.*",
"status": "unaffected",
"versionType": "semver"
},
{
"version": "7.2.9",
"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": "6.0",
"versionEndExcluding": "6.1.191"
},
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "6.0",
"versionEndExcluding": "6.6.160"
},
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "6.0",
"versionEndExcluding": "6.12.113"
},
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "6.0",
"versionEndExcluding": "6.18.55"
},
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "6.0",
"versionEndExcluding": "7.2.9"
},
{
"vulnerable": true,
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionStartIncluding": "6.0",
"versionEndExcluding": "7.3"
}
]
}
]
}
],
"references": [
{
"url": "https://git.kernel.org/stable/c/8cfde7b2fb7288f4f6b90293e8702ff897c682fe"
},
{
"url": "https://git.kernel.org/stable/c/47a948ba653a463d429e02fda2f06a3d6b78666d"
},
{
"url": "https://git.kernel.org/stable/c/8c9d5b8a96d6b93eb24e07b4163c89341ba29bd1"
},
{
"url": "https://git.kernel.org/stable/c/66a2179d02668f8df44b1a249899006f3ba38ea0"
},
{
"url": "https://git.kernel.org/stable/c/961c717e6bf0e53c2c2b1fe4aef1add9390fedab"
},
{
"url": "https://git.kernel.org/stable/c/65f39d09d73718611cee40399179323b5d4ead00"
}
],
"title": "xfs: fix cursor and pointer handling when recovering iunlink buckets",
"x_generator": {
"engine": "bippy-1.2.0"
}
}
}
}