CVE-2023-53585
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: bpf: bpf_sk_assign fonksiyonunda hashlenmemiş soketlerin reddedilmesi bpf_sk_assign için semantikler şu şekildedir: sk = some_lookup_func() bpf_sk_assign(skb, sk) bpf_sk_release(sk) Yani, sk nesnesi bpf_sk_assign tarafından tüketilmez. Bu nedenle fonksiyonun, sk nesnesinin __inet_lookup_skb tarafından tüketilene kadar yeterince uzun süre yaşadığından emin olması gerekir. Bir TCPv4 paketi için yığın üzerindeki yol yaklaşık olarak şöyledir: netif_receive_skb_core: RCU okuma kilidini alır __netif_receive_skb_core: sch_handle_ingress: tcf_classify: bpf_sk_assign() deliver_ptype_list_skb: deliver_skb: ip_packet_type->func == ip_rcv: ip_rcv_core: ip_rcv_finish_core: dst_input: ip_local_deliver: ip_local_deliver_finish: ip_protocol_deliver_rcu: tcp_v4_rcv: __inet_lookup_skb: skb_steal_sock Mevcut yardımcı fonksiyon, her şeyin aynı RCU kritik bölümünde gerçekleştiği gerçeğinden yararlanır: SOCK_RCU_FREE bayrağı ayarlanmış soketler için bpf_sk_assign asla referans almaz. Ardından skb_steal_sock tekrar SOCK_RCU_FREE kontrolü yapar ve gerekirse sock_put işlemini gerçekleştirir. Bu yaklaşım, bpf_sk_assign ile skb_steal_sock arasında bir sk üzerinde SOCK_RCU_FREE bayrağının asla ayarlanmadığını varsayar; ancak bu değişmez durum, hashlenmemiş UDP soketleri tarafından ihlal edilir. Yeni bir UDP soketi TCP_CLOSE durumunda oluşturulur ancak SOCK_RCU_FREE ayarlanmamıştır. Bu bayrak yalnızca bir soket bağlandığında çalışan udp_lib_get_port() fonksiyonunda eklenir. bpf_sk_assign eklendiğinde, BPF üzerinden hashlenmemiş UDP soketlerine erişmek mümkün değildi, dolayısıyla bu bir sorun teşkil etmiyordu. Bu durum 0c48eefae712 ("sock_map: Lift socket state restriction for datagram sockets") commit'i ile değişmiş, ancak yardımcı fonksiyon buna göre düzenlenmemiştir. Dolayısıyla, aşağıdaki olaylar dizisi bir refcount sızıntısına yol açacaktır: 1. socket(AF_INET, SOCK_DGRAM) bir sockmap'e eklenir. 2. Soket sockmap'ten çıkarılır ve bpf_sk_assign işlemi uygulanır. SOCK_RCU_FREE ayarlı olmadığı için refcount artırılır. 3. Sokete bind() veya connect() yapılarak SOCK_RCU_FREE ayarlanır. 4. skb_steal_sock artık SOCK_RCU_FREE nedeniyle refcounted = false olarak ayarlayacaktır. 5. tcp_v4_rcv() fonksiyonu sock_put() işlemini atlar. Sorun, bpf_sk_assign() fonksiyonunda hashlenmemiş soketlerin reddedilmesiyle düzeltilmiştir. Bu işlem, bpf_sk_assign()'ın nihai hedefi olan __inet_lookup_skb davranışıyla uyumludur.
Nasıl düzeltilir
- linux linux_kernel5.10.195, 5.15.132, 6.1.53, 6.4.16, 6.5.3 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 | 5.7 ≤ v < 5.10.195, 5.11 ≤ v < 5.15.132, 5.16 ≤ v < 6.1.53, 6.2 ≤ v < 6.4.16, 6.5 ≤ v < 6.5.3 | 5.10.195, 5.15.132, 6.1.53, 6.4.16, 6.5.3 |
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.