CVE-2024-41010
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılıb: bpf: tcx_entry-in çox erkən buraxılması düzəldildi Pedro Pinto və sonradan müstəqil şəkildə həmçinin Hyunwoo Kim və Wongi Lee, paylaşılan tc bloku olan aktiv köhnə üslublu ingress və ya clsact qdisc-in sonradan başqa bir ingress və ya clsact instansiyası ilə əvəz edildiyi halda tcx_entry-in çox erkən buraxıla bilməsinin istifadədən sonra buraxma (UAF) ilə nəticələnməsi problemini bildirdilər. Əsasən, UAF-ı tetikləyən ardıcıllıq (bir nümunə) aşağıdakı kimi ola bilər: 1. Şəbəkə adlar fəzası yaradılır 2. ingress qdisc yaradılır. Bu, tcx_entry ayırır və &tcx_entry->miniq qdisc-in miniqp->p_miniq sahəsində saxlanılır. Eyni zamanda indeksi 1 olan tcf bloku yaradılır. 3. chain0 tcf blokuna qoşulur. chain0 sonradan UAF-ı tetikləyən tcf_chain0_head_change_cb_del() funksiyasına çatmaq üçün ingress qdisc ilə əlaqələndirilmiş bloka bağlanmalıdır. 4. clsact qdisc yaradılır və qoşulur. Bu, 1-ci addımda yaradılmış ingress qdisc-in silinməsinə səbəb olur və beləliklə əvvəlcədən əlaqələndirilmiş tcx_entry buraxılır: rtnetlink_rcv_msg() => tc_modify_qdisc() => qdisc_create() => clsact_init() [a] => qdisc_graft() => qdisc_destroy() => __qdisc_destroy() => ingress_destroy() [b] => tcx_entry_free() => kfree_rcu() // tcx_entry buraxıldı 5. Nəhayət, şəbəkə adlar fəzası bağlanır. Bu, cleanup_net işçisini qeydiyyata alır və qalan clsact qdisc-in buraxılması prosesi zamanı 4-cü addımda artıq buraxılmış tcx_entry-ə müraciət edilir, nəticədə UAF baş verir: cleanup_net() => ops_exit_list() => default_device_exit_batch() => unregister_netdevice_many() => unregister_netdevice_many_notify() => dev_shutdown() => qdisc_put() => clsact_destroy() [c] => tcf_block_put_ext() => tcf_chain0_head_change_cb_del() => tcf_chain_head_change_item() => clsact_chain_head_change() => mini_qdisc_pair_swap() // UAF Digər variantlar da mövcuddur; mahiyyət ondan ibarətdir ki, müəyyən paylaşılan bloku olan ingress (və ya clsact) qdisc əlavə edilir, sonra həmin qdisc əvəz edilir, tcx_entry kfree_rcu()-nin icra olunması gözlənilir və sonradan bu və ya digər şəkildə cari aktiv qdisc-in miniq sahəsinə müraciət edilir. Düzgün düzəliş miniq_active boolean dəyərini sayğaca çevirməkdir. Müşahidə etmək olar ki, yuxarıdakı 2-ci addımda sayğac 0->1, [a] addımında 1->2 (miniq obyektinin əvəzləmə zamanı aktiv qalması üçün), sonra [b] addımında 2->1 və nəhayət [c] addımında son buraxılışla 1->0 keçidi edir. İstinad sayğacı ümumilikdə [0,2] aralığında dəyişir və atomik olmasına ehtiyac yoxdur, çünki sayğaca bütün müraciətlər rtnl mutex ilə qorunur. Bunun tətbiqi ilə artıq UAF baş vermir və tcx_entry düzgün vaxtda buraxılır.
Necə düzəltmək olar
- linux linux_kernel6.6.41, 6.9.10 və ya daha yeni versiya
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| linux linux_kernel | 6.6 ≤ v < 6.6.41, 6.7 ≤ v < 6.9.10 | 6.6.41, 6.9.10 |
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.
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.