Takashi Iwai 3ab36f
From 50535249f624d0072cd885bcdce4e4b6fb770160 Mon Sep 17 00:00:00 2001
Takashi Iwai 3ab36f
From: Eric Dumazet <edumazet@google.com>
Takashi Iwai 3ab36f
Date: Fri, 12 Mar 2021 08:59:48 -0800
Takashi Iwai 3ab36f
Subject: [PATCH] net: qrtr: fix a kernel-infoleak in qrtr_recvmsg()
Takashi Iwai 3ab36f
Git-commit: 50535249f624d0072cd885bcdce4e4b6fb770160
Takashi Iwai 3ab36f
Patch-mainline: v5.12-rc5
Takashi Iwai 3ab36f
References: CVE-2021-29647 bsc#1184192
Takashi Iwai 3ab36f
Takashi Iwai 3ab36f
struct sockaddr_qrtr has a 2-byte hole, and qrtr_recvmsg() currently
Takashi Iwai 3ab36f
does not clear it before copying kernel data to user space.
Takashi Iwai 3ab36f
Takashi Iwai 3ab36f
It might be too late to name the hole since sockaddr_qrtr structure is uapi.
Takashi Iwai 3ab36f
Takashi Iwai 3ab36f
Bug: KMSAN: kernel-infoleak in kmsan_copy_to_user+0x9c/0xb0 mm/kmsan/kmsan_hooks.c:249
Takashi Iwai 3ab36f
Cpu: 0 PID: 29705 Comm: syz-executor.3 Not tainted 5.11.0-rc7-syzkaller #0
Takashi Iwai 3ab36f
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Takashi Iwai 3ab36f
Call Trace:
Takashi Iwai 3ab36f
 __dump_stack lib/dump_stack.c:79 [inline]
Takashi Iwai 3ab36f
 dump_stack+0x21c/0x280 lib/dump_stack.c:120
Takashi Iwai 3ab36f
 kmsan_report+0xfb/0x1e0 mm/kmsan/kmsan_report.c:118
Takashi Iwai 3ab36f
 kmsan_internal_check_memory+0x202/0x520 mm/kmsan/kmsan.c:402
Takashi Iwai 3ab36f
 kmsan_copy_to_user+0x9c/0xb0 mm/kmsan/kmsan_hooks.c:249
Takashi Iwai 3ab36f
 instrument_copy_to_user include/linux/instrumented.h:121 [inline]
Takashi Iwai 3ab36f
 _copy_to_user+0x1ac/0x270 lib/usercopy.c:33
Takashi Iwai 3ab36f
 copy_to_user include/linux/uaccess.h:209 [inline]
Takashi Iwai 3ab36f
 move_addr_to_user+0x3a2/0x640 net/socket.c:237
Takashi Iwai 3ab36f
 ____sys_recvmsg+0x696/0xd50 net/socket.c:2575
Takashi Iwai 3ab36f
 ___sys_recvmsg net/socket.c:2610 [inline]
Takashi Iwai 3ab36f
 do_recvmmsg+0xa97/0x22d0 net/socket.c:2710
Takashi Iwai 3ab36f
 __sys_recvmmsg net/socket.c:2789 [inline]
Takashi Iwai 3ab36f
 __do_sys_recvmmsg net/socket.c:2812 [inline]
Takashi Iwai 3ab36f
 __se_sys_recvmmsg+0x24a/0x410 net/socket.c:2805
Takashi Iwai 3ab36f
 __x64_sys_recvmmsg+0x62/0x80 net/socket.c:2805
Takashi Iwai 3ab36f
 do_syscall_64+0x9f/0x140 arch/x86/entry/common.c:48
Takashi Iwai 3ab36f
 entry_SYSCALL_64_after_hwframe+0x44/0xa9
Takashi Iwai 3ab36f
Rip: 0033:0x465f69
Takashi Iwai 3ab36f
Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 bc ff ff ff f7 d8 64 89 01 48
Takashi Iwai 3ab36f
Rsp: 002b:00007f43659d6188 EFLAGS: 00000246 ORIG_RAX: 000000000000012b
Takashi Iwai 3ab36f
Rax: ffffffffffffffda RBX: 000000000056bf60 RCX: 0000000000465f69
Takashi Iwai 3ab36f
Rdx: 0000000000000008 RSI: 0000000020003e40 RDI: 0000000000000003
Takashi Iwai 3ab36f
Rbp: 00000000004bfa8f R08: 0000000000000000 R09: 0000000000000000
Takashi Iwai 3ab36f
R10: 0000000000010060 R11: 0000000000000246 R12: 000000000056bf60
Takashi Iwai 3ab36f
R13: 0000000000a9fb1f R14: 00007f43659d6300 R15: 0000000000022000
Takashi Iwai 3ab36f
Takashi Iwai 3ab36f
Local variable ----addr@____sys_recvmsg created at:
Takashi Iwai 3ab36f
 ____sys_recvmsg+0x168/0xd50 net/socket.c:2550
Takashi Iwai 3ab36f
 ____sys_recvmsg+0x168/0xd50 net/socket.c:2550
Takashi Iwai 3ab36f
Takashi Iwai 3ab36f
Bytes 2-3 of 12 are uninitialized
Takashi Iwai 3ab36f
Memory access of size 12 starts at ffff88817c627b40
Takashi Iwai 3ab36f
Data copied to user address 0000000020000140
Takashi Iwai 3ab36f
Takashi Iwai 3ab36f
Fixes: bdabad3e363d ("net: Add Qualcomm IPC router")
Takashi Iwai 3ab36f
Signed-off-by: Eric Dumazet <edumazet@google.com>
Takashi Iwai 3ab36f
Cc: Courtney Cavin <courtney.cavin@sonymobile.com>
Takashi Iwai 3ab36f
Reported-by: syzbot <syzkaller@googlegroups.com>
Takashi Iwai 3ab36f
Signed-off-by: David S. Miller <davem@davemloft.net>
Takashi Iwai 3ab36f
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 3ab36f
Takashi Iwai 3ab36f
---
Takashi Iwai 3ab36f
 net/qrtr/qrtr.c |    5 +++++
Takashi Iwai 3ab36f
 1 file changed, 5 insertions(+)
Takashi Iwai 3ab36f
Takashi Iwai 3ab36f
--- a/net/qrtr/qrtr.c
Takashi Iwai 3ab36f
+++ b/net/qrtr/qrtr.c
Takashi Iwai 3ab36f
@@ -815,6 +815,11 @@ static int qrtr_recvmsg(struct socket *s
Takashi Iwai 3ab36f
 	rc = copied;
Takashi Iwai 3ab36f
 
Takashi Iwai 3ab36f
 	if (addr) {
Takashi Iwai 3ab36f
+		/* There is an anonymous 2-byte hole after sq_family,
Takashi Iwai 3ab36f
+		 * make sure to clear it.
Takashi Iwai 3ab36f
+		 */
Takashi Iwai 3ab36f
+		memset(addr, 0, sizeof(*addr));
Takashi Iwai 3ab36f
+
Takashi Iwai 3ab36f
 		addr->sq_family = AF_QIPCRTR;
Takashi Iwai 3ab36f
 		addr->sq_node = le32_to_cpu(phdr->src_node_id);
Takashi Iwai 3ab36f
 		addr->sq_port = le32_to_cpu(phdr->src_port_id);