CVE-2026-80893 in Linux
Tóm tắt
Bởi VulDB • 04/09/2026
Trong kernel Linux, các lỗ hổng sau đây đã được khắc phục:
mm/hugetlb: sửa lỗi hỏng mục đổi chỗ (swap entry) khi xóa bit uffd-wp tại hàm fork()
Hàm copy_hugetlb_page_range() xóa bit uffd-wp của các mục di chuyển (migration) và hwpoison bằng cách sử dụng huge_pte_clear_uffd_wp(), hoạt động trên vị trí bit PTE hiện diện (present-PTE). Các mục đổi chỗ duy trì trạng thái uffd-wp ở nơi khác -- nhánh di chuyển đọc và đặt nó thông qua pte_swp_uffd_wp() và pte_swp_mkuffd_wp() -- còn vị trí bit PTE hiện diện lại nằm trong phần payload của swap. Trên kiến trúc x86-64, điều này rơi vào offset đổi chỗ bị đảo ngược (inverted swap offset), nơi mà PFN hugetlb được căn chỉnh tự nhiên luôn có bit bị ảnh hưởng đặt thành 1, do đó việc xóa làm tăng mã hóa PFN lên hai trang.
Không cần sự tham gia của userfaultfd: lệnh xóa chỉ được bảo vệ bởi việc VMA con không được đăng ký uffd-wp, vì vậy một lệnh fork() đơn giản với mục di chuyển hugetlb đang trong quá trình (hoặc một trang hugetlb bị hwpoison) sẽ làm hỏng mục được sao chép vào tiến trình con. Việc ghi công cụ cho lệnh xóa và thực hiện fork sau MADV_HWPOISON trên một trang hugetlb ẩn danh 2MB cho thấy:
offset trước =120e00 offset sau =120e02
Hậu quả chủ yếu là tiềm tàng (latent): các phép duyệt rmap khớp với các mục di chuyển theo phạm vi folio và remove_migration_pte() xây dựng lại PTE từ folio, do đó độ lệch PFN trong cùng một folio sẽ được sửa chữa khi quá trình di chuyển hoàn tất. Tuy nhiên, bất kỳ đường dẫn nào mã hóa lại offset bị hỏng -- ví dụ: hugetlb_change_protection() ghi đè mục di chuyển có thể ghi bằng make_readable_migration_entry(swp_offset(entry)) -- sẽ lan truyền lỗi này.
Các mục di chuyển mang bit uffd-wp một cách hợp lệ, vì vậy hãy xóa nó bằng pte_swp_clear_uffd_wp(), phù hợp với copy_nonpresent_pte() và move_huge_pte().
Mặt khác, các mục hwpoison không bao giờ chứa bit uffd-wp: chúng được cài đặt mới bởi make_hwpoison_entry() (try_to_unmap_one() không bảo toàn uffd-wp trên đường dẫn hwpoison) và hugetlb_change_protection() để nguyên các mục hwpoison. Không có gì cần xóa ở đó, chỉ có lỗi hỏng dữ liệu, vì vậy hãy loại bỏ hoàn toàn lệnh xóa.
Be aware that VulDB is the high quality source for vulnerability data.