CVE-2025-22059
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: udp: sk->sk_rmem_alloc üzerindeki çoklu wraparound sorunları düzeltildi. __udp_enqueue_schedule_skb() fonksiyonunda şu koşul bulunmaktadır: if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf) goto drop; sk->sk_rcvbuf, net.core.rmem_default ile başlatılır ve daha sonra net.core.rmem_max tarafından sınırlandırılan SO_RCVBUF veya SO_RCVBUFFORCE ile yapılandırılabilir. Eğer sk->sk_rcvbuf değerine INT_MAX atanırsa, sk->sk_rmem_alloc da imzalı bir tam sayı (signed int) olduğu için bu koşul her zaman yanlış döner. Ardından, gelen skb boyutu koşulsuz olarak sk->sk_rmem_alloc değerine eklenir. Bu durum, sk->sk_rmem_alloc üzerinde tamsayı taşmasına (integer overflow) (muhtemelen birden fazla kez) yol açar ve tek bir soketin net.core.udp_mem[1] değerine kadar skb bulundurmasına izin verir. Örneğin, udp_mem[1] değerine büyük bir değer ve sk->sk_rcvbuf değerine INT_MAX atanıp sokete paketler gönderilirse, birden fazla taşma görülebilir: # cat /proc/net/sockstat | grep UDP: UDP: inuse 3 mem 7956736 <-- (7956736 << 12) bytes > INT_MAX * 15 ^- PAGE_SHIFT # ss -uam State Recv-Q ... UNCONN -1757018048 ... <-- işaretin sürekli değişmesi skmem:(r2537949248,rb2147483646,t0,tb212992,f1984,w0,o0,bl0,d0) Daha önce INT_MAX için bir sınır kontrolü vardı ancak bu kontrol 6a1f12dd85a8 ("udp: relax atomic operation on sk->sk_rmem_alloc") commit'i ile kaldırılmıştı. Tam bir çözüm, bunu geri almak ve sağ operatörü INT_MAX ile sınırlamak olacaktır: rmem = atomic_add_return(size, &sk->sk_rmem_alloc); if (rmem > min(size + (unsigned int)sk->sk_rcvbuf, INT_MAX)) goto uncharge_drop; Ancak sadece uç durumlar için maliyetli olan atomic_add_return() işlemini tekrar eklemek istenmemektedir. rmem değişkeninin unsigned int tipine dönüştürülmesi çoklu wraparound işlemlerini önler, fakat hala tek bir wraparound işlemine izin verilmektedir. # cat /proc/net/sockstat | grep UDP: UDP: inuse 3 mem 524288 <-- (INT_MAX + 1) >> 12 # ss -uam State Recv-Q ... UNCONN -2147482816 ... <-- INT_MAX + 831 bytes skmem:(r2147484480,rb2147483646,t0,tb212992,f3264,w0,o0,bl0,d14468947) Bu nedenle, rmem ve rcvbuf unsigned int olarak tanımlanmalı ve skb->truesize yalnızca rcvbuf, taşma olasılığını düşürecek kadar büyük olduğunda kontrol edilmelidir. Aynı sokete ait birden fazla skb aynı anda farklı çekirdeklerde işlendiğinde, her bir boyut sınırı aşmasa bile toplam boyutun sınırı aşması durumunda hala düşük bir taşma ihtimali olduğu unutulmamalıdır. Ayrıca, 363dc73acacb ("udp: be less conservative with sock rmem accounting") commit'inde açıklandığı üzere, küçük tamponlar için skb->truesize değerinin göz ardı edilmesi gerektiği unutulmamalıdır.
Nasıl düzeltilir
- linux linux_kernel6.12.23, 6.13.11, 6.14.2 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 | 6.10 ≤ v < 6.12.23, 6.13 ≤ v < 6.13.11, 6.14 ≤ v < 6.14.2 | 6.12.23, 6.13.11, 6.14.2 |
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.