CVE-2026-64352
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılmışdır: bpf: Yuxu rejimində işləyən BPF proqramlarından LPM map-ə girişə icazə ver trie_lookup_elem() öz rcu_dereference_check() gəzintilərini yalnız rcu_read_lock_bh_held() ilə işarələyir. rcu_dereference_check(p, c) "c || rcu_read_lock_held()" kimi həll olunduğundan, bu XDP/NAPI və klassik RCU oxuyucuları üçün keçir, lakin __bpf_prog_enter_sleepable() vasitəsilə daxil olan və yalnız rcu_read_lock_trace() saxlayan yuxu rejimində işləyən BPF proqramları üçün uğursuz olur. trie_update_elem() və trie_delete_elem() eyni problemi fərqli formada yaşayır: onlar trie-ni şərtsiz olaraq rcu_read_lock_held() tələb edən adi rcu_dereference() ilə gəzirlər. Hər ikisinə yuxu rejimində işləyən BPF proqramlarından bpf_map_update_elem / bpf_map_delete_elem köməkçiləri vasitəsilə və klassik rcu_read_lock() altında sistem çağırışı yolundan çatmaq mümkündür. Yazıcı yollarında trie əslində trie->lock (gəzinti boyunca götürülən rqspinlock) ilə qorunur; biz orada qovşaqları canlı saxlamaq üçün heç vaxt RCU oxu tərəfi kilidinə arxalanmamışıq. Buna görə də LPM trie-yə toxunan yuxu rejimində işləyən LSM hook-u debug kernel-lərində lockdep-i işə salır: ============================= WARNING: suspicious RCU usage 7.1.0-... Tainted: G E ----------------------------- kernel/bpf/lpm_trie.c:249 suspicious rcu_dereference_check() usage! 1 lock held by net_tests/540: #0: (rcu_tasks_trace_srcu_struct){....}-{0:0}, at: __bpf_prog_enter_sleepable+0x26/0x280 Call Trace: dump_stack_lvl lockdep_rcu_suspicious trie_lookup_elem bpf_prog_..._enforce_security_socket_connect bpf_trampoline_... security_socket_connect __sys_connect do_syscall_64 Bu yalnız lockdep ilə bağlıdır -- UAF yoxdur, çünki Tasks Trace RCU trie-nin geri qaytarılma yoluna qarşı serializasiya edir -- lakin LPM trie-yə toxunan yuxu rejimində işləyən BPF LSM işləyən hər debug kernel-də hər fərqli çağırış nöqtəsi üçün bir dəfə konsolu mesajla doldurur ki, bu da getdikcə daha çox yayılır. Axtarış yolu üçün rcu_dereference_check() annotasiyasını rcu_read_lock_bh_held()-dən hər üç konteksti (klassik, BH, Tasks Trace) qəbul edən bpf_rcu_lock_held()-ə dəyişdirin. Digər map növləri artıq bu konvensiyaya əməl edir. trie_update_elem() və trie_delete_elem() üçün gəzintiləri rcu_dereference_protected(*p, 1) kimi işarələyin -- eyni fayldakı trie_free() ilə uyğun olaraq -- çünki gəzinti boyunca trie->lock saxlanılır. rqspinlock-un lockdep_map-ı yoxdur, buna görə predikat lockdep_is_held(&trie->lock) əvəzinə '1'-ə çevrilir; qoruma realdır, lakin maşınla yoxlanıla bilməz. trie_get_next_key() də adi rcu_dereference() istifadə edir, lakin ona yalnız dispetçerdən əvvəl klassik rcu_read_lock() saxlayan BPF sistem çağırışından çatmaq mümkündür, buna görə də toxunulmaz qalır.
Necə düzəltmək olar
- linux linux_kernel5.15.212, 6.1.178, 6.6.145, 6.12.97, 6.18.40, 7.1.4 və ya daha yeni versiya
- git.kernel.org/stable/c/2f884d371fafea137afea504d49ee4a7c8d7985b
- git.kernel.org/stable/c/304ca50582f0c047370f85e13caec456f78c9fcc
- git.kernel.org/stable/c/57454944737f3ad9a8703aecbbb79713b513a94b
- git.kernel.org/stable/c/9bfdf4b81b0e56d47bc6c46c34a46638be716695
- git.kernel.org/stable/c/bd6ad9a6b30498d845413e863fb95c6fab3babe3
- git.kernel.org/stable/c/ec662a8b2cde01e76b37ccd4b992d0342299e69c
- git.kernel.org/stable/c/f0967d4f1ba4323a3cb7dc8fdba74dd3a8caaf04
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| linux linux_kernel | 5.14 ≤ v < 5.15.212, 5.16 ≤ v < 6.1.178, 6.2 ≤ v < 6.6.145, 6.7 ≤ v < 6.12.97, 6.13 ≤ v < 6.18.40, 6.19 ≤ v < 7.1.4 | 5.15.212, 6.1.178, 6.6.145, 6.12.97, 6.18.40, 7.1.4 |
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.