UBUNTU-CVE-2025-40054
In the Linux kernel, the following vulnerability has been resolved: f2fs: fix UAF issue in f2fs_merge_page_bio() As JY reported in bugzilla [1], Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 pc : [0xffffffe51d249484] f2fs_is_cp_guaranteed+0x70/0x98 lr : [0xffffffe51d24adbc] f2fs_merge_page_bio+0x520/0x6d4 CPU: 3 UID: 0 PID: 6790 Comm: kworker/u16:3 Tainted: P B W OE 6.12.30-android16-5-maybe-dirty-4k #1 5f7701c9cbf727d1eebe77c89bbbeb3371e895e5 Tainted: [P]=PROPRIETARY_MODULE, [B]=BAD_PAGE, [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE Workqueue: writeback wb_workfn (flush-254:49) Call trace: f2fs_is_cp_guaranteed+0x70/0x98 f2fs_inplace_write_data+0x174/0x2f4 f2fs_do_write_data_page+0x214/0x81c f2fs_write_single_data_page+0x28c/0x764 f2fs_write_data_pages+0x78c/0xce4 do_writepages+0xe8/0x2fc __writeback_single_inode+0x4c/0x4b4 writeback_sb_inodes+0x314/0x540 __writeback_inodes_wb+0xa4/0xf4 wb_writeback+0x160/0x448 wb_workfn+0x2f0/0x5dc process_scheduled_works+0x1c8/0x458 worker_thread+0x334/0x3f0 kthread+0x118/0x1ac ret_from_fork+0x10/0x20 [1] https://bugzilla.kernel.org/show_bug.cgi?id=220575 The panic was caused by UAF issue w/ below race condition: kworker - writepages - f2fs_write_cache_pages - f2fs_write_single_data_page - f2fs_do_write_data_page - f2fs_inplace_write_data - f2fs_merge_page_bio - add_inu_page : cache page #1 into bio & cache bio in io->bio_list - f2fs_write_single_data_page - f2fs_do_write_data_page - f2fs_inplace_write_data - f2fs_merge_page_bio - add_inu_page : cache page #2 into bio which is linked in io->bio_list write - f2fs_write_begin : write page #1 - f2fs_folio_wait_writeback - f2fs_submit_merged_ipu_write - f2fs_submit_write_bio : submit bio which inclues page #1 and #2 software IRQ - f2fs_write_end_io - fscrypt_free_bounce_page : freed bounced page which belongs to page #2 - inc_page_count( , WB_DATA_TYPE(data_folio), false) : data_folio points to fio->encrypted_page the bounced page can be freed before accessing it in f2fs_is_cp_guarantee() It can reproduce w/ below testcase: Run below script in shell #1: for ((i=1;i>0;i++)) do xfs_io -f /mnt/f2fs/enc/file \ -c "pwrite 0 32k" -c "fdatasync" Run below script in shell #2: for ((i=1;i>0;i++)) do xfs_io -f /mnt/f2fs/enc/file \ -c "pwrite 0 32k" -c "fdatasync" So, in f2fs_merge_page_bio(), let's avoid using fio->encrypted_page after commit page into internal ipu cache.
02 / AFFECTED SOFTWARE
Affected packages
96 explicit affected versions
50 explicit affected versions
6 explicit affected versions
24 explicit affected versions
5 explicit affected versions
8 explicit affected versions
10 explicit affected versions
7 explicit affected versions
9 explicit affected versions
9 explicit affected versions
11 explicit affected versions
42 explicit affected versions
21 explicit affected versions
6 explicit affected versions
1 explicit affected versions
1 explicit affected versions
1 explicit affected versions
91 explicit affected versions
80 explicit affected versions
79 explicit affected versions
13 explicit affected versions
8 explicit affected versions
12 explicit affected versions
11 explicit affected versions
89 explicit affected versions
69 explicit affected versions
7 explicit affected versions
12 explicit affected versions
19 explicit affected versions
10 explicit affected versions
6 explicit affected versions
100 explicit affected versions
85 explicit affected versions
84 explicit affected versions
86 explicit affected versions
76 explicit affected versions
10 explicit affected versions
39 explicit affected versions
26 explicit affected versions
90 explicit affected versions
7 explicit affected versions
84 explicit affected versions
10 explicit affected versions
12 explicit affected versions
42 explicit affected versions
13 explicit affected versions
46 explicit affected versions
35 explicit affected versions
51 explicit affected versions
50 explicit affected versions
18 explicit affected versions
42 explicit affected versions
64 explicit affected versions
48 explicit affected versions
13 explicit affected versions
4 explicit affected versions
23 explicit affected versions
55 explicit affected versions
1 explicit affected versions
21 explicit affected versions
9 explicit affected versions
16 explicit affected versions
51 explicit affected versions
8 explicit affected versions
7 explicit affected versions
12 explicit affected versions
11 explicit affected versions
7 explicit affected versions
12 explicit affected versions
14 explicit affected versions
10 explicit affected versions
1 explicit affected versions
37 explicit affected versions
29 explicit affected versions
7 explicit affected versions
19 explicit affected versions
12 explicit affected versions
1 explicit affected versions
12 explicit affected versions
44 explicit affected versions
45 explicit affected versions
16 explicit affected versions
9 explicit affected versions
10 explicit affected versions
37 explicit affected versions
10 explicit affected versions
1 explicit affected versions
13 explicit affected versions
42 explicit affected versions
3 explicit affected versions
10 explicit affected versions
11 explicit affected versions
68 explicit affected versions
26 explicit affected versions
13 explicit affected versions
37 explicit affected versions
29 explicit affected versions
13 explicit affected versions
12 explicit affected versions
43 explicit affected versions
43 explicit affected versions
92 explicit affected versions
55 explicit affected versions
33 explicit affected versions
23 explicit affected versions
60 explicit affected versions
10 explicit affected versions
23 explicit affected versions
22 explicit affected versions
11 explicit affected versions
5 explicit affected versions
12 explicit affected versions
1 explicit affected versions
7 explicit affected versions
12 explicit affected versions
8 explicit affected versions
5 explicit affected versions
77 explicit affected versions
55 explicit affected versions
93 explicit affected versions
10 explicit affected versions
26 explicit affected versions
42 explicit affected versions
1 explicit affected versions
37 explicit affected versions
48 explicit affected versions
11 explicit affected versions
1 explicit affected versions
13 explicit affected versions
48 explicit affected versions
16 explicit affected versions
91 explicit affected versions
53 explicit affected versions
3 explicit affected versions
2 explicit affected versions
7 explicit affected versions
51 explicit affected versions
8 explicit affected versions
18 explicit affected versions
43 explicit affected versions
12 explicit affected versions
71 explicit affected versions
80 explicit affected versions
1 explicit affected versions
27 explicit affected versions
66 explicit affected versions
45 explicit affected versions
8 explicit affected versions
49 explicit affected versions
13 explicit affected versions
13 explicit affected versions
7 explicit affected versions
8 explicit affected versions
10 explicit affected versions
12 explicit affected versions
9 explicit affected versions
39 explicit affected versions
44 explicit affected versions
16 explicit affected versions
3 explicit affected versions
13 explicit affected versions
26 explicit affected versions
45 explicit affected versions
37 explicit affected versions
53 explicit affected versions
14 explicit affected versions
38 explicit affected versions
92 explicit affected versions
8 explicit affected versions
7 explicit affected versions
4 explicit affected versions
81 explicit affected versions
43 explicit affected versions
6 explicit affected versions
5 explicit affected versions
10 explicit affected versions
48 explicit affected versions
14 explicit affected versions
4 explicit affected versions
78 explicit affected versions
6 explicit affected versions
11 explicit affected versions
1 explicit affected versions
22 explicit affected versions
41 explicit affected versions
80 explicit affected versions
03 / CONNECTIONS
Connected vulnerabilities
04 / EVIDENCE
Source records
In the Linux kernel, the following vulnerability has been resolved: f2fs: fix UAF issue in f2fs_merge_page_bio() As JY reported in bugzilla [1], Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 pc : [0xffffffe51d249484] f2fs_is_cp_guaranteed+0x70/0x98 lr : [0xffffffe51d24adbc] f2fs_merge_page_bio+0x520/0x6d4 CPU: 3 UID: 0 PID: 6790 Comm: kworker/u16:3 Tainted: P B W OE 6.12.30-android16-5-maybe-dirty-4k #1 5f7701c9cbf727d1eebe77c89bbbeb3371e895e5 Tainted: [P]=PROPRIETARY_MODULE, [B]=BAD_PAGE, [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE Workqueue: writeback wb_workfn (flush-254:49) Call trace: f2fs_is_cp_guaranteed+0x70/0x98 f2fs_inplace_write_data+0x174/0x2f4 f2fs_do_write_data_page+0x214/0x81c f2fs_write_single_data_page+0x28c/0x764 f2fs_write_data_pages+0x78c/0xce4 do_writepages+0xe8/0x2fc __writeback_single_inode+0x4c/0x4b4 writeback_sb_inodes+0x314/0x540 __writeback_inodes_wb+0xa4/0xf4 wb_writeback+0x160/0x448 wb_workfn+0x2f0/0x5dc process_scheduled_works+0x1c8/0x458 worker_thread+0x334/0x3f0 kthread+0x118/0x1ac ret_from_fork+0x10/0x20 [1] https://bugzilla.kernel.org/show_bug.cgi?id=220575 The panic was caused by UAF issue w/ below race condition: kworker - writepages - f2fs_write_cache_pages - f2fs_write_single_data_page - f2fs_do_write_data_page - f2fs_inplace_write_data - f2fs_merge_page_bio - add_inu_page : cache page #1 into bio & cache bio in io->bio_list - f2fs_write_single_data_page - f2fs_do_write_data_page - f2fs_inplace_write_data - f2fs_merge_page_bio - add_inu_page : cache page #2 into bio which is linked in io->bio_list write - f2fs_write_begin : write page #1 - f2fs_folio_wait_writeback - f2fs_submit_merged_ipu_write - f2fs_submit_write_bio : submit bio which inclues page #1 and #2 software IRQ - f2fs_write_end_io - fscrypt_free_bounce_page : freed bounced page which belongs to page #2 - inc_page_count( , WB_DATA_TYPE(data_folio), false) : data_folio points to fio->encrypted_page the bounced page can be freed before accessing it in f2fs_is_cp_guarantee() It can reproduce w/ below testcase: Run below script in shell #1: for ((i=1;i>0;i++)) do xfs_io -f /mnt/f2fs/enc/file \ -c "pwrite 0 32k" -c "fdatasync" Run below script in shell #2: for ((i=1;i>0;i++)) do xfs_io -f /mnt/f2fs/enc/file \ -c "pwrite 0 32k" -c "fdatasync" So, in f2fs_merge_page_bio(), let's avoid using fio->encrypted_page after commit page into internal ipu cache.
05 / REFERENCES
Further evidence
- https://git.kernel.org/linus/edf7e9040fc52c922db947f9c6c36f07377c52ea
- https://git.kernel.org/stable/c/01118321e0c8a5f3ece57d0d377bfc92d83cd210
- https://git.kernel.org/stable/c/edf7e9040fc52c922db947f9c6c36f07377c52ea
- https://ubuntu.com/security/CVE-2025-40054
- https://ubuntu.com/security/notices/USN-8029-1
- https://ubuntu.com/security/notices/USN-8029-2
- https://ubuntu.com/security/notices/USN-8029-3
- https://ubuntu.com/security/notices/USN-8030-1
- https://ubuntu.com/security/notices/USN-8048-1
- https://www.cve.org/CVERecord?id=CVE-2025-40054