CVE-2026-64142
Təsvir
Linux nüvəsində aşağıdakı zəiflik aradan qaldırılmışdır: ksmbd: durable scavenger bağlama prosesi m_fp_list axtarışları ilə yarış vəziyyətinə (race condition) səbəb olur ksmbd_durable_scavenger() funksiyası, ksmbd_lookup_fd_inode() (ksmbd_vfs_rename tərəfindən istifadə olunur) və fs/smb/server/smb_common.c faylındakı paylaşım rejimi yoxlamaları daxil olmaqla, f_ci->m_fp_list siyahısını iterasiya edən hər hansı bir walker-ə qarşı iki əlaqəli yarış vəziyyətinə malikdir. (1) fp->node list-head yenidən istifadəsi. Sessiyanın ləğvindən sonra durable-preserve edilmiş handle-lar f_ci->m_fp_list üzərində bağlı qala bilər, beləliklə, handle yenidən qoşula bildiyi müddətcə paylaşım rejimi yoxlamaları onları görməyə davam edir. Scavenger, başlanğıc durable idr-dən çıxardıqdan sonra fp->node-u lokal scavenger_list-ə əlavə etməklə vaxtı keçmiş handle-ları toplayırdı. fp->node m_fp_list tərəfindən istifadə edilən eyni list_head olduğu üçün, list_add(&fp->node, &scavenger_list) çağırışı m_fp_list linklərini overwrite edir və hər iki siyahını korlayır. CONFIG_DEBUG_LIST bunu paylaşım rejimi gəzinti yolunda hesabatlaşdıra bilər. (2) m_fp_list walker-lərinə qarşı refcount yarış vəziyyəti. Scavenger, global_ft.lock altında atomic_read(&fp->refcount) > 1 və fp->conn şərtləri ilə vaxtı keçmiş durable handle-ı təyin edir, fp-ni global_ft-dən silir, sonra fp-ni m_fp_list-dən ayırmazdan və azad etməzdən əvvəl global_ft.lock kilidini buraxır. Bu boşluq ərzində fp hələ də f_state == FP_INITED vəziyyətində m_fp_list-ə bağlıdır. m_lock altında olan ksmbd_lookup_fd_inode() funksiyası ksmbd_fp_get() çağırır (hələ də 1 olan refcount üzərində atomic_inc_not_zero) və aktiv referans götürür; daha sonra scavenger, sahibinin referansa malik olduğu halda fp-ni ayırır və azad edir. Bu, sahibinin növbəti ksmbd_fd_put() çağırışında və ya ksmbd_fp_get() çağırmadan m_fp_list-i iterasiya edən paralel paylaşım rejimi walker-inin yerinə yetirdiyi hər hansı sahə oxumalarında UAF (Use-After-Free) xətasına səbəb olur (smb_check_perm_dleases kimi yollar). Hər ikisi düzəldildi: * fp->node-un scavenger-ə məxsus siyahı nodu kimi yenidən istifadəsinə son qoyuldu. global_ft.lock altında global_ft-dən bir vaxtı keçmiş handle silinir, aşkar müvəqqəti referans götürülür, kilid buraxılır, f_ci->m_lock altında fp->node m_fp_list-dən ayrılır, sonra atomic_sub_and_test(2, &fp->refcount) ilə həm durable ömür, həm də müvəqqəti referanslar buraxılır. Əgər scavenger sonuncu "putter"dirsə, bağlama prosesi orada icra olunur; əks halda, artıq m_fp_list axtarışından keçmiş cari sahib öz ksmbd_fd_put() yolu vasitəsilə yekun bağlama prosesinə sahib olur. Tək-tək utilizasiya, eyni dövrdə çox sayda handle-ın vaxtı bitdikdə durable idr-i yenidən skan edə bilər, lakin durable scavenging fon rejimində işləyən vaxt bitmə yoludur və yekun tam skan növbəti gözləmədən əvvəl min_timeout-u yenidən hesablayır. * __ksmbd_remove_durable_fd() daxilində idr_remove()-dan dərhal sonra fp->persistent_id təmizlənir, beləliklə, fp-ni əldə etmiş sahibdən gələn gecikmiş yekun bağlama prosesi, ksmbd_open_durable_fd()-dəki idr_alloc_cyclic() tərəfindən artıq tamamilə yeni bir durable handle-a verilmiş ola biləcək persistent id üzərində yenidən idr_remove() çağırmır. * fp hər hansı sessiya cədvəlindən ayrıldıqda (durable preserve zamanı session_fd_check() tərəfindən fp->conn təmizlənir — unpublish zamanı volatile_id təmizlənməsi ilə birlikdə, buna görə yalnız fp->conn-un yoxlanılması kifayətdir), __put_fd_put() funksiyasındakı hər bağlantıya aid open_files_count azalma prosesi bypass edilir. Yekun bağlama prosesinə sahib olan walker, bu durable fp-ni heç vaxt izləməyən əlaqəsiz bir work->conn-dan işləyir; bu qoruma olmadan sahib həmin əlaqəsiz sayğacı underflow edərdi. İki yarış vəziyyəti bir yamada birləşdirilib, çünki yalnız yamama (1) korlanmış siyahını təmizləyir, lakin m_fp_list walker-ləri üçün deterministik UAF pəncərəsi saxlayır ki, bu da (2)-dəki müvəqqəti referans və persistent_id intizamı ilə bağlanır; orta vəziyyətə bisekt etmək, yamadan əvvəlki xaosun sadəcə daha az təkrar olunan etdiyi bir UAF-a gətirib çıxarardı. Doğrulama: * list_head yenidən istifadə yolu üçün CONFIG_DEBUG_LIST əhatəsi. * KASAN aktiv edilmiş birbaşa SMB2 durable-handle əhatəsi; burada paralel rename axtarışları zamanı durable handle-ların vaxtı bitdiyi halda ksmbd_durable_scavenger() və NULL olmayan ksmbd_lookup_fd_inode() geri dönüşləri sınaqdan keçirilmişdir və heç bir KASAN, UAF, siyahı korlanması, ODEBUG və ya WARNING hesabatı alınmamışdır.
Necə düzəltmək olar
- linux linux_kernel6.12.92, 6.18.34, 7.0.11 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.11 ≤ v < 6.12.92, 6.13 ≤ v < 6.18.34, 6.19 ≤ v < 7.0.11, 7.1 | 6.12.92, 6.18.34, 7.0.11 |
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.