CVE-2024-26759

Yüksək

Təsvir

Linux kernel-də aşağıdakı zəiflik aradan qaldırılıb: mm/swap: swapcache-in atlanması zamanı yarış vəziyyəti düzəldilib SWP_SYNCHRONOUS_IO üçün swapcache atlanarkən, əgər iki və ya daha çox thread eyni girişi eyni vaxtda swapin edirsə, onlar fərqli səhifələr (A, B) alırlar. Bir thread (T0) swapin əməliyyatını bitirib səhifəni (A) PTE-yə yerləşdirməzdən əvvəl, başqa bir thread (T1) səhifənin (B) swapin əməliyyatını bitirə, girişi swap_free edə, sonra isə ehtimal ki dəyişdirilmiş səhifəni eyni girişdən istifadə edərək swap out edə bilər. Bu, (T0)-da pte_same yoxlamasını pozur, çünki PTE dəyəri dəyişməz qalır və ABA problemi yaranır. Thread (T0) köhnəlmiş səhifəni (A) PTE-yə yerləşdirəcək və məlumatların korlanmasına səbəb olacaq. Mümkün çağırış yığını belə görünür: CPU0 CPU1 ---- ---- do_swap_page() eyni girişlə do_swap_page() <birbaşa swapin yolu> <birbaşa swapin yolu> <A səhifəsini ayır> <B səhifəsini ayır> swap_read_folio() <- A səhifəsinə oxu swap_read_folio() <- B səhifəsinə oxu <sonrakı kilidlərdə və ya kəsilmədə yavaş> <swapin-i əvvəl bitirdi> ... set_pte_at() swap_free() <- giriş boşdur <B səhifəsinə yaz, indi A səhifəsi köhnəlib> <B səhifəsini eyni swap girişinə swap out et> pte_same() <- Yoxlama keçir, PTE dəyişməmiş görünür, lakin A səhifəsi köhnəlib! swap_free() <- B səhifəsinin məzmunu itdi! set_pte_at() <- köhnəlmiş A səhifəsi yerləşdirildi! Bundan əlavə, ZRAM üçün swap_free() swap cihazına girişin məzmununu ləğv etməyə imkan verir, buna görə də B səhifəsi dəyişdirilməsə belə, əgər CPU0-da swap_read_folio() CPU1-də swap_free()-dən sonra baş verirsə, bu da məlumat itkisinə səbəb ola bilər. Bunu düzəltmək üçün swap girişini cache bayrağı ilə pin edən və yalnız bir thread-in onu swapin etməsinə imkan verən, həmçinin hər hansı paralel kodun girişi cache-ə yerləşdirməsinin qarşısını alan swapcache_prepare yenidən istifadə olunur. Pin PT kilidi açıldıqdan sonra buraxılır. Yarışan thread-lər sadəcə dövr edib gözləyir, çünki bu nadir və çox qısa hadisədir. Təkrar səhifə xətalarının həddindən artıq CPU sərf edərək livelock yaratmasının və ya perf statistikasına həddindən artıq səs-küy əlavə etməsinin qarşısını almaq üçün schedule_timeout_uninterruptible(1) çağırışı əlavə edilir. Bənzər livelock problemi 029c4628b2eb commit-ində ("mm: swap: get rid of livelock in swapin readahead") təsvir edilmişdi. Reproduser: Bu yarış problemi düzgün qurulmuş reproduzer və yamaqlanmış brd (oxu yolunda gecikmə ilə) istifadə edərək asanlıqla tetiklənə bilər [1]: Ən son 6.8 mainline ilə yarışın yaratdığı məlumat itkisi asanlıqla müşahidə olunur: $ gcc -g -lpthread test-thread-swap-race.c && ./a.out Polulating 32MB of memory region... Keep swapping out... Starting round 0... Spawning 65536 workers... 32746 workers spawned, wait for done... Round 0: Error on 0x5aa00, expected 32746, got 32743, 3 data loss! Round 0: Error on 0x395200, expected 32746, got 32743, 3 data loss! Round 0: Error on 0x3fd000, expected 32746, got 32737, 9 data loss! Round 0 Failed, 15 data loss! Bu reproduzer kiçik swap cihazı istifadə edərək eyni yaddaş regionunu paylaşan çoxsaylı thread-lər yaradır. Hər iki thread yarış yaratmağa çalışaraq xəritələnmiş səhifələri bir-bir əks istiqamətdə yeniləyir, bir xüsusi thread isə madvise istifadə edərək məlumatları swap out etməyə davam edir. Reproduzer təxminən hər 5 dəqiqədə bir dəfə reproduksiya dərəcəsi yaratdı, buna görə də yarış istehsalatda tamamilə mümkün olmalıdır. Bu yamaqdan sonra reproduzeri bir neçə yüz raund ərzində işə saldım və heç bir məlumat itkisi müşahidə olunmadı. Performans yükü minimaldır, 32G zram-dan 10G swapin mikrobenchmarkı: Əvvəl: 10934698 us Sonra: 11157121 us Keşlənmiş: 13155355 us (SWP_SYNCHRONOUS_IO bayrağı çıxarılır) [[email protected]: v4]

CiddilikYüksək
CVSS7.8
İstismar ehtimalı—
MəhsulLinux Kernel
Dərc3 apr 2024
İlk görülmə3 apr 2024

Necə düzəltmək olar

Yeniləyin
  • linux linux_kernel6.1.80, 6.6.19, 6.7.7 və ya daha yeni versiya

Təsirlənən məhsullar

MəhsulTəsirlənən versiyalarDüzəldildiyi versiya
linux linux_kernel4.15 ≤ v < 6.1.80, 6.2 ≤ v < 6.6.19, 6.7 ≤ v < 6.7.7, 6.86.1.80, 6.6.19, 6.7.7

Versiyanızı yoxlayın

Məhsulu seçin və istifadə etdiyiniz versiyanı yazın; versiyanın təsirlənən aralıqda olub-olmadığını görün.

Intelligence 360 paketində

Attack Surface Management

Domenlərinizə bağlı aktivləri, onlarda işləyən texnologiyaları və məlum zəiflikləri bir siyahıda görün.