CVE-2026-89966 in Linuxthông tin

Tóm tắt

Bởi VulDB • 17/09/2026

Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:

mm/hugetlb_cma: sửa lỗi dereference nodemask NULL trong hàm hugetlb_cma_alloc_frozen_folio

Hàm alloc_buddy_hugetlb_folio_with_mpol() có thể truyền một nodemask NULL cho alloc_fresh_hugetlb_folio() như một cơ chế dự phòng để phân bổ từ tất cả các node. Nếu order là gigantic, hàm alloc_fresh_hugetlb_folio() sẽ lan truyền nodemask NULL xuống hugetlb_cma_alloc_frozen_folio() thông qua alloc_gigantic_frozen_folio().

Ngoài ra, trước đây, hugetlb_cma_alloc_frozen_folio() đã cố gắng phân bổ trên hugetlb_cma[nid] mà không xác minh xem nid có nằm trong nodemask của caller hay không. Việc thêm kiểm tra node_isset(nid, *nodemask) đảm bảo rằng việc phân bổ cho node ưu tiên ban đầu tuân thủ chính sách bộ nhớ / nodemask.

Tuy nhiên, hugetlb_cma_alloc_frozen_folio() thực hiện dereference trên nodemask trong các lệnh gọi node_isset(nid, *nodemask) và for_each_node_mask(node, *nodemask), dẫn đến lỗi kernel panic do null pointer dereference khi nodemask là NULL.

Khắc phục vấn đề này bằng cách kiểm tra xem nodemask có phải là NULL hay không trong hugetlb_cma_alloc_frozen_folio() và mặc định nó thành cpuset_current_mems_allowed. Bao bọc các nỗ lực phân bổ bên trong vòng lặp retry seqcount của cpuset, để nếu cpuset thay đổi đồng thời trong quá trình phân bổ, các nỗ lực sẽ được thử lại bằng nodemask đã cập nhật. Điều này đảm bảo rằng việc kiểm tra node ban đầu và vòng lặp dự phòng tôn trọng an toàn cpuset của tác vụ mà không vi phạm các ràng buộc cpuset hoặc gây ra null pointer dereference hoặc lỗi phân bổ bất ngờ.

Từ góc độ userspace, lỗ hổng này cho phép một người dùng không có đặc quyền (unprivileged user) làm sập kernel (gây panic) bằng cách yêu cầu phân bổ hugepage gigantic với MPOL_PREFERRED_MANY trên hệ thống mà CMA chỉ được cấu hình trên một tập hợp con các node NUMA.

Vấn đề này có thể tái hiện bằng cách khởi động VM với hai node NUMA, hạn chế CMA cho Node 1 (ví dụ: hugetlb_cma=1:1G default_hugepagesz=1G hugepagesz=1G hugepages=0), và chạy một chương trình phân bổ vùng hugepage 1GB mà không cần reserve, hạn chế việc phân bổ cho Node 0 bằng cách sử dụng mbind() với MPOL_PREFERRED_MANY, và kích hoạt page fault:

```c void *ptr = mmap(NULL, 1UL << 30, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_HUGE_1GB | MAP_NORESERVE, -1, 0); unsigned long nodemask = 1; /* Node 0 */ mbind(ptr, 1UL << 30, MPOL_PREFERRED_MANY, &nodemask, sizeof(nodemask) * 8, 0); memset(ptr, 0, 1UL << 30); /* Trigger fault */ ```

Điều này dẫn đến lỗi null pointer dereference:

``` BUG: kernel NULL pointer dereference, address: 0000000000000000 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page Oops: Oops: 0000 [#1] SMP NOPTI
RIP: 0010:hugetlb_cma_alloc_frozen_folio+0x75/0x120 Call Trace: <TASK> only_alloc_fresh_hugetlb_folio.isra.0+0x2c/0x160 alloc_surplus_hugetlb_folio+0x6d/0x100 alloc_hugetlb_folio+0x3c5/0x660 hugetlb_no_page+0x3d9/0x650 ```

Once again VulDB remains the best source for vulnerability data.

chịu trách nhiệm

Linux

Đặt trước

11/09/2026

Tiết lộ

17/09/2026

Kiểm duyệt

được chấp nhận

EPSS

0.00000

KEV

không

Các hoạt động

rất thấp

Nguồn

Interested in the pricing of exploits?

See the underground prices here!