CVE-2021-47209

Yüksek

Açıklama

Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: sched/fair: Ölü görev gruplarının cfs_rq'ları yeniden kazanmasının önlenmesi Kevin, update_blocked_averages() fonksiyonunda bir cfs_rq üzerinde serbest bırakıldıktan sonra kullanım (use-after-free) durumuna işaret eden çökmeler raporlamaktadır. İlk hata ayıklama işlemleri, free_fair_sched_group() içinde kfree()'lenecek olan bir görev grubunda canlı cfs_rq'ların (on_list=1) olduğunu ortaya çıkarmıştır. Ancak bunun nasıl gerçekleştiği belirsizdi. Kullanıcının çekirdek yapılandırması, 'my_q' üyesini doğrudan nesnenin ortasına yerleştiren bir struct sched_entity düzenine yol açmış ve bu da tesadüfen SLUB'ın freelist göstericisi ile çakışmasına neden olmuştur. Bu durum, SLAB_FREELIST_HARDENED'ın freelist gösterici karıştırma işlemiyle birleşince, UAF hatasının hızla başarısız olmasına neden olan #GP şeklinde güvenilir bir erişim ihlaline yol açmıştır. Michal da aynı sorunla karşılaşmış görünmektedir [1]. Kendisi, a7b359fc6a37 ("sched/fair: Correctly insert cfs_rq's to list on unthrottle") commit'inin, artık çalışan görevi olmayan yani ölü olan görev gruplarına da cfs_rq'ları yeniden ekleyerek UAF için ön koşulları oluşturduğunu doğru bir şekilde teşhis etmiştir. Ancak analizi gerçek kök nedeni gözden kaçırmaktadır ve bu durum sadece çökme geri izlemesinden (crash backtrace) görülememektedir; çünkü asıl sorumlu, uygunsuz bir zamanda zamanlayıcı kesintisi aracılığıyla sched_cfs_period_timer() üzerinden çağrılan tg_unthrottle_up() fonksiyonudur. unregister_fair_sched_group(), tüm cfs_rq'ları ölmekte olan görev grubundan ayırdığında, kendisini kesintilere karşı korumaz. Tüm CPU'lar üzerinde döngü yapılırken veya unregister_fair_sched_group() tamamlandıktan ancak görev grubu bağlantısı kesilmeden önce zamanlayıcı kesintisi tetiklenirse, sched_cfs_period_timer() yürütülecek ve görev grupları listesinde ilerleyerek cfs_rq'ların kısıtlamasını kaldırmaya, yani onları ölmekte olan görev grubuna yeniden eklemeye çalışacaktır. Bunlar daha sonra -- free_fair_sched_group() içinde -- hala bağlıyken kfree()'lenecek ve Kevin ile Michal'ın gördüğü hatalara yol açacaktır. Bu yarış durumunu (race condition) düzeltmek için, ölmekte olan görev grubunun önce bağlantısının kesildiğinden emin olunmalıdır. Ancak, aşağıda görülebileceği üzere, kayıt silme ve görev grubu bağlantısını kesme sırasını basitçe değiştirmek yeterli değildir, çünkü eşzamanlı RCU gezginleri bunu hala görebilir: CPU1: CPU2: : timer IRQ: : do_sched_cfs_period_timer(): : : : distribute_cfs_runtime(): : rcu_read_lock(); : : : unthrottle_cfs_rq(): sched_offline_group(): : : walk_tg_tree_from(…,tg_unthrottle_up,…): list_del_rcu(&tg->list); : (1) : list_for_each_entry_rcu(child, &parent->children, siblings) : : (2) list_del_rcu(&tg->siblings); : : tg_unthrottle_up(): unregister_fair_sched_group(): struct cfs_rq *cfs_rq = tg->cfs_rq[cpu_of(rq)]; : : list_del_leaf_cfs_rq(tg->cfs_rq[cpu]); : : : : if (!cfs_rq_is_decayed(cfs_rq) || cfs_rq->nr_running) (3) : list_add_leaf_cfs_rq(cfs_rq); : : : : : : : : : ---kesildi---

ÖnemYüksek
CVSS7.8
İstismar olasılığı—
ÜrünLinux Kernel
Yayın10 Nis 2024
İlk görülme10 Nis 2024

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel5.15.5 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernel5.13 ≤ v < 5.15.55.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.

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-2021-47209 · Linux Kernel · Dark Radar