CVE-2025-22111

Orta

Təsvir

Linux kernel-də aşağıdakı zəiflik aradan qaldırılmışdır: net: SIOCBRADDIF və SIOCBRDELIF üçün RTNL rəqsi silindi. SIOCBRDELIF əvvəlcə dev_ioctl()-ə ötürülür və daha sonra br_ioctl_call()-ə yönləndirilir ki, bu da lazımsız RTNL rəqsinə və RTNL təzyiqi altında aşağıdakı [0] splat-a səbəb olur. Tutaq ki, A axını (Thread A) bir cihazı körpüdən ayırmağa çalışır və B axını (Thread B) körpünü silməyə çalışır. dev_ioctl()-də A axını netdev_hold() vasitəsilə körpü cihazının refcnt dəyərini artırır və RTNL-i azad edir, çünki növbəti br_ioctl_call() funksiyası RTNL-i yenidən əldə edir. Yarış pəncərəsində (race window), B axını RTNL-i əldə edib körpü cihazını silməyə çalışa bilər. Sonra B axını tərəfindən çağırılan rtnl_unlock() RTNL-i azad edəcək və A axını tərəfindən netdev_put() çağırılmasını gözləyəcək. Lakin A axını dev_ifsioc()-də kilidin açılmasından sonra RTNL-i mütləq saxlamalıdır ki, bu da RTNL təzyiqi altında uzun çəkə bilər və nəticədə B axını tərəfindən splat yaranar. A axını (SIOCBRDELIF) B axını (SIOCBRDELBR) ---------------------- ---------------------- sock_ioctl sock_ioctl `- sock_do_ioctl `- br_ioctl_call `- dev_ioctl `- br_ioctl_stub |- rtnl_lock | |- dev_ifsioc ' ' |- dev = __dev_get_by_name(...) |- netdev_hold(dev, ...) . / |- rtnl_unlock ------. | | |- br_ioctl_call `---> |- rtnl_lock Yarış | | `- br_ioctl_stub |- br_del_bridge Pəncərə | | | |- dev = __dev_get_by_name(...) | | | Uzun çəkə bilər | `- br_dev_delete(dev, ...) | | | RTNL təzyiqi altında | `- unregister_netdevice_queue(dev, ...) | | | | `- rtnl_unlock \ | |- rtnl_lock <-' `- netdev_run_todo | |- ... `- netdev_run_todo | `- rtnl_unlock |- __rtnl_unlock | |- netdev_wait_allrefs_any |- netdev_put(dev, ...) <----------------' refcnt azalmasının gözlənilməsi və aşağıdakı splat-ın qeydiyyatı SIOCBRDELBR-nin lazımsız yerə bloklanmasının qarşısını almaq üçün SIOCBRADDIF və SIOCBRDELIF üçün dev_ioctl() çağırmayaq. dev_ioctl() yolunda biz bunları edirik: 1. sock_do_ioctl()-də get_user_ifreq ilə struct ifreq kopyalanır 2. dev_ioctl()-də CAP_NET_ADMIN yoxlanılır 3. dev_ioctl()-də dev_load() çağırılır 4. dev_ifsioc()-də ifr.ifr_name-dən master dev götürülür 3-cü bənd br_ioctl_call()-də request_module() vasitəsilə yerinə yetirilə bilər, buna görə də 1, 2 və 4-cü bəndləri br_ioctl_stub()-a köçürürük. Qeyd edək ki, 2-ci bənd daha sonra add_del_if()-də də yoxlanılır, lakin bunun RTNL-dən əvvəl yerinə yetirilməsi daha məqsədəuyğundur. SIOCBRADDIF və SIOCBRDELIF git dövründən əvvəlki vaxtlardan bəri dev_ioctl()-də emal olunub və onların orada emal edilməsi üçün xüsusi bir səbəb görünmür. [0]: unregister_netdevice: waiting for wpan3 to become free. Usage count = 2 ref_tracker: wpan3@ffff8880662d8608 has 1/1 users at __netdev_tracker_alloc include/linux/netdevice.h:4282 [inline] netdev_hold include/linux/netdevice.h:4311 [inline] dev_ifsioc+0xc6a/0x1160 net/core/dev_ioctl.c:624 dev_ioctl+0x255/0x10c0 net/core/dev_ioctl.c:826 sock_do_ioctl+0x1ca/0x260 net/socket.c:1213 sock_ioctl+0x23a/0x6c0 net/socket.c:1318 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:906 [inline] __se_sys_ioctl fs/ioctl.c:892 [inline] __x64_sys_ioctl+0x1a4/0x210 fs/ioctl.c:892 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xcb/0x250 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f

CiddilikOrta
CVSS5.5
İstismar ehtimalı—
MəhsulLinux Kernel
Dərc16 apr 2025
İlk görülmə16 apr 2025

Necə düzəltmək olar

Yeniləyin
  • linux linux_kernel6.14.2 və ya daha yeni versiya

Təsirlənən məhsullar

MəhsulTəsirlənən versiyalarDüzəldildiyi versiya
linux linux_kernel5.15 ≤ v < 6.14.26.14.2

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