199 lines
14 KiB
JSON
199 lines
14 KiB
JSON
{
|
|
"dataType": "CVE_RECORD",
|
|
"dataVersion": "5.2",
|
|
"cveMetadata": {
|
|
"cveId": "CVE-2025-39868",
|
|
"assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
|
|
"state": "PUBLISHED",
|
|
"assignerShortName": "Linux",
|
|
"dateReserved": "2025-04-16T07:20:57.143Z",
|
|
"datePublished": "2025-09-23T06:00:43.308Z",
|
|
"dateUpdated": "2026-08-05T12:05:46.658Z"
|
|
},
|
|
"containers": {
|
|
"cna": {
|
|
"providerMetadata": {
|
|
"orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
|
|
"shortName": "Linux",
|
|
"dateUpdated": "2026-08-05T12:05:46.658Z"
|
|
},
|
|
"descriptions": [
|
|
{
|
|
"lang": "en",
|
|
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\nerofs: fix runtime warning on truncate_folio_batch_exceptionals()\n\nCommit 0e2f80afcfa6(\"fs/dax: ensure all pages are idle prior to\nfilesystem unmount\") introduced the WARN_ON_ONCE to capture whether\nthe filesystem has removed all DAX entries or not and applied the\nfix to xfs and ext4.\n\nApply the missed fix on erofs to fix the runtime warning:\n\n[ 5.266254] ------------[ cut here ]------------\n[ 5.266274] WARNING: CPU: 6 PID: 3109 at mm/truncate.c:89 truncate_folio_batch_exceptionals+0xff/0x260\n[ 5.266294] Modules linked in:\n[ 5.266999] CPU: 6 UID: 0 PID: 3109 Comm: umount Tainted: G S 6.16.0+ #6 PREEMPT(voluntary)\n[ 5.267012] Tainted: [S]=CPU_OUT_OF_SPEC\n[ 5.267017] Hardware name: Dell Inc. OptiPlex 5000/05WXFV, BIOS 1.5.1 08/24/2022\n[ 5.267024] RIP: 0010:truncate_folio_batch_exceptionals+0xff/0x260\n[ 5.267076] Code: 00 00 41 39 df 7f 11 eb 78 83 c3 01 49 83 c4 08 41 39 df 74 6c 48 63 f3 48 83 fe 1f 0f 83 3c 01 00 00 43 f6 44 26 08 01 74 df <0f> 0b 4a 8b 34 22 4c 89 ef 48 89 55 90 e8 ff 54 1f 00 48 8b 55 90\n[ 5.267083] RSP: 0018:ffffc900013f36c8 EFLAGS: 00010202\n[ 5.267095] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000\n[ 5.267101] RDX: ffffc900013f3790 RSI: 0000000000000000 RDI: ffff8882a1407898\n[ 5.267108] RBP: ffffc900013f3740 R08: 0000000000000000 R09: 0000000000000000\n[ 5.267113] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000\n[ 5.267119] R13: ffff8882a1407ab8 R14: ffffc900013f3888 R15: 0000000000000001\n[ 5.267125] FS: 00007aaa8b437800(0000) GS:ffff88850025b000(0000) knlGS:0000000000000000\n[ 5.267132] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033\n[ 5.267138] CR2: 00007aaa8b3aac10 CR3: 000000024f764000 CR4: 0000000000f52ef0\n[ 5.267144] PKRU: 55555554\n[ 5.267150] Call Trace:\n[ 5.267154] <TASK>\n[ 5.267181] truncate_inode_pages_range+0x118/0x5e0\n[ 5.267193] ? save_trace+0x54/0x390\n[ 5.267296] truncate_inode_pages_final+0x43/0x60\n[ 5.267309] evict+0x2a4/0x2c0\n[ 5.267339] dispose_list+0x39/0x80\n[ 5.267352] evict_inodes+0x150/0x1b0\n[ 5.267376] generic_shutdown_super+0x41/0x180\n[ 5.267390] kill_block_super+0x1b/0x50\n[ 5.267402] erofs_kill_sb+0x81/0x90 [erofs]\n[ 5.267436] deactivate_locked_super+0x32/0xb0\n[ 5.267450] deactivate_super+0x46/0x60\n[ 5.267460] cleanup_mnt+0xc3/0x170\n[ 5.267475] __cleanup_mnt+0x12/0x20\n[ 5.267485] task_work_run+0x5d/0xb0\n[ 5.267499] exit_to_user_mode_loop+0x144/0x170\n[ 5.267512] do_syscall_64+0x2b9/0x7c0\n[ 5.267523] ? __lock_acquire+0x665/0x2ce0\n[ 5.267535] ? __lock_acquire+0x665/0x2ce0\n[ 5.267560] ? lock_acquire+0xcd/0x300\n[ 5.267573] ? find_held_lock+0x31/0x90\n[ 5.267582] ? mntput_no_expire+0x97/0x4e0\n[ 5.267606] ? mntput_no_expire+0xa1/0x4e0\n[ 5.267625] ? mntput+0x24/0x50\n[ 5.267634] ? path_put+0x1e/0x30\n[ 5.267647] ? do_faccessat+0x120/0x2f0\n[ 5.267677] ? do_syscall_64+0x1a2/0x7c0\n[ 5.267686] ? from_kgid_munged+0x17/0x30\n[ 5.267703] ? from_kuid_munged+0x13/0x30\n[ 5.267711] ? __do_sys_getuid+0x3d/0x50\n[ 5.267724] ? do_syscall_64+0x1a2/0x7c0\n[ 5.267732] ? irqentry_exit+0x77/0xb0\n[ 5.267743] ? clear_bhb_loop+0x30/0x80\n[ 5.267752] ? clear_bhb_loop+0x30/0x80\n[ 5.267765] entry_SYSCALL_64_after_hwframe+0x76/0x7e\n[ 5.267772] RIP: 0033:0x7aaa8b32a9fb\n[ 5.267781] Code: c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 f3 0f 1e fa 31 f6 e9 05 00 00 00 0f 1f 44 00 00 f3 0f 1e fa b8 a6 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 05 c3 0f 1f 40 00 48 8b 15 e9 83 0d 00 f7 d8\n[ 5.267787] RSP: 002b:00007ffd7c4c9468 EFLAGS: 00000246 ORIG_RAX: 00000000000000a6\n[ 5.267796] RAX: 0000000000000000 RBX: 00005a61592a8b00 RCX: 00007aaa8b32a9fb\n[ 5.267802] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 00005a61592b2080\n[ 5.267806] RBP: 00007ffd7c4c9540 R08: 00007aaa8b403b20 R09: 0000000000000020\n[ 5.267812] R10: 0000000000000001 R11: 0000000000000246 R12: 00005a61592a8c00\n[ 5.267817] R13: 00000000\n---truncated---"
|
|
}
|
|
],
|
|
"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 - Triggering requires local access to an already-mounted `dax=always` erofs filesystem — reading or mmap'ing a file to populate DAX entries, then driving inode eviction via the shrinker or unmount. No remote or adjacent network peer can reach `truncate_folio_batch_exceptionals()` on an erofs mapping.\nAC:L - Within an erofs+DAX deployment the trigger is fully deterministic and entirely attacker-driven — read one regular flat/chunked file, then force eviction; there is no race to win and no memory layout dependency, as evidenced by the reporter hitting it on stock hardware five seconds into boot. Holding a long-term GUP pin across eviction (RDMA `ib_umem`, vfio, io_uring registered buffers) is likewise fully under attacker control.\nPR:L - The attacker needs only an unprivileged local account with read access to the DAX-mounted erofs tree — the mount itself is part of the deployment (container image over virtio-pmem, Android/ChromeOS system partition), not something the attacker must create. Populating DAX entries via read/mmap and forcing inode reclaim through memory pressure require no capabilities.\nUI:N - The attacker performs every step itself — open, read/mmap, optional GUP pin, then memory pressure to drive the inode shrinker into `evict()`. No victim action is needed beyond the pre-existing mount, which is normal system operation rather than an attacker-induced interaction.\nS:U - The corruption and the crash are confined to the kernel's page-cache and FS-DAX state within the same security authority; no hypervisor, IOMMU, or sandbox boundary is crossed by the vulnerability itself.\nC:H - Because erofs never waits for DAX pages to go idle, `dax_delete_mapping_entry()` drops the page-cache entry while a page may still be DMA-busy, and FS DAX permanently loses track of it — a pinned page can therefore keep servicing device/RDMA reads of those pmem blocks after the mount is gone and the region has been recycled to another tenant's image, disclosing data from a different security domain.\nI:H - `dax_folio_put()` clears `folio->mapping` and tears a compound DAX folio down to order-0 pages (`ClearPageHead`/`clear_compound_head`) underneath a live pin — the adjacent `WARN_ON_ONCE(folio_ref_count())` documents the violated invariant — corrupting folio and refcount state on the subsequent unpin; upstream states outright that the missing break allows a busy block to be reallocated to a new file, \"leading to corruption.\"\nA:H - Eviction of any DAX erofs inode hits `WARN_ON_ONCE(1)` at `mm/truncate.c:89`, which on the hardened, cloud, and Android configurations that set `panic_on_warn` is an immediate kernel panic and full denial of service; the same path also dismantles folio state under outstanding pins, producing later crashes on unpin."
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"affected": [
|
|
{
|
|
"product": "Linux",
|
|
"vendor": "Linux",
|
|
"defaultStatus": "unaffected",
|
|
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
|
|
"programFiles": [
|
|
"fs/erofs/super.c"
|
|
],
|
|
"versions": [
|
|
{
|
|
"version": "bde708f1a65d025c45575bfe1e7bf7bdf7e71e87",
|
|
"lessThan": "91c34cd6ca1bc67ccf2d104834956af56b5893de",
|
|
"status": "affected",
|
|
"versionType": "git"
|
|
},
|
|
{
|
|
"version": "bde708f1a65d025c45575bfe1e7bf7bdf7e71e87",
|
|
"lessThan": "181993bb0d626cf88cc803f4356ce5c5abe86278",
|
|
"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/erofs/super.c"
|
|
],
|
|
"versions": [
|
|
{
|
|
"version": "6.15",
|
|
"status": "affected"
|
|
},
|
|
{
|
|
"version": "0",
|
|
"lessThan": "6.15",
|
|
"status": "unaffected",
|
|
"versionType": "semver"
|
|
},
|
|
{
|
|
"version": "6.16.8",
|
|
"lessThanOrEqual": "6.16.*",
|
|
"status": "unaffected",
|
|
"versionType": "semver"
|
|
},
|
|
{
|
|
"version": "6.17",
|
|
"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.15",
|
|
"versionEndExcluding": "6.16.8"
|
|
},
|
|
{
|
|
"vulnerable": true,
|
|
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
|
|
"versionStartIncluding": "6.15",
|
|
"versionEndExcluding": "6.17"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"references": [
|
|
{
|
|
"url": "https://git.kernel.org/stable/c/91c34cd6ca1bc67ccf2d104834956af56b5893de"
|
|
},
|
|
{
|
|
"url": "https://git.kernel.org/stable/c/181993bb0d626cf88cc803f4356ce5c5abe86278"
|
|
}
|
|
],
|
|
"title": "erofs: fix runtime warning on truncate_folio_batch_exceptionals()",
|
|
"x_generator": {
|
|
"engine": "bippy-1.2.0"
|
|
}
|
|
},
|
|
"adp": [
|
|
{
|
|
"metrics": [
|
|
{
|
|
"cvssV3_1": {
|
|
"scope": "UNCHANGED",
|
|
"version": "3.1",
|
|
"baseScore": 7.8,
|
|
"attackVector": "LOCAL",
|
|
"baseSeverity": "HIGH",
|
|
"vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
|
|
"integrityImpact": "HIGH",
|
|
"userInteraction": "NONE",
|
|
"attackComplexity": "LOW",
|
|
"availabilityImpact": "HIGH",
|
|
"privilegesRequired": "LOW",
|
|
"confidentialityImpact": "HIGH"
|
|
}
|
|
},
|
|
{
|
|
"other": {
|
|
"type": "ssvc",
|
|
"content": {
|
|
"id": "CVE-2025-39868",
|
|
"role": "CISA Coordinator",
|
|
"options": [
|
|
{
|
|
"Exploitation": "none"
|
|
},
|
|
{
|
|
"Automatable": "no"
|
|
},
|
|
{
|
|
"Technical Impact": "total"
|
|
}
|
|
],
|
|
"version": "2.0.3",
|
|
"timestamp": "2026-01-14T19:24:11.670822Z"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"problemTypes": [
|
|
{
|
|
"descriptions": [
|
|
{
|
|
"lang": "en",
|
|
"type": "CWE",
|
|
"description": "CWE-noinfo Not enough information"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"title": "CISA ADP Vulnrichment",
|
|
"providerMetadata": {
|
|
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
|
|
"shortName": "CISA-ADP",
|
|
"dateUpdated": "2026-01-14T19:33:11.858Z"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
} |