CVE-2026-64142
Açıklama
Linux çekirdeğinde aşağıdaki güvenlik açığı giderilmiştir: ksmbd: dayanıklı temizleyici kapatma işlemi m_fp_list aramalarıyla yarış durumuna giriyor ksmbd_durable_scavenger(), ksmbd_lookup_fd_inode() (ksmbd_vfs_rename tarafından kullanılır) ve fs/smb/server/smb_common.c içindeki paylaşım modu kontrolleri dahil olmak üzere f_ci->m_fp_list üzerinde yineleme yapan herhangi bir yürütücüye karşı iki ilgili yarış durumuna sahiptir. (1) fp->node list-head yeniden kullanımı. Dayanıklılığı korunan tutamaçlar, oturum sonlandırmasından sonra f_ci->m_fp_list üzerinde bağlı kalabilir, böylece tutamaç yeniden bağlanabilir durumdayken paylaşım modu kontrolleri bunları görmeye devam eder. Temizleyici, süresi dolmuş tutamaçları küresel durable idr'den kaldırdıktan sonra fp->node'u yerel bir scavenger_list'e ekleyerek topluyordu. fp->node, m_fp_list tarafından kullanılan aynı list_head olduğu için, list_add(&fp->node, &scavenger_list) işlemi m_fp_list bağlantılarının üzerine yazar ve her iki listeyi de bozar. CONFIG_DEBUG_LIST bunu paylaşım modu yürütme yolunda raporlayabilir. (2) m_fp_list yürütücülerine karşı referans sayacı (Refcount) yarışı. Temizleyici, global_ft.lock altında atomic_read(&fp->refcount) > 1 ve fp->conn ile süresi dolmuş bir dayanıklı tutamacı nitelendirir, fp'yi global_ft'den kaldırır ve ardından fp'yi m_fp_list'ten ayırıp serbest bırakmadan önce global_ft.lock kilidini bırakır. Bu boşluk sırasında fp, f_state == FP_INITED durumuyla hala m_fp_list'e bağlıdır. m_lock altındaki ksmbd_lookup_fd_inode(), ksmbd_fp_get() fonksiyonunu çağırır (hala 1 olan referans sayacı üzerinde atomic_inc_not_zero yapar) ve canlı bir referans alır; daha sonra temizleyici, referansa sahip olan kişi varken fp'yi ayırır ve serbest bırakır. Bu durum, sahibinin sonraki ksmbd_fd_put() işleminde ve ksmbd_fp_get() almadan m_fp_list üzerinde yineleme yapan eşzamanlı bir paylaşım modu yürütücüsü tarafından gerçekleştirilen herhangi bir alan okumasında serbest bırakıldıktan sonra kullanım (UAF) hatasına yol açar. Her ikisi de şu şekilde düzeltildi: * fp->node'un temizleyiciye özel bir liste düğümü olarak yeniden kullanılması durduruldu. global_ft.lock altında global_ft'den tek bir süresi dolmuş tutamaç kaldırılır, açık bir geçici referans alınır, kilit bırakılır, f_ci->m_lock altında fp->node m_fp_list'ten ayrılır ve ardından hem dayanıklı yaşam süresi hem de geçici referanslar atomic_sub_and_test(2, &fp->refcount) ile bırakılır. Eğer temizleyici son bırakan ise kapatma işlemi orada çalışır; aksi takdirde, m_fp_list aramasında zaten yarışmış olan mevcut bir sahip, kendi ksmbd_fd_put() yolu aracılığıyla nihai kapatmaya sahip olur. Teker teker imha işlemi, aynı geçişte birden fazla tutamacın süresi dolduğunda dayanıklı idr'yi yeniden tarayabilir ancak dayanıklı temizleme arka plan tabanlı bir süre aşımı yoludur ve nihai tam tarama, bir sonraki beklemeden önce min_timeout değerini yeniden hesaplar. * __ksmbd_remove_durable_fd() içinde idr_remove()'dan hemen sonra fp->persistent_id temizlenir; böylece fp'yi kapmış bir sahibin gecikmiş nihai kapatma işlemi, ksmbd_open_durable_fd() içindeki idr_alloc_cyclic() tarafından halihazırda yepyeni bir dayanıklı tutamaca verilmiş olabilecek kalıcı bir kimlik üzerinde tekrar idr_remove() çağırmaz. * fp herhangi bir oturum tablosundan ayrıldığında (dayanıklı koruma sırasında session_fd_check() tarafından fp->conn temizlenir), __put_fd_final() içindeki bağlantı başına open_files_count azaltma işlemi baypas edilir. Nihai kapatmaya sahip olan yürütücü, bu dayanıklı fp'yi hiçbir zaman takip etmemiş ilgisiz bir work->conn üzerinden çalışır; bu koruma olmadan sahibi, o ilgisiz sayacı negatif değere düşürürdü. İki yarış durumu tek bir yamada birleştirilmiştir çünkü yalnızca yama (1), bozulmuş listeyi temizler ancak m_fp_list yürütücüleri için deterministik bir UAF penceresi bırakır; bu pencere (2)'deki geçici referans ve persistent_id disiplini ile kapatılmıştır. Ara bir durumda bölme (bisecting) yapmak, yama öncesi kaosun sadece daha az yeniden üretilebilir hale getirdiği bir UAF sonucunu doğururdu. Doğrulama: * list_head yeniden kullanım yolu için CONFIG_DEBUG_LIST kapsamı. * Eşzamanlı yeniden adlandırma aramaları altında dayanıklı tutamaçların süresi dolarken ksmbd_durable_scavenger() işlemini ve NULL olmayan ksmbd_lookup_fd_inode() dönüşlerini çalıştıran, KASAN etkin doğrudan SMB2 dayanıklı tutamaç kapsamı; herhangi bir KASAN, UAF, liste bozulması, ODEBUG veya WARNING raporu alınmamıştır.
Nasıl düzeltilir
- linux linux_kernel6.12.92, 6.18.34, 7.0.11 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| 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 |
Sürümünüzü kontrol edin
Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.
Attack Surface Management
Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.