Executive Summary

Informations
Name CVE-2025-21881 First vendor Publication 2025-03-27
Vendor Cve Last vendor Modification 2025-03-27

Security-Database Scoring CVSS v3

Cvss vector : N/A
Overall CVSS Score NA
Base Score NA Environmental Score NA
impact SubScore NA Temporal Score NA
Exploitabality Sub Score NA
 
Calculate full CVSS 3.0 Vectors scores

Security-Database Scoring CVSS v2

Cvss vector :
Cvss Base Score N/A Attack Range N/A
Cvss Impact Score N/A Attack Complexity N/A
Cvss Expoit Score N/A Authentication N/A
Calculate full CVSS 2.0 Vectors scores

Detail

In the Linux kernel, the following vulnerability has been resolved:

uprobes: Reject the shared zeropage in uprobe_write_opcode()

We triggered the following crash in syzkaller tests:

BUG: Bad page state in process syz.7.38 pfn:1eff3
page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x1eff3
flags: 0x3fffff00004004(referenced|reserved|node=0|zone=1|lastcpupid=0x1fffff)
raw: 003fffff00004004 ffffe6c6c07bfcc8 ffffe6c6c07bfcc8 0000000000000000
raw: 0000000000000000 0000000000000000 00000000fffffffe 0000000000000000
page dumped because: PAGE_FLAGS_CHECK_AT_FREE flag(s) set
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014
Call Trace:

dump_stack_lvl+0x32/0x50
bad_page+0x69/0xf0
free_unref_page_prepare+0x401/0x500
free_unref_page+0x6d/0x1b0
uprobe_write_opcode+0x460/0x8e0
install_breakpoint.part.0+0x51/0x80
register_for_each_vma+0x1d9/0x2b0
__uprobe_register+0x245/0x300
bpf_uprobe_multi_link_attach+0x29b/0x4f0
link_create+0x1e2/0x280
__sys_bpf+0x75f/0xac0
__x64_sys_bpf+0x1a/0x30
do_syscall_64+0x56/0x100
entry_SYSCALL_64_after_hwframe+0x78/0xe2

BUG: Bad rss-counter state mm:00000000452453e0 type:MM_FILEPAGES val:-1

The following syzkaller test case can be used to reproduce:

r2 = creat(&(0x7f0000000000)='./file0\x00', 0x8)
write$nbd(r2, &(0x7f0000000580)=ANY=[], 0x10)
r4 = openat(0xffffffffffffff9c, &(0x7f0000000040)='./file0\x00', 0x42, 0x0)
mmap$IORING_OFF_SQ_RING(&(0x7f0000ffd000/0x3000)=nil, 0x3000, 0x0, 0x12, r4, 0x0)
r5 = userfaultfd(0x80801)
ioctl$UFFDIO_API(r5, 0xc018aa3f, &(0x7f0000000040)={0xaa, 0x20})
r6 = userfaultfd(0x80801)
ioctl$UFFDIO_API(r6, 0xc018aa3f, &(0x7f0000000140))
ioctl$UFFDIO_REGISTER(r6, 0xc020aa00, &(0x7f0000000100)={{&(0x7f0000ffc000/0x4000)=nil, 0x4000}, 0x2})
ioctl$UFFDIO_ZEROPAGE(r5, 0xc020aa04, &(0x7f0000000000)={{&(0x7f0000ffd000/0x1000)=nil, 0x1000}})
r7 = bpf$PROG_LOAD(0x5, &(0x7f0000000140)={0x2, 0x3, &(0x7f0000000200)=ANY=[@ANYBLOB="1800000000120000000000000000000095"], &(0x7f0000000000)='GPL\x00', 0x7, 0x0, 0x0, 0x0, 0x0, '\x00', 0x0, @fallback=0x30, 0xffffffffffffffff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, @void, @value}, 0x94)
bpf$BPF_LINK_CREATE_XDP(0x1c, &(0x7f0000000040)={r7, 0x0, 0x30, 0x1e, @val=@uprobe_multi={&(0x7f0000000080)='./file0\x00', &(0x7f0000000100)=[0x2], 0x0, 0x0, 0x1}}, 0x40)

The cause is that zero pfn is set to the PTE without increasing the RSS count in mfill_atomic_pte_zeropage() and the refcount of zero folio does not increase accordingly. Then, the operation on the same pfn is performed in uprobe_write_opcode()->__replace_page() to unconditional decrease the RSS count and old_folio's refcount.

Therefore, two bugs are introduced:

1. The RSS count is incorrect, when process exit, the check_mm() report
error "Bad rss-count".

2. The reserved folio (zero folio) is freed when folio->refcount is zero,
then free_pages_prepare->free_page_is_bad() report error
"Bad page state".

There is more, the following warning could also theoretically be triggered:

__replace_page()
-> ...
-> folio_remove_rmap_pte()
-> VM_WARN_ON_FOLIO(is_zero_folio(folio), folio)

Considering that uprobe hit on the zero folio is a very rare case, just reject zero old folio immediately after get_user_page_vma_remote().

[ mingo: Cleaned up the changelog ]

Original Source

Url : http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2025-21881

Sources (Detail)

