CVE-2023-53188
Açıklama
Linux kernel'de aşağıdaki güvenlik açığı giderilmiştir: net: openvswitch: port çıktısındaki yarış durumu düzeltildi Tek bir makinede şu kurulum olduğunu varsayalım: 1. Bir köprü ve varsayılan akışlara sahip bir openvswitch örneği 2. "server" ve "client" adında iki ağ ad alanı (network namespace) 3. Köprü üzerinde "server" ve "client" adında iki ovs arayüzü 4. Her ovs arayüzü için eşleşen isimlere ve 32 rx ile tx kuyruğuna sahip bir veth çifti 5. veth çiftlerinin uçlarını ilgili ağ ad alanlarına taşıyın 6. Ad alanlarındaki her bir veth ucuna IP adresleri atayın (aynı alt ağda olmalıdır) 7. Server ağ ad alanında bir HTTP sunucusu başlatın 8. Client ad alanındaki bir istemcinin HTTP sunucusuna ulaşıp ulaşamadığını test edin Aşağıdaki işlemler izlendiğinde, ana bilgisayarın bir CPU'sunun sonsuz döngüye girme olasılığı vardır: 1. HTTP sunucusuna çok miktarda paralel istek gönderin (yaklaşık 3000 curl işlemi çalışacaktır) 2. Paralel olarak ağ ad alanını silin (arayüzleri silmeyin veya sunucuyu durdurmayın, sadece ad alanını sonlandırın) Bunun aşağıdaki çekirdek CPU takılma mesajına neden olma olasılığı düşüktür. Eğer gerçekleşmezse tekrar deneyin. Aşağıda ayrıca çıktıdaki fonksiyonlar için bpftrace çıktısı yer almaktadır. Burada meydana gelen olaylar dizisi şöyledir: 1. Ağ ad alanı silinirken işlemin bir yerinde `unregister_netdevice_many_notify` çağrılır 2. Bu işlem önce veth'in her iki ucunda `NETREG_UNREGISTERING` ayarlar ve ardından `synchronize_net` çalıştırır 3. Daha sonra `NETDEV_UNREGISTER` ile `call_netdevice_notifiers` çağrılır 4. Bu durum, `ovs_netdev_detach_dev` fonksiyonunu çağıran `dp_device_event` tarafından işlenir (bir vport bulunursa; ki bu, ovs'ye bağlı olan veth arayüzü için geçerlidir) 5. Bu işlem cihazın rx_handler'larını kaldırır ancak paketlerin cihaza gönderilmesini engellemez 6. `dp_device_event`, kayıt çıkarma yolunda elimizde olmayan bir ovs_lock gerektiğinden, vport silme işlemini arka planda çalışmak üzere sıraya alır 7. `unregister_netdevice_many_notify`, `real_num_tx_queues` değerini 0 yapan `netdev_unregister_kobject` fonksiyonunu çağırmaya devam eder 8. Port silme işlemi devam eder (ancak ayrıntılar bu sorun için ilgili değildir) 9. Gelecekteki bir noktada arka plan görevi vport'u siler Eğer 7. adımdan sonra ancak 9. adımdan önce, (bu noktada henüz silinmemiş olan) ovs vport'una bir paket gönderilirse, cihaz kayıt çıkarma aşamasında olsa bile paket `dev_queue_xmit` akışına yönlendirilir. `dev_queue_xmit` içinde çağrılan `skb_tx_hash` yolunda, eğer paketin kaydedilmiş bir rx_queue'su varsa, `dev->real_num_tx_queues` değeri sıfır olduğunda sonsuz hale gelen bir while döngüsü bulunur. Bunun gerçekleşmesini önlemek için `do_output`, taşıyıcısı (carrier) olmayan cihazları, cihaz bulunamamış gibi (ki bu 9. adım tamamlandıktan sonraki kod yolu olacaktır) işleyecek şekilde güncellenmiştir. Ek olarak, artık sonsuz döngüye gireceğimiz durumlarda `skb_tx_hash` içerisinde bir uyarı üretilmektedir. bpftrace (ilk kelime fonksiyon adıdır): __dev_queue_xmit server: real_num_tx_queues: 1, cpu: 2, pid: 28024, tid: 28024, skb_addr: 0xffff9edb6f207000, reg_state: 1 netdev_core_pick_tx server: addr: 0xffff9f0a46d4a000 real_num_tx_queues: 1, cpu: 2, pid: 28024, tid: 28024, skb_addr: 0xffff9edb6f207000, reg_state: 1 dp_device_event server: real_num_tx_queues: 1 cpu 9, pid: 21024, tid: 21024, event 2, reg_state: 1 synchronize_rcu_expedited: cpu 9, pid: 21024, tid: 21024 synchronize_rcu_expedited: cpu 9, pid: 21024, tid: 21024 synchronize_rcu_expedited: cpu 9, pid: 21024, tid: 21024 synchronize_rcu_expedited: cpu 9, pid: 21024, tid: 21024 dp_device_event server: real_num_tx_queues: 1 cpu 9, pid: 21024, tid: 21024, event 6, reg_state: 2 ovs_netdev_detach_dev server: real_num_tx_queues: 1 cpu 9, pid: 21024, tid: 21024, reg_state: 2 netdev_rx_handler_unregister server: real_num_tx_queues: 1, cpu: 9, pid: 21024, tid: 21024, reg_state: 2 synchronize_rcu_expedited: cpu 9, pid: 21024, tid: 21024 netdev_rx_handler_unregister ret server: real_num_tx_queues: 1, cpu: 9, pid: 21024, tid: 21024, reg_state: 2 dp_ ---kesildi---
Nasıl düzeltilir
- linux linux_kernel5.4.293, 5.10.237, 5.15.181, 6.1.25, 6.2.12 ya da sonraki bir sürüm
- git.kernel.org/stable/c/066b86787fa3d97b7aefb5ac0a99a22dad2d15f8
- git.kernel.org/stable/c/284be5db6c8d06d247ed056cfc448c4f79bbb16c
- git.kernel.org/stable/c/56252da41426f3d01957456f13caf46ce670ea29
- git.kernel.org/stable/c/5efcb301523baacd98a47553d4996e924923114d
- git.kernel.org/stable/c/644b3051b06ba465bc7401bfae9b14963cbc8c1c
- git.kernel.org/stable/c/9b0dd09c1ceb35950d2884848099fccc9ec9a123
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| linux linux_kernel | 4.3 ≤ v < 5.4.293, 5.5 ≤ v < 5.10.237, 5.11 ≤ v < 5.15.181, 5.16 ≤ v < 6.1.25, 6.2 ≤ v < 6.2.12, 6.3 | 5.4.293, 5.10.237, 5.15.181, 6.1.25, 6.2.12 |
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.