CVE-2024-27080
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılıb: btrfs: fiemap zamanı delalloc diapazonlarının təyini zamanı yaranan yarış vəziyyətinin (race condition) düzəldilməsi Fiemap çağırışının bütün müddəti ərzində hədəf extent diapazonunun kilidlənməsi prosesi yaxınlarda dayandırılmışdır. Bu, fiemap buferi eyni faylın yaddaşa xəritələnmiş (memory mapped) diapazonu olduğu ssenaridə deadlock-un qarşısını almaq üçün edilmişdir. Bu istifadə halının praktikada faydalı olması çox az ehtimaldır, lakin o, fuzz testləri (syzbot və s.) tərəfindən tetiklənə bilər. Lakin bu dəyişiklik, hazırda boşluq (hole) olan fayl bölgələri üçün delalloc diapazonlarının ötürülməsinə səbəb olan bir yarış vəziyyəti yaratmışdır, buna görə də fiemap çağıran tərəf bəzi fayl bölgələri üçün məlumatların mövcudluğundan xəbərdar olmur. Bu, bəzi istifadə halları üçün kifayət qədər ciddi ola bilər - məsələn, coreutils-in 9.0-dan əvvəlki versiyalarında cp proqramı mənbə faylındakı boşluqları və məlumatları təyin etmək üçün fiemap-dən istifadə edirdi və boşluqları qorumaq üçün yalnız məlumat olan bölgələri (extent-lər və ya delalloc) mənbə faylından hədəf faylına kopyalayırdı (--sparse komanda sətri seçiminin sənədlərinə baxın). Bu o deməkdir ki, əgər cp boşluqda delalloc olan mənbə faylı ilə istifadə edilərsə və aşağıda təsvir olunan yarış vəziyyəti baş verərsə, hədəf faylında həmin məlumatlar itə bilər ki, bu da effektiv olaraq məlumat itkisi problemidir. Yarış vəziyyəti belə baş verir: 1) FIEMAP_FLAG_SYNC bayrağı olmadan, [64M, 65M[ fayl diapazonunda delalloc olan və hazırda boşluq sayılan fayl üçün fiemap çağırılır; 2) Fiemap inode-u paylaşım rejimində kilidləyir, sonra inode-un io ağacında bütün fiemap hədəf diapazonu kilidləmədən fayl extent elementlərini axtarmaq üçün inode-un alt-həcm (subvolume) ağacını iterasiya etməyə başlayır - bu, b0ad381fa769 ("btrfs: fix deadlock with fiemap and extent locking") commit-i ilə gətirilən dəyişiklikdir. Həmin commit-dən sonra o, yalnız boşluq və ya prealloc extent tapdıqda io ağacındakı diapazonları kilidləyir; 3) Qeyd edək ki, fiemap hər bir yarpağı (leaf) istifadə etməzdən əvvəl klonlayır. Bu, inode-un io ağacında fayl diapazonunu kilidləyərkən və fiemap buferi hansısa fayla yaddaş xəritələndirildikdə deadlock-un qarşısını almaq üçündür, çünki btrfs_page_mkwrite() ilə səhifəyə yazmaq səhifənin diapazonu üçün hər hansı nizamlanmış extent-i gözləyəcək və nizamlanmış extent diapazonu kilidləməli olacaq və eyni yarpağı dəyişdirməli ola bilər, bu isə yarpaq üzərində deadlock-a səbəb olur; 4) [64M, 65M[ diapazonundakı boşluğu tapmazdan əvvəl klonlanmış yarpaqdakı fayl extent elementlərini iterasiya edərkən, həmin diapazondakı delalloc flush edilir və onun nizamlanmış extent-i tamamlanır - bu o deməkdir ki, müvafiq fayl extent elementi inode-un alt-həcm ağacında var, lakin fiemap-ın iterasiya etdiyi klonlanmış yarpaqda mövcud deyil; 5) Fiemap klonlanmış yarpaqdakı boşluğu (və ya NO_HOLES funksiyası aktiv olmadıqda disk_bytenr == 0 olan fayl extent elementini) görərək [64M, 65M[ diapazonunda boşluq tapdıqda, o, inode-un io ağacında həmin fayl diapazonunu kilidləyəcək və sonra həmin diapazon üçün io ağacında EXTENT_DELALLOC bitini və nizamlanmış extent-ləri (btrfs_find_delalloc_in_range() vasitəsilə) yoxlayaraq delalloc-u axtaracaq. Lakin o, heç nə tapmır, çünki həmin diapazondakı delalloc artıq flush edilib və nizamlanmış extent tamamlanaraq yox olub - nəticədə fiemap [64M, 65M[ diapazonu üçün delalloc və ya extent olduğunu bildirməyəcək, beləliklə istifadəçi sahəsi (user space) həmin diapazonda boşluq olduğunu düşünərək yanlış yönləndiriləcək. Bu, fstests-in generic/094 test halı ilə sporadik olaraq tetiklənə bilər və çatışmayan extent/delalloc diapazonu haqqında belə hesabat verir: generic/094 2s ... - output mismatch (see /home/fdmanana/git/hub/xfstests/results//generic/094.out.bad) --- tests/generic/094.out 2020-06-10 19:29:03.830519425 +0100 +++ /home/fdmanana/git/hub/xfstests/results//generic/094.out.bad 2024-02-28 11:00:00.381071525 +0000 @@ -1,3 +1,9 @@ QA output created by 094 fiemap run with sync fiemap run without sync +ERROR: couldn't find extent at 7 +map is 'HHDDHPPDPHPH' +logical: [ 5.. 6] phys: ---truncated---
Necə düzəltmək olar
- linux linux_kernel6.6.26, 6.8 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 | 6.6.24 ≤ v < 6.6.26, 6.7.12 ≤ v < 6.8, 6.8, 6.8.1 | 6.6.26, 6.8 |
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.