CVE-2023-53489
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: tcp/udp: TX zaman damgasına sahip sk ve zerocopy skb'lerin bellek sızıntıları düzeltildi. syzkaller, bir UDP soketi ve ZEROCOPY skb'lerinde bellek sızıntıları olduğunu bildirmiştir [0]. Sorun şu dizilerle yeniden üretilebilir: sk = socket(AF_INET, SOCK_DGRAM, 0) sk.setsockopt(SOL_SOCKET, SO_TIMESTAMPING, SOF_TIMESTAMPING_TX_SOFTWARE) sk.setsockopt(SOL_SOCKET, SO_ZEROCOPY, 1) sk.sendto(b'', MSG_ZEROCOPY, ('127.0.0.1', 53)) sk.close() sendmsg(), bir skb tahsis eden, skb->cb->ubuf.refcnt değerini 1 yapan ve sock_hold() fonksiyonunu çağıran msg_zerocopy_alloc() fonksiyonunu çağırır. Burada, struct ubuf_info_msgzc dolaylı olarak soketin bir refcnt değerini tutar. skb gönderildiğinde, __skb_tstamp_tx() bunu klonlar ve klonu TX zaman damgasıyla birlikte soketin hata kuyruğuna yerleştirir. Orijinal skb yerel olarak alındığında, skb_copy_ubufs() fonksiyonu skb_unclone() fonksiyonunu çağırır ve pskb_expand_head() fonksiyonu skb->cb->ubuf.refcnt değerini artırır. Bu ek sayım, skb serbest bırakılırken azaltılır ancak struct ubuf_info_msgzc hala bir refcnt değerine sahiptir, bu nedenle __msg_zerocopy_callback() çağrılmaz. Son refcnt değeri, TX zaman damgalı skb'yi recvmsg() ile geri almadığımız sürece serbest bırakılmaz. Soketin refcnt değeri 0'a ulaştıktan sonra inet_sock_destruct() içinde hata kuyruğunu temizlediğimiz için dairesel bir bağımlılık oluşur. Bu tür skb'leri tutan soketi close() ile kapatırsak, sock_put() asla çağrılmaz ve sayım, sk ve skb sızdırılır. TCP aynı soruna sahiptir ve e0c8bccd40fc ("net: stream: purge sk_error_queue in sk_stream_kill_queues()") commit'i, close() sırasında skb_queue_purge() çağrılarak bunu düzeltmeye çalışmıştır. Ancak, bir qdisc veya cihazda kuyruğa alınmış olan skb'nin, skb_queue_purge() çağrısından sonra hata kuyruğuna konulma ihtimali düşük de olsa vardır. __skb_tstamp_tx() fonksiyonunda, dairesel bağımlılığı ortadan kaldırmak için klonlanan skb'nin ubuf referansına sahip olmaması gerekir; fakat skb_clone(), zerocopy skb için skb_copy_ubufs() fonksiyonunu çağırmaz. Bu nedenle, skb_copy_ubufs() fonksiyonunun çağrılması için klonlanan skb üzerinde skb_orphan_frags_rx() fonksiyonunu çağırmamız gerekmektedir. [0]: BUG: memory leak unreferenced object 0xffff88800c6d2d00 (size 1152): comm "syz-executor392", pid 264, jiffies 4294785440 (age 13.044s) hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 cd af e8 81 00 00 00 00 ................ 02 00 07 40 00 00 00 00 00 00 00 00 00 00 00 00 ...@............ backtrace: [<0000000055636812>] sk_prot_alloc+0x64/0x2a0 net/core/sock.c:2024 [<0000000054d77b7a>] sk_alloc+0x3b/0x800 net/core/sock.c:2083 [<0000000066f3c7e0>] inet_create net/ipv4/af_inet.c:319 [inline] [<0000000066f3c7e0>] inet_create+0x31e/0xe40 net/ipv4/af_inet.c:245 [<000000009b83af97>] __sock_create+0x2ab/0x550 net/socket.c:1515 [<00000000b9b11231>] sock_create net/socket.c:1566 [inline] [<00000000b9b11231>] __sys_socket_create net/socket.c:1603 [inline] [<00000000b9b11231>] __sys_socket_create net/socket.c:1588 [inline] [<00000000b9b11231>] __sys_socket+0x138/0x250 net/socket.c:1636 [<000000004fb45142>] __do_sys_socket net/socket.c:1649 [inline] [<000000004fb45142>] __se_sys_socket net/socket.c:1647 [inline] [<000000004fb45142>] __x64_sys_socket+0x73/0xb0 net/socket.c:1647 [<0000000066999e0e>] do_syscall_x64 arch/x86/entry/common.c:50 [inline] [<0000000066999e0e>] do_syscall_64+0x38/0x90 arch/x86/entry/common.c:80 [<0000000017f238c1>] entry_SYSCALL_64_after_hwframe+0x63/0xcd BUG: memory leak unreferenced object 0xffff888017633a00 (size 240): comm "syz-executor392", pid 264, jiffies 4294785440 (age 13.044s) hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 00 00 00 00 00 2d 6d 0c 80 88 ff ff .........-m..... backtrace: [<000000002b1c4368>] __alloc_skb+0x229/0x320 net/core/skbuff.c:497 [<00000000143579a6>] alloc_skb include/linux/skbuff.h:1265 [inline] [<00000000143579a6>] sock_omalloc+0xaa/0x190 net/core/sock.c:2596 [<00000000be626478>] msg_zerocopy_alloc net/core/skbuff.c:1294 [inline] [<00000000be626478>] ---truncated---
Nasıl düzeltilir
- linux linux_kernel4.14.315, 4.19.283, 5.4.243, 5.10.180, 5.15.111, 6.1.28, 6.2.15, 6.3.2 ya da sonraki bir sürüm
- git.kernel.org/stable/c/1f69c086b20e27763af28145981435423f088268
- git.kernel.org/stable/c/230a5ed7d813fb516de81d23f09d7506753e41e9
- git.kernel.org/stable/c/281072fb2a7294cde7acbf5375b879f40a8001b7
- git.kernel.org/stable/c/30290f210ba7426ff7592fe2eb4114b1b5bad219
- git.kernel.org/stable/c/426384dd4980040651536fef5feac4dcc4d7ee4e
- git.kernel.org/stable/c/43e4197dd5f6b474a8b16f8b6a42cd45cf4f9d1a
- git.kernel.org/stable/c/50749f2dd6854a41830996ad302aef2ffaf011d8
- git.kernel.org/stable/c/602fa8af44fd55a58f9e94eb673e8adad2c6cc46
- git.kernel.org/stable/c/cb52e7f24c1d01a536a847dff0d1d95889cc3b5c
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| linux linux_kernel | 4.14 ≤ v < 4.14.315, 4.15 ≤ v < 4.19.283, 4.20 ≤ v < 5.4.243, 5.5 ≤ v < 5.10.180, 5.11 ≤ v < 5.15.111, 5.16 ≤ v < 6.1.28, 6.2 ≤ v < 6.2.15, 6.3 ≤ v < 6.3.2 | 4.14.315, 4.19.283, 5.4.243, 5.10.180, 5.15.111, 6.1.28, 6.2.15, 6.3.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.