CVE-2024-26804
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: net: ip_tunnel: sürekli headroom büyümesinin önlenmesi syzkaller şu kasan hatasını tetiklemiştir: BUG: KASAN: use-after-free in __skb_flow_dissect+0x19d1/0x7a50 net/core/flow_dissector.c:1170 Read of size 1 at addr ffff88812fb4000e by task syz-executor183/5191 [..] kasan_report+0xda/0x110 mm/kasan/report.c:588 __skb_flow_dissect+0x19d1/0x7a50 net/core/flow_dissector.c:1170 skb_flow_dissect_flow_keys include/linux/skbuff.h:1514 [inline] ___skb_get_hash net/core/flow_dissector.c:1791 [inline] __skb_get_hash+0xc7/0x540 net/core/flow_dissector.c:1856 skb_get_hash include/linux/skbuff.h:1556 [inline] ip_tunnel_xmit+0x1855/0x33c0 net/ipv4/ip_tunnel.c:748 ipip_tunnel_xmit+0x3cc/0x4e0 net/ipv4/ipip.c:308 __netdev_start_xmit include/linux/netdevice.h:4940 [inline] netdev_start_xmit include/linux/netdevice.h:4954 [inline] xmit_one net/core/dev.c:3548 [inline] dev_hard_start_xmit+0x13d/0x6d0 net/core/dev.c:3564 __dev_queue_xmit+0x7c1/0x3d60 net/core/dev.c:4349 dev_queue_xmit include/linux/netdevice.h:3134 [inline] neigh_connected_output+0x42c/0x5d0 net/core/neighbour.c:1592 ... ip_finish_output2+0x833/0x2550 net/ipv4/ip_output.c:235 ip_finish_output+0x31/0x310 net/ipv4/ip_output.c:323 .. iptunnel_xmit+0x5b4/0x9b0 net/ipv4/ip_tunnel_core.c:82 ip_tunnel_xmit+0x1dbc/0x33c0 net/ipv4/ip_tunnel.c:831 ipgre_xmit+0x4a1/0x980 net/ipv4/ip_gre.c:665 __netdev_start_xmit include/linux/netdevice.h:4940 [inline] netdev_start_xmit include/linux/netdevice.h:4954 [inline] xmit_one net/core/dev.c:3548 [inline] dev_hard_start_xmit+0x13d/0x6d0 net/core/dev.c:3564 ... Hata, skb->data'nın tahsis edilen skb->head alanının ötesini göstermesi nedeniyle oluşur. Bunun sebebi neigh katmanının şunları yapmasıdır: __skb_pull(skb, skb_network_offset(skb)); Ancak skb_network_offset() negatif bir ofset döndürür ve __skb_pull() argümanı işaretsizdir (unsigned). Diğer bir ifadeyle, skb->data çok büyük bir değerle "ayarlanmış" olur. Negatif değerin dönme sebebi, skb->head ile skb->data arasındaki mesafenin 64k'dan fazla olması ve skb->network_header (u16) değerinin başa sarmasıdır (wrap around). Hata, dev->needed_headroom değerinin sonsuza kadar artmasına neden olabilen ip_tunnel altyapısındadır. syzkaller reprodüksiyonu, paketlerin bir gre tüneli üzerinden yönlendirilmesinden ve gre kapsüllü paketlerin rotasının başka bir (ipip) tüneline işaret etmesinden oluşur. ipip kapsülleme işlemi, sıradaki çıkış aygıtı olarak gre0'ı bulur. Bu durum şu örüntüye yol açar: 1). İlk paket gre0 üzerinden gönderilecektir. Rota araması bir çıkış aygıtı olan ipip0'ı bulmuştur. 2). gre0 için ip_tunnel_xmit, gelecekteki çıkış aygıtına (rt.dev->needed_headroom - ipip0) dayanarak gre0->needed_headroom değerini artırır. 3). IP çıktısı / start_xmit paketi ipip0'a taşır; bu da aynı kod yolunu tekrar çalıştırır (xmit rekürsiyonu). 4). gre0 sonrası kapsüllenmiş paket için yönlendirme adımı, ipip0 kapsüllü paket için kullanılacak çıkış aygıtı olarak gre0'ı bulur. tunl0->needed_headroom değeri daha sonra (zaten artırılmış olan) gre0 aygıtı headroom değerine göre artırılır. Bu işlem gelecekteki her paket için tekrarlanır: Önceki paketlerin ipip0 adımı rt->dev (gre0) headroom değerini artırdığı için gre0->needed_headroom şişer ve gre0 needed_headroom arttığı için ipip0 da artar. Sonraki her paket için gre/ipip0->needed_headroom, genişletilmiş head yeniden tahsisleri sonucunda skb->head/data mesafesi 64k'yı aşana kadar büyür. Bu gerçekleştiğinde, pskb_expand_head headroom genişletme/yeniden tahsis sonrası skb_network_offset()'in değişmediğinden emin olmaya çalışırken skb->network_header (u16) başa sarar. Bundan sonra skb_network_offset(skb), headroom genişletme sonrası farklı (ve negatif) bir sonuç döndürür. Neigh katmanına yapılan bir sonraki ziyaret (veya ağ başlığını __skb_pull yapacak herhangi bir işlem), skb->data'nın skb->head alanı dışındaki bir bellek konumuna işaret etmesine neden olur. v2: Headroom artırımını tamamen kaldırmak yerine, sürekli artışı önlemek için needed_headroom güncellemesini rastgele seçilmiş bir üst sınırla sınırlar.
Nasıl düzeltilir
- linux linux_kernel5.4.271, 5.10.212, 5.15.151, 6.1.81, 6.6.21, 6.7.9 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 | 2.6.34 ≤ v < 5.4.271, 5.5 ≤ v < 5.10.212, 5.11 ≤ v < 5.15.151, 5.16 ≤ v < 6.1.81, 6.2 ≤ v < 6.6.21, 6.7 ≤ v < 6.7.9, 6.8 | 5.4.271, 5.10.212, 5.15.151, 6.1.81, 6.6.21, 6.7.9 |
| debian debian_linux | 10.0 | — |
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.