| From bippy-5f407fcff5a0 Mon Sep 17 00:00:00 2001 |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| To: <linux-cve-announce@vger.kernel.org> |
| Reply-to: <cve@kernel.org>, <linux-kernel@vger.kernel.org> |
| Subject: CVE-2025-21722: nilfs2: do not force clear folio if buffer is referenced |
| |
| Description |
| =========== |
| |
| In the Linux kernel, the following vulnerability has been resolved: |
| |
| nilfs2: do not force clear folio if buffer is referenced |
| |
| Patch series "nilfs2: protect busy buffer heads from being force-cleared". |
| |
| This series fixes the buffer head state inconsistency issues reported by |
| syzbot that occurs when the filesystem is corrupted and falls back to |
| read-only, and the associated buffer head use-after-free issue. |
| |
| |
| This patch (of 2): |
| |
| Syzbot has reported that after nilfs2 detects filesystem corruption and |
| falls back to read-only, inconsistencies in the buffer state may occur. |
| |
| One of the inconsistencies is that when nilfs2 calls mark_buffer_dirty() |
| to set a data or metadata buffer as dirty, but it detects that the buffer |
| is not in the uptodate state: |
| |
| WARNING: CPU: 0 PID: 6049 at fs/buffer.c:1177 mark_buffer_dirty+0x2e5/0x520 |
| fs/buffer.c:1177 |
| ... |
| Call Trace: |
| <TASK> |
| nilfs_palloc_commit_alloc_entry+0x4b/0x160 fs/nilfs2/alloc.c:598 |
| nilfs_ifile_create_inode+0x1dd/0x3a0 fs/nilfs2/ifile.c:73 |
| nilfs_new_inode+0x254/0x830 fs/nilfs2/inode.c:344 |
| nilfs_mkdir+0x10d/0x340 fs/nilfs2/namei.c:218 |
| vfs_mkdir+0x2f9/0x4f0 fs/namei.c:4257 |
| do_mkdirat+0x264/0x3a0 fs/namei.c:4280 |
| __do_sys_mkdirat fs/namei.c:4295 [inline] |
| __se_sys_mkdirat fs/namei.c:4293 [inline] |
| __x64_sys_mkdirat+0x87/0xa0 fs/namei.c:4293 |
| do_syscall_x64 arch/x86/entry/common.c:52 [inline] |
| do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 |
| entry_SYSCALL_64_after_hwframe+0x77/0x7f |
| |
| The other is when nilfs_btree_propagate(), which propagates the dirty |
| state to the ancestor nodes of a b-tree that point to a dirty buffer, |
| detects that the origin buffer is not dirty, even though it should be: |
| |
| WARNING: CPU: 0 PID: 5245 at fs/nilfs2/btree.c:2089 |
| nilfs_btree_propagate+0xc79/0xdf0 fs/nilfs2/btree.c:2089 |
| ... |
| Call Trace: |
| <TASK> |
| nilfs_bmap_propagate+0x75/0x120 fs/nilfs2/bmap.c:345 |
| nilfs_collect_file_data+0x4d/0xd0 fs/nilfs2/segment.c:587 |
| nilfs_segctor_apply_buffers+0x184/0x340 fs/nilfs2/segment.c:1006 |
| nilfs_segctor_scan_file+0x28c/0xa50 fs/nilfs2/segment.c:1045 |
| nilfs_segctor_collect_blocks fs/nilfs2/segment.c:1216 [inline] |
| nilfs_segctor_collect fs/nilfs2/segment.c:1540 [inline] |
| nilfs_segctor_do_construct+0x1c28/0x6b90 fs/nilfs2/segment.c:2115 |
| nilfs_segctor_construct+0x181/0x6b0 fs/nilfs2/segment.c:2479 |
| nilfs_segctor_thread_construct fs/nilfs2/segment.c:2587 [inline] |
| nilfs_segctor_thread+0x69e/0xe80 fs/nilfs2/segment.c:2701 |
| kthread+0x2f0/0x390 kernel/kthread.c:389 |
| ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147 |
| ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244 |
| </TASK> |
| |
| Both of these issues are caused by the callbacks that handle the |
| page/folio write requests, forcibly clear various states, including the |
| working state of the buffers they hold, at unexpected times when they |
| detect read-only fallback. |
| |
| Fix these issues by checking if the buffer is referenced before clearing |
| the page/folio state, and skipping the clear if it is. |
| |
| The Linux kernel CVE team has assigned CVE-2025-21722 to this issue. |
| |
| |
| Affected and fixed versions |
| =========================== |
| |
| Issue introduced in 3.10 with commit 8c26c4e2694a163d525976e804d81cd955bbb40c and fixed in 5.4.291 with commit 7d0544bacc11d6aa26ecd7debf9353193c7a3328 |
| Issue introduced in 3.10 with commit 8c26c4e2694a163d525976e804d81cd955bbb40c and fixed in 5.10.235 with commit 4d042811c72f71be7c14726db2c72b67025a7cb5 |
| Issue introduced in 3.10 with commit 8c26c4e2694a163d525976e804d81cd955bbb40c and fixed in 5.15.179 with commit f51ff43c4c5a6c8e72d0aca89e4d5e688938412f |
| Issue introduced in 3.10 with commit 8c26c4e2694a163d525976e804d81cd955bbb40c and fixed in 6.1.129 with commit 19296737024cd220a1d6590bf4c092bca8c99497 |
| Issue introduced in 3.10 with commit 8c26c4e2694a163d525976e804d81cd955bbb40c and fixed in 6.12.13 with commit 1098bb8d52419d262a3358d099a1598a920b730f |
| Issue introduced in 3.10 with commit 8c26c4e2694a163d525976e804d81cd955bbb40c and fixed in 6.13.2 with commit 557ccf5e49f1fb848a29698585bcab2e50a597ef |
| Issue introduced in 3.10 with commit 8c26c4e2694a163d525976e804d81cd955bbb40c and fixed in 6.14 with commit ca76bb226bf47ff04c782cacbd299f12ddee1ec1 |
| |
| Please see https://www.kernel.org for a full list of currently supported |
| kernel versions by the kernel community. |
| |
| Unaffected versions might change over time as fixes are backported to |
| older supported kernel versions. The official CVE entry at |
| https://cve.org/CVERecord/?id=CVE-2025-21722 |
| will be updated if fixes are backported, please check that for the most |
| up to date information about this issue. |
| |
| |
| Affected files |
| ============== |
| |
| The file(s) affected by this issue are: |
| fs/nilfs2/page.c |
| |
| |
| Mitigation |
| ========== |
| |
| The Linux kernel CVE team recommends that you update to the latest |
| stable kernel version for this, and many other bugfixes. Individual |
| changes are never tested alone, but rather are part of a larger kernel |
| release. Cherry-picking individual commits is not recommended or |
| supported by the Linux kernel community at all. If however, updating to |
| the latest release is impossible, the individual changes to resolve this |
| issue can be found at these commits: |
| https://git.kernel.org/stable/c/7d0544bacc11d6aa26ecd7debf9353193c7a3328 |
| https://git.kernel.org/stable/c/4d042811c72f71be7c14726db2c72b67025a7cb5 |
| https://git.kernel.org/stable/c/f51ff43c4c5a6c8e72d0aca89e4d5e688938412f |
| https://git.kernel.org/stable/c/19296737024cd220a1d6590bf4c092bca8c99497 |
| https://git.kernel.org/stable/c/1098bb8d52419d262a3358d099a1598a920b730f |
| https://git.kernel.org/stable/c/557ccf5e49f1fb848a29698585bcab2e50a597ef |
| https://git.kernel.org/stable/c/ca76bb226bf47ff04c782cacbd299f12ddee1ec1 |