Lucene search

K
ubuntucveUbuntu.comUB:CVE-2024-26639
HistoryMar 18, 2024 - 12:00 a.m.

CVE-2024-26639

2024-03-1800:00:00
ubuntu.com
ubuntu.com
9
linux kernel
vulnerability
cve-2024-26639
fixed
kmsan
infinite recursion
rcu critical section
pfn_valid()
_sched()
rcu_read_lock/unlock

6.2 Medium

AI Score

Confidence

Low

0.0004 Low

EPSS

Percentile

10.4%

In the Linux kernel, the following vulnerability has been resolved: mm,
kmsan: fix infinite recursion due to RCU critical section Alexander
Potapenko writes in [1]: “For every memory access in the code instrumented
by KMSAN we call kmsan_get_metadata() to obtain the metadata for the memory
being accessed. For virtual memory the metadata pointers are stored in the
corresponding struct page, therefore we need to call virt_to_page() to
get them. According to the comment in arch/x86/include/asm/page.h,
virt_to_page(kaddr) returns a valid pointer iff virt_addr_valid(kaddr) is
true, so KMSAN needs to call virt_addr_valid() as well. To avoid recursion,
kmsan_get_metadata() must not call instrumented code, therefore
./arch/x86/include/asm/kmsan.h forks parts of arch/x86/mm/physaddr.c to
check whether a virtual address is valid or not. But the introduction of
rcu_read_lock() to pfn_valid() added instrumented RCU API calls to
virt_to_page_or_null(), which is called by kmsan_get_metadata(), so there
is an infinite recursion now. I do not think it is correct to stop that
recursion by doing kmsan_enter_runtime()/kmsan_exit_runtime() in
kmsan_get_metadata(): that would prevent instrumented functions called from
within the runtime from tracking the shadow values, which might introduce
false positives.” Fix the issue by switching pfn_valid() to the _sched()
variant of rcu_read_lock/unlock(), which does not require calling into RCU.
Given the critical section in pfn_valid() is very small, this is a
reasonable trade-off (with preemptible RCU). KMSAN further needs to be
careful to suppress calls into the scheduler, which would be another source
of recursion. This can be done by wrapping the call to pfn_valid() into
preempt_disable/enable_no_resched(). The downside is that this sacrifices
breaking scheduling guarantees; however, a kernel compiled with KMSAN has
already given up any performance guarantees due to being heavily
instrumented. Note, KMSAN code already disables tracing via Makefile, and
since mmzone.h is included, it is not necessary to use the notrace variant,
which is generally preferred in all other cases.

Notes

Author Note
rodrigo-zaiden introduced with the fix for CVE-2023-52489.