CVE-2025-37772

Orta

Açıklama

Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: RDMA/cma: cma_netevent_work_handler içerisindeki workqueue çökmesi düzeltildi struct rdma_cm_id yapısı, cma_netevent_work_handler() fonksiyonlarını cma_wq üzerine kuyruğa eklemek için yeniden kullanılan "struct work_struct net_work" üyesine sahiptir. Eğer cma_netevent_callback() fonksiyonuna kısa süre içinde birden fazla çağrı yapılırsa, aynı rdma_cm_id için daha fazla cma_netevent_work_handler() kuyruğa eklenir ve bu durum, çalıştırılmak üzere planlanmış olan önceki kuyruk öğelerini (work-item) geçersiz kılar. Diğer bir ifadeyle, iki ardışık cma_netevent_callback() çağrısı arasında kuyruktaki iş öğesinin çalışacağının garantisi yoktur ve kuyruğa ekleme sırasında id_table_lock alınmasına rağmen, ikinci INIT_WORK işlemi birinci iş öğesini (aynı rdma_cm_id için) geçersiz kılacaktır. Ayrıca drgn analizi [2], iş öğesinin muhtemelen geçersiz kılındığını göstermektedir. Bu sorun, mevcut herhangi bir queue_work() veya onun çalışan iş parçacığıyla yarış durumuna (race condition) girmemesi için INIT_WORK() işleminin __rdma_create_id() fonksiyonuna taşınmasıyla düzeltilmiştir. [1] Kırpılmış çökme yığını: ============================================= BUG: kernel NULL pointer dereference, address: 0000000000000008 kworker/u256:6 ... 6.12.0-0... Workqueue: cma_netevent_work_handler [rdma_cm] (rdma_cm) RIP: 0010:process_one_work+0xba/0x31a Call Trace: worker_thread+0x266/0x3a0 kthread+0xcf/0x100 ret_from_fork+0x31/0x50 ret_from_fork_asm+0x1a/0x30 ============================================= [2] drgn çökme analizi: >>> trace = prog.crashed_thread().stack_trace() >>> trace (0) crash_setup_regs (./arch/x86/include/asm/kexec.h:111:15) (1) __crash_kexec (kernel/crash_core.c:122:4) (2) panic (kernel/panic.c:399:3) (3) oops_end (arch/x86/kernel/dumpstack.c:382:3) ... (8) process_one_work (kernel/workqueue.c:3168:2) (9) process_scheduled_works (kernel/workqueue.c:3310:3) (10) worker_thread (kernel/workqueue.c:3391:4) (11) kthread (kernel/kthread.c:389:9) Bu kernel versiyonu için workqueue.c:3168 satırı process_one_work() içerisindedir: 3168 strscpy(worker->desc, pwq->wq->name, WORKER_DESC_LEN); >>> trace[8]["work"] *(struct work_struct *)0xffff92577d0a21d8 = { .data = (atomic_long_t){ .counter = (s64)536870912, <=== Not }, .entry = (struct list_head){ .next = (struct list_head *)0xffff924d075924c0, .prev = (struct list_head *)0xffff924d075924c0, }, .func = (work_func_t)cma_netevent_work_handler+0x0 = 0xffffffffc2cec280, } Şüphe, pwq değerinin NULL olduğudur: >>> trace[8]["pwq"] (struct pool_workqueue *)<absent> process_one_work() içerisinde, pwq şu şekilde atanır: struct pool_workqueue *pwq = get_work_pwq(work); ve get_work_pwq() şöyledir: static struct pool_workqueue *get_work_pwq(struct work_struct *work) { unsigned long data = atomic_long_read(&work->data); if (data & WORK_STRUCT_PWQ) return work_struct_pwq(data); else return NULL; } WORK_STRUCT_PWQ değeri 0x4'tür: >>> print(repr(prog['WORK_STRUCT_PWQ'])) Object(prog, 'enum work_flags', value=4) Ancak work->data değeri 0x20000000 olan 536870912'dir. Bu nedenle, get_work_pwq() NULL döndürür ve process_one_work() içerisinde çökme meydana gelir: 3168 strscpy(worker->desc, pwq->wq->name, WORKER_DESC_LEN); =============================================

ÖnemOrta
CVSS5.5
İstismar olasılığı—
ÜrünLinux Kernel
Yayın1 May 2025
İlk görülme1 May 2025

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel6.1.135, 6.6.88, 6.12.25, 6.14.4 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernel6.0 ≤ v < 6.1.135, 6.2 ≤ v < 6.6.88, 6.7 ≤ v < 6.12.25, 6.13 ≤ v < 6.14.4, 6.156.1.135, 6.6.88, 6.12.25, 6.14.4
debian debian_linux11.0—

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.

Intelligence 360 paketinde

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.

CVE-2025-37772 · Linux Kernel · Dark Radar