CVE-2025-38261
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: riscv: geçişler sırasında SR_SUM durumunu kaydet İş parçacıkları/görevler değiştirildiğinde, eski yürütmenin SR_SUM durumunun kaydedildiğinden ve yeni iş parçacığının eski SR_SUM durumunun geri yüklendiğinden emin olmamız gerekir. Sorun, özellikle syz-stress aracı çalışırken ağır yük altında görülmüş ve schedule_tail fonksiyonunda şu çökmelere neden olmuştur: Unable to handle kernel access to user memory without uaccess routines at virtual address 000000002749f0d0 Oops [#1] Modules linked in: CPU: 1 PID: 4875 Comm: syz-executor.0 Not tainted 5.12.0-rc2-syzkaller-00467-g0d7588ab9ef9 #0 Hardware name: riscv-virtio,qemu (DT) epc : schedule_tail+0x72/0xb2 kernel/sched/core.c:4264 ra : task_pid_vnr include/linux/sched.h:1421 [inline] ra : schedule_tail+0x70/0xb2 kernel/sched/core.c:4264 epc : ffffffe00008c8b0 ra : ffffffe00008c8ae sp : ffffffe025d17ec0 gp : ffffffe005d25378 tp : ffffffe00f0d0000 t0 : 0000000000000000 t1 : 0000000000000001 t2 : 00000000000f4240 s0 : ffffffe025d17ee0 s1 : 000000002749f0d0 a0 : 000000000000002a a1 : 0000000000000003 a2 : 1ffffffc0cfac500 a3 : ffffffe0000c80cc a4 : 5ae9db91c19bbe00 a5 : 0000000000000000 a6 : 0000000000f00000 a7 : ffffffe000082eba s2 : 0000000000040000 s3 : ffffffe00eef96c0 s4 : ffffffe022c77fe0 s5 : 0000000000004000 s6 : ffffffe067d74e00 s7 : ffffffe067d74850 s8 : ffffffe067d73e18 s9 : ffffffe067d74e00 s10: ffffffe00eef96e8 s11: 000000ae6cdf8368 t3 : 5ae9db91c19bbe00 t4 : ffffffc4043cafb2 t5 : ffffffc4043cafba t6 : 0000000000040000 status: 0000000000000120 badaddr: 000000002749f0d0 cause: 000000000000000f Call Trace: [<ffffffe00008c8b0>] schedule_tail+0x72/0xb2 kernel/sched/core.c:4264 [<ffffffe000005570>] ret_from_exception+0x0/0x14 Dumping ftrace buffer: (ftrace buffer empty) ---[ end trace b5f8f9231dc87dda ]--- Sorun, schedule_tail (kernel/sched/core.c) içerisindeki put_user() fonksiyonunun şunları yapmasından kaynaklanmaktadır: asmlinkage __visible void schedule_tail(struct task_struct *prev) { ... if (current->set_child_tid) put_user(task_pid_vnr(current), current->set_child_tid); ... } put_user() makrosu, kod dizisinin şu şekilde oluşmasına neden olur: 1: __enable_user_access() 2: reg = task_pid_vnr(current); 3: *current->set_child_tid = reg; 4: __disable_user_access() Buradaki sorun, argüman olarak uykuya dalabilen bir fonksiyonun bulunabilmesi ve bunun SR_SUM değerini temizleyerek yukarıdaki paniğe yol açabilmesidir. Bu durum, 285a76bb2cf5 ("riscv: evaluate put_user() arg before enabling user access") commit'i ile put_user() makrosunun argümanı kullanıcı erişimi etkinleştirilen bölümün dışında değerlendirilerek düzeltilmiştir. riscv'nin unsafe_get/put_XXX() makrolarından yararlanabilmesi ve put_user() ile uykuya dalan fonksiyonlar arasında yaşadığımız aynı sorundan kaçınmak için, kod akışının SR_SUM etkinken bir bölgeden switch_to() üzerinden geçebildiğinden ve hala SR_SUM etkinken geri dönebildiğinden emin olmalıyız. Bu yama, her erişimde bir CSR bit değiştirme maliyeti ödemeye gerek kalmadan unsafe_get/put_XXX() makrolarının tam kullanımını sağlamak amacıyla problemi gidermektedir. switch_to() fonksiyonuna SR_SUM'ı kaydetme ve geri yükleme özelliği eklenmiştir.
Nasıl düzeltilir
- linux linux_kernel6.15.5 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 | 4.15 ≤ v < 6.15.5 | 6.15.5 |
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.