CVE-2024-50154
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: tcp/dccp: reqsk_queue_unlink() fonksiyonunda timer_pending() kullanmayın. Martin KaFai Lau, reqsk_timer_handler() fonksiyonunda bir serbest bırakıldıktan sonra kullanım (use-after-free) [0] durumu bildirmiştir. """ trace_tcp_retransmit_synack fonksiyonuna eklenmiş bir bpf programından kaynaklanan bir serbest bırakıldıktan sonra kullanım durumu gözlemliyoruz. Program, req->sk nesnesini, kullanmadan önce null kontrolü yapan bpf_sk_storage_get_tracing kernel yardımcı fonksiyonuna iletir. """ 83fccfc3940c ("inet: fix potential deadlock in reqsk_queue_unlink()") numaralı commit, reqsk_timer_handler() içerisinden del_timer_sync() çağrılmaması için reqsk_queue_unlink() fonksiyonuna timer_pending() eklemişti; ancak bu durum küçük bir yarış durumu (race window) penceresi oluşturmuştur. Zamanlayıcı çağrılmadan önce, expire_timers() fonksiyonu timer->entry.pprev değerini temizlemek ve onu bekliyor olarak işaretlememek için detach_timer(timer, true) fonksiyonunu çağırır. Eğer reqsk_queue_unlink(), expire_timers() tarafından detach_timer() çağrısından hemen sonra timer_pending() kontrolünü yaparsa, TCP del_timer_sync() işlemini kaçıracaktır; reqsk zamanlayıcısı çalışmaya devam edecek ve süresi dolana kadar birden fazla SYN+ACK gönderecektir. Bildirilen serbest bırakıldıktan sonra kullanım (UAF) durumu, req->sk nesnesi varsayılan olarak 63 saniye olan zamanlayıcı süresinden daha önce close() edilirse meydana gelebilir. Senaryo şu şekildedir: 1. inet_csk_complete_hashdance() fonksiyonu inet_csk_reqsk_queue_drop() fonksiyonunu çağırır, ancak del_timer_sync() atlanır. 2. reqsk zamanlayıcısı yürütülür ve tekrar planlanır. 3. req->sk kabul edilir (accept()) ve reqsk_put() rsk_refcnt değerini azaltır, ancak reqsk zamanlayıcısında hala bir referans vardır ve inet_csk_accept() TFO olmayan soketler için req->sk nesnesini temizlemez. 4. sk kapatılır (close()). 5. reqsk zamanlayıcısı tekrar yürütülür ve BPF, req->sk nesnesine erişmeye çalışır. Çağırıcı bağlamını __inet_csk_reqsk_queue_drop() fonksiyonuna ileterek timer_pending() kullanımından kaçınalım. reqsk zamanlayıcısının sabitlendiğini (pinned), bu nedenle sorunun çoğu kullanım durumunda ortaya çıkmadığını unutmayın. [1] [0] BUG: KFENCE: use-after-free read in bpf_sk_storage_get_tracing+0x2e/0x1b0 Use-after-free read at 0x00000000a891fb3a (in kfence-#1): bpf_sk_storage_get_tracing+0x2e/0x1b0 bpf_prog_5ea3e95db6da0438_tcp_retransmit_synack+0x1d20/0x1dda bpf_trace_run2+0x4c/0xc0 tcp_rtx_synack+0xf9/0x100 reqsk_timer_handler+0xda/0x3d0 run_timer_softirq+0x292/0x8a0 irq_exit_rcu+0xf5/0x320 sysvec_apic_timer_interrupt+0x6d/0x80 asm_sysvec_apic_timer_interrupt+0x16/0x20 intel_idle_irq+0x5a/0xa0 cpuidle_enter_state+0x94/0x273 cpu_startup_entry+0x15e/0x260 start_secondary+0x8a/0x90 secondary_startup_64_no_verify+0xfa/0xfb kfence-#1: 0x00000000a72cc7b6-0x00000000d97616d9, size=2376, cache=TCPv6 allocated by task 0 on cpu 9 at 260507.901592s: sk_prot_alloc+0x35/0x140 sk_clone_lock+0x1f/0x3f0 inet_csk_clone_lock+0x15/0x160 tcp_create_openreq_child+0x1f/0x410 tcp_v6_syn_recv_sock+0x1da/0x700 tcp_check_req+0x1fb/0x510 tcp_v6_rcv+0x98b/0x1420 ipv6_list_rcv+0x2258/0x26e0 napi_complete_done+0x5b1/0x2990 mlx5e_napi_poll+0x2ae/0x8d0 net_rx_action+0x13e/0x590 irq_exit_rcu+0xf5/0x320 common_interrupt+0x80/0x90 asm_common_interrupt+0x22/0x40 cpuidle_enter_state+0xfb/0x273 cpu_startup_entry+0x15e/0x260 start_secondary+0x8a/0x90 secondary_startup_64_no_verify+0xfa/0xfb freed by task 0 on cpu 9 at 260507.927527s: rcu_core_si+0x4ff/0xf10 irq_exit_rcu+0xf5/0x320 sysvec_apic_timer_interrupt+0x6d/0x80 asm_sysvec_apic_timer_interrupt+0x16/0x20 cpuidle_enter_state+0xfb/0x273 cpu_startup_entry+0x15e/0x260 start_secondary+0x8a/0x90 secondary_startup_64_no_verify+0xfa/0xfb
Nasıl düzeltilir
- linux linux_kernel4.2, 5.15.170, 6.1.115, 6.6.59, 6.11.6 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| linux linux_kernel | 4.1.11 ≤ v < 4.2, 4.2 ≤ v < 5.15.170, 5.16 ≤ v < 6.1.115, 6.2 ≤ v < 6.6.59, 6.7 ≤ v < 6.11.6, 6.12 | 4.2, 5.15.170, 6.1.115, 6.6.59, 6.11.6 |
Sürümünüzü kontrol edin
Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.
Attack Surface Management
Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.