CVE-2024-45022CWE-787

CVE-2024-45022

High · published September 11, 2024

CVSS v3.1
7.8
EPSS
0%
Percentile
13.0
In the wild
Unconfirmed
What it is

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

mm/vmalloc: fix page mapping if vm_area_alloc_pages() with high order fallback to order 0

The __vmap_pages_range_noflush() assumes its argument pages** contains

pages with the same page shift. However, since commit e9c3cda4d86e ("mm,

vmalloc: fix high order __GFP_NOFAIL allocations"), if gfp_flags includes

__GFP_NOFAIL with high order in vm_area_alloc_pages() and page allocation

failed for high order, the pages** may contain two different page shifts

(high order and order-0). This could lead __vmap_pages_range_noflush() to

perform incorrect mappings, potentially resulting in memory corruption.

Users might encounter this as follows (vmap_allow_huge = true, 2M is for

PMD_SIZE):

kvmalloc(2M, __GFP_NOFAIL|GFP_X)

__vmalloc_node_range_noprof(vm_flags=VM_ALLOW_HUGE_VMAP)

vm_area_alloc_pages(order=9) ---> order-9 allocation failed and fallback to order-0

vmap_pages_range()

vmap_pages_range_noflush()

__vmap_pages_range_noflush(page_shift = 21) ----> wrong mapping happens

We can remove the fallback code because if a high-order allocation fails,

__vmalloc_node_range_noprof() will retry with order-0. Therefore, it is

unnecessary to fallback to order-0 here. Therefore, fix this by removing

the fallback code.

The record
Technical detail
CVSS v3.1
7.8 · HIGH
Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00229 · 13.0th percentile
Weakness
CWE-787 · Out-of-bounds Write
Published
2024-09-11T20:15Z
Affected products (6)
ProductVersionsFixed in
linux/linux_kernel≥ 6.1.95, < 6.1.1076.1.107
linux/linux_kernel≥ 6.3, < 6.6.486.6.48
linux/linux_kernel≥ 6.7, < 6.10.76.10.7
linux/linux_kernelall versions—
linux/linux_kernelall versions—
linux/linux_kernelall versions—
References (5)
EPSS history
Timeline
  • 11 SEP 15:13Z
    mm/vmalloc: fix page mapping if vm_area_alloc_pages() with high order fallback to order 0
    cvelistv5