CVE-2022-48925

Severity CVSS v4.0:
Pending analysis
Type:
CWE-416 Use After Free
Publication date:
22/08/2024
Last modified:
23/08/2024

Description

In the Linux kernel, the following vulnerability has been resolved:<br /> <br /> RDMA/cma: Do not change route.addr.src_addr outside state checks<br /> <br /> If the state is not idle then resolve_prepare_src() should immediately<br /> fail and no change to global state should happen. However, it<br /> unconditionally overwrites the src_addr trying to build a temporary any<br /> address.<br /> <br /> For instance if the state is already RDMA_CM_LISTEN then this will corrupt<br /> the src_addr and would cause the test in cma_cancel_operation():<br /> <br /> if (cma_any_addr(cma_src_addr(id_priv)) &amp;&amp; !id_priv-&gt;cma_dev)<br /> <br /> Which would manifest as this trace from syzkaller:<br /> <br /> BUG: KASAN: use-after-free in __list_add_valid+0x93/0xa0 lib/list_debug.c:26<br /> Read of size 8 at addr ffff8881546491e0 by task syz-executor.1/32204<br /> <br /> CPU: 1 PID: 32204 Comm: syz-executor.1 Not tainted 5.12.0-rc8-syzkaller #0<br /> Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011<br /> Call Trace:<br /> __dump_stack lib/dump_stack.c:79 [inline]<br /> dump_stack+0x141/0x1d7 lib/dump_stack.c:120<br /> print_address_description.constprop.0.cold+0x5b/0x2f8 mm/kasan/report.c:232<br /> __kasan_report mm/kasan/report.c:399 [inline]<br /> kasan_report.cold+0x7c/0xd8 mm/kasan/report.c:416<br /> __list_add_valid+0x93/0xa0 lib/list_debug.c:26<br /> __list_add include/linux/list.h:67 [inline]<br /> list_add_tail include/linux/list.h:100 [inline]<br /> cma_listen_on_all drivers/infiniband/core/cma.c:2557 [inline]<br /> rdma_listen+0x787/0xe00 drivers/infiniband/core/cma.c:3751<br /> ucma_listen+0x16a/0x210 drivers/infiniband/core/ucma.c:1102<br /> ucma_write+0x259/0x350 drivers/infiniband/core/ucma.c:1732<br /> vfs_write+0x28e/0xa30 fs/read_write.c:603<br /> ksys_write+0x1ee/0x250 fs/read_write.c:658<br /> do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46<br /> entry_SYSCALL_64_after_hwframe+0x44/0xae<br /> <br /> This is indicating that an rdma_id_private was destroyed without doing<br /> cma_cancel_listens().<br /> <br /> Instead of trying to re-use the src_addr memory to indirectly create an<br /> any address derived from the dst build one explicitly on the stack and<br /> bind to that as any other normal flow would do. rdma_bind_addr() will copy<br /> it over the src_addr once it knows the state is valid.<br /> <br /> This is similar to commit bc0bdc5afaa7 ("RDMA/cma: Do not change<br /> route.addr.src_addr.ss_family")

Vulnerable products and versions

CPE From Up to
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.10 (including) 5.10.103 (excluding)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.11 (including) 5.15.26 (excluding)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 5.16 (including) 5.16.12 (excluding)