CVE-2025-68756

Naməlum

Təsvir

Linux nüvəsində aşağıdakı zəiflik aradan qaldırılıb: block: set->tag_list_lock əvəzinə blk_mq_[un]quiesce_tagset() funksiyasında RCU istifadə edin blk_mq_{add,del}_queue_tag_set() funksiyaları növbələri tagset-dən əlavə edir və silir; bu funksiyalar iki və ya daha çox növbə eyni tagset-ə qoşulduqda, tagset və növbələrin paylaşılan (shared) kimi işarələnməsini təmin edir. Başlanğıca tagset paylaşılan olmayan (unshared) kimi başlayır və əlavə edilən növbələrin sayı ikiyə çatdıqda, blk_mq_add_queue_tag_set() onu və ona qoşulmuş bütün növbələri paylaşılan kimi işarələyir. Qoşulmuş növbələrin sayı 1-ə düşdükdə, blk_mq_del_queue_tag_set() həm tagset-i, həm də qalan növbələri paylaşılan olmayan kimi işarələməlidir. Hər iki funksiya BLK_MQ_F_TAG_QUEUE_SHARED bayrağını təyin etməzdən və ya ləğv etməzdən əvvəl tagset-dəki mövcud növbələri dondurmalıdır. Bunu edərkən, hər iki funksiya set->tag_list_lock muteksini saxlayır ki, bu da proses zamanı növbələrin əlavə edilməməsi və ya silinməməsi üçün məqsədəuyğundur. Bu, 98d81f0df70c ("nvme: use blk_mq_[un]quiesce_tagset") commit-i nvme drayverinin fərdi növbələri sakitləşdirmək (quiesce) əvəzinə tagset-i sakitləşdirməsini təmin edənə qədər düzgün işləyirdi. blk_mq_quiesce_tagset() funksiyası bu işi görür və set->tag_list_lock-u saxlayaraq set->tag_list-dəki növbələri sakitləşdirir. Bu, aşağıdakı stek izlərinə malik iki axın arasında qarşılıqlı bloklanmaya (deadlock) səbəb olur: __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 Yuxarıdakı stek izi nvme komandasının vaxtının bitməsini idarə etmək üçün çağırılan nvme_timeout()-u göstərir. Vaxtaşma idarəçisi kontrolleri söndürməyə çalışır və ilk addım olaraq, blk-mq-ya növbə geri çağırma idarəçilərini (callback handlers) çağırmamağı bildirmək üçün blk_mq_quiesce_tagset()-i çağırmalıdır. Axın set->tag_list-dəki növbələri gəzməyə çalışarkən set->tag_list_lock gözləyərək ilişib qalır. Kilid, alt stekdə olan və növbələrdən birinin dondurulmasını gözləyən ikinci axın tərəfindən saxlanılır. Növbənin istifadə sayğacı nvme_timeout() tamamlandıqdan sonra sıfıra düşəcək, lakin axın bu muteksi sonsuz gözləyəcəyi üçün bu baş verməyəcək. Növbəni sakitləşdirməyin ([un]quiescing) yuxuya getməyə ehtiyac duymayan bir əməliyyat olduğu nəzərə alınaraq, blk_mq_[un]quiesce_tagset() set->tag_list_lock götürmək əvəzinə RCU istifadə etsin, blk_mq_{add,del}_queue_tag_set() isə RCU-ya uyğun siyahı əməliyyatlarından istifadə etsin. Həmçinin, blk_mq_del_queue_tag_set() funksiyasındakı INIT_LIST_HEAD(&q->tag_set_list) hissəsi silinsin, çünki siyahı RCU altında gəzildiyi müddətdə onu yenidən başlatmaq olmaz. Silinmiş növbə artıq bir tagset-ə əlavə edilməyəcək/silinməyəcək və RCU lütf dövrünün (grace period) sonunda blk_free_queue() vasitəsilə azad ediləcək.

CiddilikNaməlum
CVSS—
İstismar ehtimalı—
MəhsulLinux
Dərc5 yan 2026
İlk görülmə5 yan 2026

Necə düzəltmək olar

Yeniləyin
  • Linux Linuxca8764c0ea1fb825f17f19704af55e9e02c9f768, 3baeec23a82e7ee9691f434c6ab0ab1387326108, 6e8d363786765a81e35083e0909e076796468edf, ef0cd7b694928573f6569e61c14f5f059253162e, 59e25ef2b413c72da6686d431e7759302cfccafa və ya daha yeni versiya

Təsirlənən məhsullar

MəhsulTəsirlənən versiyalarDüzəldildiyi versiya
Linux Linux98d81f0df70ce6fc48517d938026e3c684b9051a ≤ v < ca8764c0ea1fb825f17f19704af55e9e02c9f768, 98d81f0df70ce6fc48517d938026e3c684b9051a ≤ v < 3baeec23a82e7ee9691f434c6ab0ab1387326108, 98d81f0df70ce6fc48517d938026e3c684b9051a ≤ v < 6e8d363786765a81e35083e0909e076796468edf, 98d81f0df70ce6fc48517d938026e3c684b9051a ≤ v < ef0cd7b694928573f6569e61c14f5f059253162e, 98d81f0df70ce6fc48517d938026e3c684b9051a ≤ v < 59e25ef2b413c72da6686d431e7759302cfccafa, 6.2ca8764c0ea1fb825f17f19704af55e9e02c9f768, 3baeec23a82e7ee9691f434c6ab0ab1387326108, 6e8d363786765a81e35083e0909e076796468edf, ef0cd7b694928573f6569e61c14f5f059253162e, 59e25ef2b413c72da6686d431e7759302cfccafa

Versiyanızı yoxlayın

Məhsulu seçin və istifadə etdiyiniz versiyanı yazın; versiyanın təsirlənən aralıqda olub-olmadığını görün.

Intelligence 360 paketində

Attack Surface Management

Domenlərinizə bağlı aktivləri, onlarda işləyən texnologiyaları və məlum zəiflikləri bir siyahıda görün.

CVE-2025-68756 · Linux · Dark Radar