CVE-2025-68756

Belirsiz

Açıklama

Linux kernel'de aşağıdaki güvenlik açığı giderilmiştir: block: blk_mq_[un]quiesce_tagset() fonksiyonunda set->tag_list_lock yerine RCU kullanımı blk_mq_{add,del}_queue_tag_set() fonksiyonları, kuyrukları tagset üzerinden ekler ve kaldırır; bu fonksiyonlar, iki veya daha fazla kuyruk aynı tagset'e bağlandığında tagset ve kuyrukların paylaşımlı olarak işaretlenmesini sağlar. Başlangıçta bir tagset paylaşılmayan (unshared) olarak başlar ve eklenen kuyruk sayısı ikiye ulaştığında, blk_mq_add_queue_tag_set() bunu kendisine bağlı tüm kuyruklarla birlikte paylaşımlı olarak işaretler. Bağlı kuyruk sayısı 1'e düştüğünde ise blk_mq_del_queue_tag_set()'in hem tagset'i hem de kalan kuyrukları paylaşılmayan olarak işaretlemesi gerekir. Her iki fonksiyon da BLK_MQ_F_TAG_QUEUE_SHARED bayrağını ayarlamadan veya kaldırmadan önce tagset içindeki mevcut kuyrukları dondurmalıdır. Bunu yaparken her iki fonksiyon da set->tag_list_lock mutex'ini tutar; bu durum, işlem sırasında kuyrukların eklenmesini veya silinmesini istemediğimiz için mantıklıdır. Bu yapı, nvme sürücüsünün bireysel kuyrukları dondurmak yerine tagset'i dondurduğu 98d81f0df70c ("nvme: use blk_mq_[un]quiesce_tagset") commit'ine kadar sorunsuz çalışıyordu. blk_mq_quiesce_tagset() işlemi gerçekleştirir ve set->tag_list_lock'u tutarken set->tag_list içindeki kuyrukları dondurur. Bu durum, şu yığın izlerine sahip iki iş parçacığı arasında ölü kilide (deadlock) yol açar: __schedule+0x47c/0xbb0 ? timerqueue_add+0x66/0xb0 schedule+0x1c/0xa0 schedule_preempt_disabled+0xa/0x10 __mutex_lock.constprop.0+0x271/0x600 blk_mq_quiesce_tagset+0x25/0xc0 nvme_dev_disable+0x9c/0x250 nvme_timeout+0x1fc/0x520 blk_mq_handle_expired+0x5c/0x90 bt_iter+0x7e/0x90 blk_mq_queue_tag_busy_iter+0x27e/0x550 ? __blk_mq_complete_request_remote+0x10/0x10 ? __blk_mq_complete_request_remote+0x10/0x10 ? __call_rcu_common.constprop.0+0x1c0/0x210 blk_mq_timeout_work+0x12d/0x170 process_one_work+0x12e/0x2d0 worker_thread+0x288/0x3a0 ? rescuer_thread+0x480/0x480 kthread+0xb8/0xe0 ? kthread_park+0x80/0x80 ret_from_fork+0x2d/0x50 ? kthread_park+0x80/0x80 ret_from_fork_asm+0x11/0x20 __schedule+0x47c/0xbb0 ? xas_find+0x161/0x1a0 schedule+0x1c/0xa0 blk_mq_freeze_queue_wait+0x3d/0x70 ? destroy_sched_domains_rcu+0x30/0x30 blk_mq_update_tag_set_shared+0x44/0x80 blk_mq_exit_queue+0x141/0x150 del_gendisk+0x25a/0x2d0 nvme_ns_remove+0xc9/0x170 nvme_remove_namespaces+0xc7/0x100 nvme_remove+0x62/0x150 pci_device_remove+0x23/0x60 device_release_driver_internal+0x159/0x200 unbind_store+0x99/0xa0 kernfs_fop_write_iter+0x112/0x1e0 vfs_write+0x2b1/0x3d0 ksys_write+0x4e/0xb0 do_syscall_64+0x5b/0x160 entry_SYSCALL_64_after_hwframe+0x4b/0x53 Üstteki yığın izi, nvme komut zaman aşımını yönetmek için çağrılan nvme_timeout() fonksiyonunu göstermektedir. Zaman aşımı yöneticisi denetleyiciyi devre dışı bırakmaya çalışmaktadır ve ilk adım olarak, blk-mq'ya kuyruk geri çağırma yöneticilerini çağırmamasını söylemek için blk_mq_quiesce_tagset() işlemini gerçekleştirmesi gerekmektedir. İş parçacığı, set->tag_list içindeki kuyruklarda gezinmeye çalışırken set->tag_list_lock bekleyerek takılı kalır. Kilit, alttaki yığındaki ikinci iş parçacığı tarafından tutulmaktadır ve bu iş parçacığı kuyruklardan birinin dondurulmasını beklemektedir. Kuyruk kullanım sayacı nvme_timeout() tamamlandıktan sonra sıfıra düşecektir ancak iş parçacığı bu mutex'i sonsuza dek bekleyeceğinden bu gerçekleşmeyecektir. Kuyruğun dondurulmasının ([un]quiescing) uyku moduna geçmeyi gerektirmeyen bir işlem olduğu göz önüne alındığında, blk_mq_[un]quiesce_tagset() fonksiyonu set->tag_list_lock almak yerine RCU kullanacak şekilde güncellenmiş, blk_mq_{add,del}_queue_tag_set() fonksiyonları ise RCU güvenli liste işlemleri kullanacak şekilde güncellenmiştir. Ayrıca, liste RCU altında gezilirken yeniden başlatılamayacağı için blk_mq_del_queue_tag_set() içerisindeki INIT_LIST_HEAD(&q->tag_set_list) ifadesi silinmiştir. Silinen kuyruk bir tagset'e eklenmeyecek/buradan çıkarılmayacak ve RCU zarafet süresinin sonunda blk_free_queue() ile serbest bırakılacaktır.

ÖnemBelirsiz
CVSS—
İstismar olasılığı—
ÜrünLinux
Yayın5 Oca 2026
İlk görülme5 Oca 2026

Nasıl düzeltilir

Güncelleyin
  • Linux Linuxca8764c0ea1fb825f17f19704af55e9e02c9f768, 3baeec23a82e7ee9691f434c6ab0ab1387326108, 6e8d363786765a81e35083e0909e076796468edf, ef0cd7b694928573f6569e61c14f5f059253162e, 59e25ef2b413c72da6686d431e7759302cfccafa ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
Linux Linux98d81f0df70ce6fc48517d938026e3c684b9051a ≤ v < ca8764c0ea1fb825f17f19704af55e9e02c9f768, 98d81f0df70ce6fc48517d938026e3c684b9051a ≤ v < 3baeec23a82e7ee9691f434c6ab0ab1387326108, 98d81f0df70ce6fc48517d938026e3c684b9051a ≤ v < 6e8d363786765a81e35083e0909e076796468edf, 98d81f0df70ce6fc48517d938026e3c684b9051a ≤ v < ef0cd7b694928573f6569e61c14f5f059253162e, 98d81f0df70ce6fc48517d938026e3c684b9051a ≤ v < 59e25ef2b413c72da6686d431e7759302cfccafa, 6.2ca8764c0ea1fb825f17f19704af55e9e02c9f768, 3baeec23a82e7ee9691f434c6ab0ab1387326108, 6e8d363786765a81e35083e0909e076796468edf, ef0cd7b694928573f6569e61c14f5f059253162e, 59e25ef2b413c72da6686d431e7759302cfccafa

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-68756 · Linux · Dark Radar