CVE-2025-37988

Yüksək

Təsvir

Linux nüvəsində aşağıdakı zəiflik aradan qaldırılmışdır: do_move_mount() tərəfindən idarə olunan MNT_TREE_BENEATH prosesində bir neçə yarış vəziyyəti (race condition) düzəldildi. Normalda do_lock_mount(path, _) funksiyası *path tərəfindən sabitlənmiş mount nöqtəsini kilidləyir və uyğun unlock_mount() həmin yeri kiliddən azad etdiyi zaman o, hələ də eyni obyekt tərəfindən sabitlənmiş olur. Təəssüf ki, 'beneath' halı üçün bu artıq o qədər sadə deyil - kilidlənən obyekt *path-in göstərdiyi obyekt deyil. Bu, path->mnt-nin mount nöqtəsidir. Problem ondadır ki, kifayət qədər kilidləmə olmadan ->mnt_parent bizə məlum olmadan dəyişə bilər və həmin anda heç bir kilid saxlanılmır. Qaydalar belədir: * mount_lock istənilən mount m üçün m->mnt_parent-i sabitləşdirir. * namespace_sem, m mount edildiyi təqdirdə m->mnt_parent-i sabitləşdirir. * yuxarıdakılardan biri ödənsə və m-in refcount-u müsbətdirsə, m->mnt_parent-in refcount-u üçün də eynisi təmin edilir. namespace_sem, inode_lock() daxilində yerləşir, buna görə də do_lock_mount() namespace_sem-i götürməzdən əvvəl inode_lock()-u götürməlidir. O, namespace_sem aldıqdan sonra path->mnt-nin hələ də eyni yerdə mount edilib-edilmədiyini yenidən yoxlayır və dentry-ni sabitləməyə diqqət yetirir. Bu lazımdır, çünki əks halda biz kilidləri alarkən paralel olaraq mount --move (və ya umount) baş verə bilərdi; bu halda dentry artıq mount nöqtəsi olmazdı və yaddaş təzyiqi ilə birlikdə öz inode-u ilə bərabər silinə bilərdi - bu, həmin inode üzərində kilid götürərkən istənilən bir şey deyil. Lakin, dentry-ni sabitləmək kifayət deyil - uyğun mount da yalnız path->mnt-nin onun üzərində mount edilməsi faktı ilə sabitlənib və həmin an biz heç bir kilidi saxlamırıq, buna görə də eyni növ yarış vəziyyətləri biz inode_lock()-a daxil olmaq üzrə ikən həmin mount-a olan bütün istinadların itməsi ilə nəticələnə bilər. Əgər bu baş verərsə, fayl sistemi bağlanarkən biz onda dentry istinadını saxlamış oluruq; bunun nəticələri xoş olmaz. Bizim etməli olduğumuz həm dentry-ni, həm də mount-u eyni vaxtda götürməkdir; bu, inode_lock()-u təhlükəsiz edir və fayl sisteminin altımızda bağlanması probleminin qarşısını alır. namespace_sem götürdükdən sonra path->mnt-nin hələ də mount edildiyini (hansı ki, onun ->mnt_parent-ini sabitləşdirir) təsdiqləyirik və onun hələ də eyni yerdə mount edildiyini yoxlayırıq. Həmin andan uyğun namespace_unlock()-a qədər götürdüyümüz mount/dentry cütünün həmçinin path->mnt-nin mount nöqtəsi olduğu üçün sabitləndiyinə əminik, buna görə də həm dentry istinadını (hazırkı kodun etdiyi kimi), həm də mnt istinadını sakitcə ata bilərik - bunu namespace_sem altında etmək mümkündür, çünki biz sonuncu istinadları atmırıq. Bu, do_lock_mount() tərəfdə problemi həll edir; unlock_mount()-da da oxşar problem var, çünki dentry-nin sabit qalması yalnız namespace_unlock()-a qədər təmin edilir. Bunu düzəltmək asandır - sadəcə inode_unlock()-u daha erkən, o hələ mp->m_dentry tərəfindən sabitlənmiş halda yerinə yetirmək lazımdır.

CiddilikYüksək
CVSS7.8
İstismar ehtimalı—
MəhsulLinux Kernel
Dərc20 may 2025
İlk görülmə20 may 2025

Necə düzəltmək olar

Yeniləyin
  • linux linux_kernel6.6.89, 6.12.26, 6.14.5 və ya daha yeni versiya

Təsirlənən məhsullar

MəhsulTəsirlənən versiyalarDüzəldildiyi versiya
linux linux_kernel6.5 ≤ v < 6.6.89, 6.7 ≤ v < 6.12.26, 6.13 ≤ v < 6.14.5, 6.156.6.89, 6.12.26, 6.14.5

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