CVE-2024-47741
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılıb: btrfs: eyni fd istifadə edilərək paralel lseek zamanı faylın private parametrinin təyin edilməsindəki yarış vəziyyətinin (race condition) düzəldilməsi Eyni prosesə aid çox saylı thread-lərdən istifadə etməklə, eyni fayl deskriptoru üzərində paralel lseek(2) sistem çağırışları yerinə yetirilərkən, yarış vəziyyətinin baş verdiyi və yaddaş sızmasına (memory leak) səbəb ola biləcək qısa bir zaman pəncərəsi mövcuddur. Yarış vəziyyəti bu şəkildə baş verir: 1) Proqram fayl üçün fayl deskriptoru açır və sonra iki thread yaradır (məsələn, pthreads kitabxanası ilə), onları tapşırıq A və tapşırıq B adlandıraq; 2) Tapşırıq A, SEEK_DATA və ya SEEK_HOLE ilə lseek çağırır və inode üzərində oxuma kilidini saxlayarkən file.c:find_desired_extent() funksiyasına çatır; 3) find_desired_extent() funksiyasının əvvəlində o, faylın private_data göstəricisini 'private' adlı lokal dəyişənə çıxarır ki, bunun dəyəri NULL-dur; 4) Tapşırıq B də SEEK_DATA və ya SEEK_HOLE ilə lseek çağırır, inode-u paylaşım rejimində kilidləyir və file.c:find_desired_extent() funksiyasına daxil olur, burada o da file->private_data-nı öz lokal 'private' dəyişəninə çıxarır və onun dəyəri NULL olur; 5) Faylın private dəyərinin NULL olduğunu gördüyü üçün tapşırıq A private strukturunu ayırır (allocate) və onu fayl strukturuna təyin edir; 6) Tapşırıq B də faylın private dəyərinin NULL olduğunu görmüşdü, buna görə də o da öz private strukturunu ayırır və hər iki tapşırıq eyni fayl deskriptorundan istifadə etdiyi üçün onu eyni fayl strukturuna təyin edir. Bu nöqtədə tapşırıq A tərəfindən ayrılmış private strukturu sızır. Yaddaş sızmasından əlavə, hər iki tapşırıq private strukturundakı eyni keşlənmiş vəziyyət yazısından (struct btrfs_file_private::llseek_cached_state) istifadə edirlər. Bu, use-after-free probleminə səbəb ola bilər, çünki bir tapşırıq digəri hələ də istifadə edərkən onu azad edə bilər (yalniz bir tapşırıq onun üzərində istinad sayını artırmışdı). Həmçinin, keşlənmiş vəziyyətin paylaşılması yaxşı ideya deyil, çünki bu gələcəkdə yanlış nəticələrə səbəb ola bilər - hazırda bu problem olmamalıdır, çünki o, yalnız extent-io-tree.c:count_range_bits() funksiyasında istifadə olunur və biz keşlənmiş vəziyyətdən istifadə etməzdən əvvəl diapazon validasiyasını həyata keçiririk. Bu problem, inode-un spinlock-unu saxlayaraq faylın private təyinatını və yoxlamasını qorumaqla və private-ı ayıran tapşırığı izləməklə düzəldilir. Beləliklə, keşlənmiş vəziyyət yazısı ilə bağlı use-after-free problemlərinin qarşısını almaq və gələcəkdə potensial yanlış istifadəni önləmək üçün həmin struktur yalnız həmin tapşırıq tərəfindən istifadə olunacaq.
Necə düzəltmək olar
- linux linux_kernel6.6.54, 6.10.13, 6.11.2 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.2 ≤ v < 6.6.54, 6.7 ≤ v < 6.10.13, 6.11 ≤ v < 6.11.2 | 6.6.54, 6.10.13, 6.11.2 |
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.