https://git.kernel.org/stable/c/0b6f19714588cf2366b0364234f97ba963688f63
https://git.kernel.org/stable/c/13cca2b73e2b0ec3ea6d6615d615395621d22752
https://git.kernel.org/stable/c/54011fc94422f094eaf47555284de70a4bc32bb9
https://git.kernel.org/stable/c/bddf10d26e6e5114e7415a0e442ec6f51a559468
https://git.kernel.org/stable/c/c4cb2bfa99513311886c1eb5c1c2ac26f3338a6e
Source Url

Alert History

If you want to see full details history, please login or register.
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
Date Informations
2025-04-21 05:53:06
  • Multiple Updates
2025-04-21 05:52:40
  • Multiple Updates
2025-04-20 14:17:25
  • Multiple Updates
2025-04-20 14:17:11
  • Multiple Updates
2025-04-20 07:31:08
  • Multiple Updates
2025-04-20 07:30:49
  • Multiple Updates
2025-04-19 14:17:42
  • Multiple Updates
2025-04-19 14:17:27
  • Multiple Updates
2025-04-19 06:17:29
  • Multiple Updates
2025-04-19 06:17:15
  • Multiple Updates
2025-04-18 16:36:05
  • Multiple Updates
2025-04-18 16:35:52
  • Multiple Updates
2025-04-18 03:17:53
  • Multiple Updates
2025-04-18 03:17:37
  • Multiple Updates
2025-04-17 14:17:17
  • Multiple Updates
2025-04-17 14:17:03
  • Multiple Updates
2025-04-17 06:47:43
  • Multiple Updates
2025-04-17 06:47:26
  • Multiple Updates
2025-04-16 14:22:57
  • Multiple Updates
2025-04-16 14:22:43
  • Multiple Updates
2025-04-16 07:05:38
  • Multiple Updates
2025-04-16 07:05:23
  • Multiple Updates
2025-04-15 14:18:48
  • Multiple Updates
2025-04-15 14:18:33
  • Multiple Updates
2025-04-15 05:10:11
  • Multiple Updates
2025-04-15 05:09:57
  • Multiple Updates
2025-04-14 15:57:27
  • Multiple Updates
2025-04-14 15:57:14
  • Multiple Updates
2025-04-14 04:56:53
  • Multiple Updates
2025-04-14 04:56:05
  • Multiple Updates
2025-04-13 15:25:10
  • Multiple Updates
2025-04-13 15:24:56
  • Multiple Updates
2025-04-13 03:26:21
  • Multiple Updates
2025-04-13 03:26:06
  • Multiple Updates
2025-04-12 14:17:24
  • Multiple Updates
2025-04-12 14:17:11
  • Multiple Updates
2025-04-12 04:33:23
  • Multiple Updates
2025-04-12 04:32:58
  • Multiple Updates
2025-04-11 14:45:03
  • Multiple Updates
2025-04-11 14:44:49
  • Multiple Updates
2025-04-11 03:25:15
  • Multiple Updates
2025-04-11 03:25:01
  • Multiple Updates
2025-04-10 14:19:48
  • Multiple Updates
2025-04-10 14:19:34
  • Multiple Updates
2025-04-10 03:35:25
  • Multiple Updates
2025-04-10 03:35:09
  • Multiple Updates
2025-04-09 14:19:35
  • Multiple Updates
2025-04-09 14:19:21
  • Multiple Updates
2025-04-09 03:20:45
  • Multiple Updates
2025-04-09 03:20:32
  • Multiple Updates
2025-04-08 14:16:11
  • Multiple Updates
2025-04-08 14:15:58
  • Multiple Updates
2025-04-08 03:22:07
  • Multiple Updates
2025-04-08 03:21:53
  • Multiple Updates
2025-04-07 14:15:29
  • Multiple Updates
2025-04-07 14:15:15
  • Multiple Updates
2025-04-07 03:16:16
  • Multiple Updates
2025-04-07 03:16:02
  • Multiple Updates
2025-04-06 14:15:20
  • Multiple Updates
2025-04-06 14:15:06
  • Multiple Updates
2025-04-06 03:17:39
  • Multiple Updates
2025-04-06 03:17:25
  • Multiple Updates
2025-04-05 14:18:49
  • Multiple Updates
2025-04-05 14:18:35
  • Multiple Updates
2025-04-05 03:22:35
  • Multiple Updates
2025-04-05 03:22:21
  • Multiple Updates
2025-04-04 14:16:56
  • Multiple Updates
2025-04-04 14:16:42
  • Multiple Updates
2025-04-04 03:15:49
  • Multiple Updates
2025-04-04 03:15:35
  • Multiple Updates
2025-04-03 15:09:52
  • Multiple Updates
2025-04-03 15:09:32
  • Multiple Updates
2025-04-03 03:14:52
  • Multiple Updates
2025-04-03 03:14:38
  • Multiple Updates
2025-04-02 14:15:32
  • Multiple Updates
2025-04-02 14:15:19
  • Multiple Updates
2025-04-02 03:15:44
  • Multiple Updates
2025-04-02 03:15:30
  • Multiple Updates
2025-04-01 14:15:21
  • Multiple Updates
2025-04-01 14:15:07
  • Multiple Updates
2025-03-31 17:20:34
  • Multiple Updates
2025-03-27 17:20:57
  • First insertion