CVE-2025-37821
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: sched/eevdf: se->slice değerinin U64_MAX olarak ayarlanması ve buna bağlı oluşan çökmenin düzeltilmesi dequeue_entities() fonksiyonunda, bir sched_entity'nin slice değerini U64_MAX olarak ayarlayabilen ve bazen çökmeye yol açan bir kod yolu bulunmaktadır. Sorunlu durum, geciktirilmiş bir grup varlığını sıradan çıkarmak için dequeue_entities() çağrıldığında ve ardından bu varlığın üst varlığının (parent) sıradan çıkarılması geciktirildiğinde ortaya çıkmaktadır. Bu durumda: 1. dequeue_entities() başlangıcındaki if (entity_is_task(se)) else bloğunda, slice değeri cfs_rq_min_slice(group_cfs_rq(se)) olarak ayarlanır. Eğer varlık geciktirilmişse, kuyruğa alınmış görevi yoktur; dolayısıyla cfs_rq_min_slice() U64_MAX döndürür. 2. İlk for_each_sched_entity() döngüsü varlığı sıradan çıkarır. 3. Eğer varlık, üst varlığının tek çocuğuysa, bir sonraki yineleme üst varlığı sıradan çıkarmaya çalışır. 4. Üst varlığın sıradan çıkarılmasının geciktirilmesi gerekiyorsa, ilk for_each_sched_entity() döngüsünden _slice değerini güncellemeden_ çıkar. 5. İkinci for_each_sched_entity() döngüsü, üst varlığın ->slice değerini hala U64_MAX olan kaydedilmiş slice değerine ayarlar. Bu durum, potansiyel olarak felaketle sonuçlanabilecek sonraki hesaplamaları bozar. Canlı sistemlerde gözlemlediğimiz belirtiler şöyledir: 6. update_entity_lag() fonksiyonunda, limit değerini hesaplamak için se->slice kullanılır ve bu da çok büyük bir negatif sayı ile sonuçlanır. 7. limit değeri se->vlag = clamp(vlag, -limit, limit) işleminde kullanılır. limit negatif olduğu için vlag > limit olur ve se->vlag aynı büyük negatif sayıya ayarlanır. 8. place_entity() fonksiyonunda se->vlag ölçeklendirilir; bu durum taşmaya (overflow) neden olur ve başka bir devasa (pozitif veya negatif) sayı üretir. 9. Ayarlanan gecikme se->vruntime değerinden çıkarılır, bu da se->vruntime değerini devasa bir miktarda artırır veya azaltır. 10. pick_eevdf() fonksiyonu entity_eligible()/vruntime_eligible() fonksiyonlarını çağırır; vruntime değeri kuyruktaki diğer vruntimes değerlerinden çok uzak olduğu için bunlar hatalı bir şekilde false döndürür ve (vruntime - cfs_rq->min_vruntime) * load hesaplamasının taşmasına neden olur. 11. Uygun hiçbir varlık bulunamadığından pick_eevdf() NULL döndürür. 12. pick_next_entity() fonksiyonu, pick_eevdf()'den dönen değeri referans göstermeye çalışırken çöker. Core dump dosyalarından drgn ile cfs_rq durumlarının dökümü, belirgin şekilde devasa vruntime aralıkları ve hatalı vlag değerleri göstermiştir; ayrıca canlı sistemlerde se->slice değerinin U64_MAX olarak ayarlandığı izlenmiştir (bu durum genellikle "zararsızdır" çünkü çökmenin gerçekleşmesi için çalışma kuyruğunun geri kalanının belirli bir durumda olması gerekir). Söz konusu sorun, slice değerinin her zaman boş olmayan ilk cfs_rq üzerinden ayarlanmasıyla dequeue_entities() fonksiyonunda düzeltilmiştir.
Nasıl düzeltilir
- linux linux_kernel6.12.29, 6.14.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 | 6.12 ≤ v < 6.12.29, 6.13 ≤ v < 6.14.5, 6.15 | 6.12.29, 6.14.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.