CVE-2024-35784
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılıb: btrfs: fiemap və extent kilidlənməsi ilə bağlı deadlock problemi düzəldildi Extent kilidlənməsini çıxarmaq üçün yamaq dəsti üzərində işləyərkən, yeni extent kilidi əvəzləyicisi ilə fiemap və pagefaulting zamanı lockdep splat aşkar etdim. Bu deadlock bizim normal kodumuzda mövcuddur, sadəcə extent kilidlənməsində lockdep annotasiyaları olmadığı üçün biz bunu heç vaxt fərq etməmişik. Hər iterasiyada fiemap extent-ni istifadəçi sahəsinə kopyaladığımız üçün pagefaulting ehtimalı var. Bütün diapazon üçün extent kilidini saxladığımızdan, mmap etdiyimiz faylda müəyyən bir diapazona mkwrite edə bilərdik. Bu, aşağıdakı stek izi ilə deadlock-a səbəb olardı: [<0>] lock_extent+0x28d/0x2f0 [<0>] btrfs_page_mkwrite+0x273/0x8a0 [<0>] do_page_mkwrite+0x50/0xb0 [<0>] do_fault+0xc1/0x7b0 [<0>] __handle_mm_fault+0x2fa/0x460 [<0>] handle_mm_fault+0xa4/0x330 [<0>] do_user_addr_fault+0x1f4/0x800 [<0>] exc_page_fault+0x7c/0x1e0 [<0>] asm_exc_page_fault+0x26/0x30 [<0>] rep_movs_alternative+0x33/0x70 [<0>] _copy_to_user+0x49/0x70 [<0>] fiemap_fill_next_extent+0xc8/0x120 [<0>] emit_fiemap_extent+0x4d/0xa0 [<0>] extent_fiemap+0x7f8/0xad0 [<0>] btrfs_fiemap+0x49/0x80 [<0>] __x64_sys_ioctl+0x3e1/0xb50 [<0>] do_syscall_64+0x94/0x1a0 [<0>] entry_SYSCALL_64_after_hwframe+0x6e/0x76 Əvəzedici kilidim olmadan bu deadlock-u təkrar istehsal etmək üçün fstest yazdım və mövcud kilidləmə mexanizmində deadlock-un olduğunu təsdiqlədim. Bunu düzəltmək üçün fiemap-ın bütün müddəti boyunca extent kilidindən istifadə etməyin. Bu, ümumilikdə təhlükəsizdir, çünki ağacı axtararkən harada olduğumuzu izləyirik, beləliklə, fiemap çağırışımızın ortasında sıralanmış extent yenilənsə belə, əvvəl hansı ofsetdə olduğumuzu bildiyimiz üçün hələ də düzgün extent-ləri göndərəcəyik. Kilidin saxlandığı yeganə yer delalloc axtarışıdır. Delalloc məlumatları writeback zamanı dəyişə bildiyi üçün, delalloc bayrağını təyin etməli olduğumuzu yoxlayarkən delalloc-un ardıcıl görünüşünə malik olmaq üçün extent diapazonunu kilidləmək istəyirik. Bu yamaq tətbiq edildikdən sonra artıq mənim test halımla deadlock baş vermir.
Necə düzəltmək olar
- linux linux_kernel6.6.24, 6.7.12 və ya daha yeni versiya
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| linux linux_kernel | v < 6.6.24, 6.7 ≤ v < 6.7.12, 6.8 | 6.6.24, 6.7.12 |
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.
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.