CVE-2024-56628
Severity CVSS v4.0:
Pending analysis
Type:
Unavailable / Other
Publication date:
27/12/2024
Last modified:
27/12/2024
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
LoongArch: Add architecture specific huge_pte_clear()<br />
<br />
When executing mm selftests run_vmtests.sh, there is such an error:<br />
<br />
BUG: Bad page state in process uffd-unit-tests pfn:00000<br />
page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x0<br />
flags: 0xffff0000002000(reserved|node=0|zone=0|lastcpupid=0xffff)<br />
raw: 00ffff0000002000 ffffbf0000000008 ffffbf0000000008 0000000000000000<br />
raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000<br />
page dumped because: PAGE_FLAGS_CHECK_AT_FREE flag(s) set<br />
Modules linked in: snd_seq_dummy snd_seq snd_seq_device rfkill vfat fat<br />
virtio_balloon efi_pstore virtio_net pstore net_failover failover fuse<br />
nfnetlink virtio_scsi virtio_gpu virtio_dma_buf dm_multipath efivarfs<br />
CPU: 2 UID: 0 PID: 1913 Comm: uffd-unit-tests Not tainted 6.12.0 #184<br />
Hardware name: QEMU QEMU Virtual Machine, BIOS unknown 2/2/2022<br />
Stack : 900000047c8ac000 0000000000000000 9000000000223a7c 900000047c8ac000<br />
900000047c8af690 900000047c8af698 0000000000000000 900000047c8af7d8<br />
900000047c8af7d0 900000047c8af7d0 900000047c8af5b0 0000000000000001<br />
0000000000000001 900000047c8af698 10b3c7d53da40d26 0000010000000000<br />
0000000000000022 0000000fffffffff fffffffffe000000 ffff800000000000<br />
000000000000002f 0000800000000000 000000017a6d4000 90000000028f8940<br />
0000000000000000 0000000000000000 90000000025aa5e0 9000000002905000<br />
0000000000000000 90000000028f8940 ffff800000000000 0000000000000000<br />
0000000000000000 0000000000000000 9000000000223a94 000000012001839c<br />
00000000000000b0 0000000000000004 0000000000000000 0000000000071c1d<br />
...<br />
Call Trace:<br />
[] show_stack+0x5c/0x180<br />
[] dump_stack_lvl+0x6c/0xa0<br />
[] bad_page+0x1a0/0x1f0<br />
[] free_unref_folios+0xbf0/0xd20<br />
[] folios_put_refs+0x1a4/0x2b8<br />
[] free_pages_and_swap_cache+0x164/0x260<br />
[] tlb_batch_pages_flush+0xa8/0x1c0<br />
[] tlb_finish_mmu+0xa8/0x218<br />
[] exit_mmap+0x1a0/0x360<br />
[] __mmput+0x78/0x200<br />
[] do_exit+0x43c/0xde8<br />
[] do_group_exit+0x68/0x110<br />
[] sys_exit_group+0x1c/0x20<br />
[] do_syscall+0x94/0x130<br />
[] handle_syscall+0xb8/0x158<br />
Disabling lock debugging due to kernel taint<br />
BUG: non-zero pgtables_bytes on freeing mm: -16384<br />
<br />
On LoongArch system, invalid huge pte entry should be invalid_pte_table<br />
or a single _PAGE_HUGE bit rather than a zero value. And it should be<br />
the same with invalid pmd entry, since pmd_none() is called by function<br />
free_pgd_range() and pmd_none() return 0 by huge_pte_clear(). So single<br />
_PAGE_HUGE bit is also treated as a valid pte table and free_pte_range()<br />
will be called in free_pmd_range().<br />
<br />
free_pmd_range()<br />
pmd = pmd_offset(pud, addr);<br />
do {<br />
next = pmd_addr_end(addr, end);<br />
if (pmd_none_or_clear_bad(pmd))<br />
continue;<br />
free_pte_range(tlb, pmd, addr);<br />
} while (pmd++, addr = next, addr != end);<br />
<br />
Here invalid_pte_table is used for both invalid huge pte entry and<br />
pmd entry.



