CVE-2026-98642
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılmışdır: bpf: alloc_bulk funksiyasında ttrace siyahılarının eyni vaxtda istifadəsi səbəbindən yaranan UAF xətasının düzəldilməsi Syzkaller, bpf memalloc daxilindəki waiting_for_gp_ttrace düyünləri ilə bağlı təkrarlanan UAF xətalarını aşkar etmişdir: BUG: KASAN: slab-use-after-free in llist_del_first+0x85/0x110 lib/llist.c:61 Read of size 8 at addr ffff8881572cd080 by task syz.4.470/5112 ... llist_del_first+0x85/0x110 lib/llist.c:61 alloc_bulk+0x193/0x460 kernel/bpf/memalloc.c:229 bpf_mem_refill+0x386/0x560 kernel/bpf/memalloc.c:436 Freed by task 14: ... __free_rcu kernel/bpf/memalloc.c:281 [inline] __free_rcu_tasks_trace+0x48/0xd0 kernel/bpf/memalloc.c:291 rcu_tasks_invoke_cbs+0x1ec/0x3e0 kernel/rcu/tasks.h:571 rcu_tasks_one_gp+0x13d/0x220 kernel/rcu/tasks.h:621 rcu_tasks_kthread+0xf3/0x120 kernel/rcu/tasks.h:651 Bunun səbəbi odur ki, UAF xətası RCU Tasks Trace GP müddəti bitdikdən sonra baş verir: __free_rcu() geri çağırışı işə düşdükdə, llist_del_all() funksiyasının waiting_for_gp_ttrace üzərində əməliyyat aparan eyni vaxtlı alloc_bulk() funksiyasına qarşı qoruyucu sinxronizasiya mövcud deyil və bu, aşağıdakı yarış şəraitinə (race condition) səbəb olur: CPU0 CPU1 __free_rcu (RCU Tasks Trace callback) alloc_bulk llist_del_first(&c->waiting_for_gp_ttrace) entry = smp_load_acquire(&head->first); do { if (entry == NULL) return NULL; free_all(llist_del_all(&c->waiting_for_gp_ttrace)) llist_for_each_safe(pos, t, llnode) free_one(pos); next = READ_ONCE(entry->next); <-- trigger UAF } while (!try_cmpxchg(&head->first, &entry, next)); Əlavə olaraq, free_by_rcu_ttrace siyahısında da nəzəri bir yarış şəraiti mövcuddur. Bu yarış üçün iki ilkin şərt tələb olunur: c->call_rcu_ttrace_in_progress == 1 vəziyyətini saxlayan aktiv bir Tasks Trace GP və c->free_by_rcu_ttrace siyahısını yeni düyünlərlə yenidən dolduran eyni vaxtlı çarpaz-CPU azad etmə əməliyyatları. Bu şərtlər altında aşağıdakı ssenari UAF xətasını tetikləyir: // CPU0 // irq work hələ də məşğuldur (PREEMPT_RT-də) alloc_bulk() llist_del_first(&c->free_by_rcu_ttrace) entry = smp_load_acquire(&head->first); do { if (entry == NULL) return NULL; // CPU1 bpf_mem_alloc_destroy() WRITE_ONCE(c->draining, true) // CPU0-ın gözlənilməsi irq_work_sync() // CPU2 do_call_rcu_ttrace(tgt(CPU0)) if (c->draining) { llist_del_all(&c->free_by_rcu_ttrace) free_all() } // CPU0 davam edir next = READ_ONCE(entry->next); <-- trigger UAF while (!try_cmpxchg(&head->first, &entry, next)); Bu problem, waiting_for_gp_ttrace və free_by_rcu_ttrace üzərindəki eyni vaxtlı istehlakı sinxronlaşdırmaq üçün raw spinlock tətbiq edilməklə həll edilmişdir.
Necə düzəltmək olar
Mənbələrdə bu zəiflik üçün düzəldilmiş versiya və ya yamaq keçidi yoxdur.
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| microsoft azl3_kernel_6.6.157.1-1 | Aralıq göstərilməyib | — |
| microsoft azl3_kernel_6.6.159.1-1 | Aralıq göstərilməyib | — |
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.