CVE-2024-50106
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: nfsd: laundromat ve free_stateid arasındaki yarış durumu düzeltildi İptal edilen delegasyonların laundromat tarafından işlenmesi ile bir istemcinin gönderdiği free_stateid işlemi arasında bir yarış durumu bulunmaktadır. Laundromat iş parçacığı, delegasyonun süresinin dolduğunu ve iptal edilmesi gerektiğini tespit eder; bu nedenle delegasyon stid değerini iptal edilmiş olarak işaretler ve onu bir reaper listesine ekler ancak ardından state kilidini kaldırır ve asıl delegasyon iptali kilit olmadan gerçekleşir. stid iptal edildi olarak işaretlendiğinde, eşzamanlı çalışan bir free_stateid işleme iş parçacığı şunları yapar: (1) onu reaper listesinden kaldıran list_del_init() fonksiyonunu çağırır ve (2) delegasyon stid yapısını serbest bırakır. Laundromat iş parçacığı, bu belirli delegasyon için revoke_delegation() fonksiyonunu çağırmamış olur, bu da dosya üzerinde mevcut olan kilit kiralamasının (lock lease) serbest bırakılmayacağı anlamına gelir. Ardından, bu dosya için yeni bir open isteği geldiğinde kira listesinin boş olmadığını tespit eder ve serbest bırakılmış bir delegasyon stateid değerine erişmeye çalışan nfsd_breaker_owns_lease() fonksiyonunu çağırır. Bu durum, aşağıdaki serbest bırakıldıktan sonra kullanım (use-after-free) KASAN uyarısına yol açar: kernel: ================================================================== kernel: BUG: KASAN: slab-use-after-free in nfsd_breaker_owns_lease+0x140/0x160 [nfsd] kernel: Read of size 8 at addr ffff0000e73cd0c8 by task nfsd/6205 kernel: kernel: CPU: 2 UID: 0 PID: 6205 Comm: nfsd Kdump: loaded Not tainted 6.11.0-rc7+ #9 kernel: Hardware name: Apple Inc. Apple Virtualization Generic Platform, BIOS 2069.0.0.0.0 08/03/2024 kernel: Call trace: kernel: dump_backtrace+0x98/0x120 kernel: show_stack+0x1c/0x30 kernel: dump_stack_lvl+0x80/0xe8 kernel: print_address_description.constprop.0+0x84/0x390 kernel: print_report+0xa4/0x268 kernel: kasan_report+0xb4/0xf8 kernel: __asan_report_load8_noabort+0x1c/0x28 kernel: nfsd_breaker_owns_lease+0x140/0x160 [nfsd] kernel: nfsd_file_do_acquire+0xb3c/0x11d0 [nfsd] kernel: nfsd_file_acquire_opened+0x84/0x110 [nfsd] kernel: nfs4_get_vfs_file+0x634/0x958 [nfsd] kernel: nfsd4_process_open2+0xa40/0x1a40 [nfsd] kernel: nfsd4_open+0xa08/0xe80 [nfsd] kernel: nfsd4_proc_compound+0xb8c/0x2130 [nfsd] kernel: nfsd_dispatch+0x22c/0x718 [nfsd] kernel: svc_process_common+0x8e8/0x1960 [sunrpc] kernel: svc_process+0x3d4/0x7e0 [sunrpc] kernel: svc_handle_xprt+0x828/0xe10 [sunrpc] kernel: svc_recv+0x2cc/0x6a8 [sunrpc] kernel: nfsd+0x270/0x400 [nfsd] kernel: kthread+0x288/0x310 kernel: ret_from_fork+0x10/0x20 Bu yama, laundromat ile diğer işlemler (nfsd4_free_stateid() ve nfsd4_delegreturn()) arasındaki koordinasyona yardımcı olacak iki yeni ek stid sc_status değeri eklenmesine dayalı bir çözüm önermektedir. Öncelikle, stid iptal edildi olarak işaretlendikten sonra nfsd4_free_stateid() tarafından kaldırılmadığından emin olmak için laundromat, stateid üzerinde bir referans alır. Ardından, stid'nin cl_revoked listesine eklenip eklenmediğini veya FREE_STATEID işleminin yürütüldüğünü ve listeden kaldırılması gerektiğini koordine etmek için her işlem bu durumu kontrol eder ve buna göre hareket eder. Eğer laundromat, FREE_STATEID gelmeden önce cl_revoke listesine ekleme yapmışsa, nfsd4_free_stateid() bunu listeden kaldırması gerektiğini bilir. Eğer nfsd4_free_stateid() işlemin laundromat tarafından cl_revoke listesine yerleştirilmesinden önce geldiğini tespit ederse, durumu serbest bırakıldı (freed) olarak işaretler ve böylece laundromat artık onu listeye eklemez. Ayrıca, nfsd4_delegreturn() için belirtilen stid aranırken, kaldırılmış veya serbest bırakılabilir olarak işaretlenen stid'lere erişmemiz gerekir; bu, laundromat'ın işlemi başlatmış olduğu ancak henüz bitirmediği anlamına gelir ve bu delegreturn işleminin nfserr_bad_stateid değil, nfserr_deleg_revoked döndürmesi gerekir. İkincisi bir FREE_STATEID tetiklemeyecek ve bunun eksikliği, söz konusu stid'nin süresiz olarak cl_revoked listesinde kalmasına neden olacaktır.
Nasıl düzeltilir
- linux linux_kernel6.11.6 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 | 3.17 ≤ v < 6.11.6, 6.12 | 6.11.6 |
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.