Blame SOURCES/CVE-2023-4622.patch

1872b2
From 3709b9a67cdd88761a540b32a1f89007f0e1b5b3 Mon Sep 17 00:00:00 2001
1872b2
From: Ryan Sullivan <rysulliv@redhat.com>
1872b2
Date: Tue, 20 Feb 2024 13:30:50 -0500
1872b2
Subject: [KPATCH CVE-2023-4622] kpatch fixes for CVE-2023-4622
1872b2
1872b2
Kernels:
1872b2
3.10.0-1160.99.1.el7
1872b2
3.10.0-1160.102.1.el7
1872b2
3.10.0-1160.105.1.el7
1872b2
3.10.0-1160.108.1.el7
1872b2
1872b2
1872b2
Kpatch-MR: https://gitlab.com/redhat/prdsc/rhel/src/kpatch/rhel-7/-/merge_requests/68
1872b2
Approved-by: Joe Lawrence (@joe.lawrence)
1872b2
Changes since last build:
1872b2
[x86_64]:
1872b2
af_unix.o: changed function: unix_stream_sendpage
1872b2
sch_hfsc.o: changed function: hfsc_change_class
1872b2
1872b2
[ppc64le]:
1872b2
af_unix.o: changed function: unix_stream_sendpage
1872b2
1872b2
---------------------------
1872b2
1872b2
Modifications: none
1872b2
1872b2
commit 5697266978cafba4a0784a2bc81588abeb3d94a8
1872b2
Author: Guillaume Nault <gnault@redhat.com>
1872b2
Date:   Wed Jan 31 13:11:14 2024 +0100
1872b2
1872b2
    af_unix: Fix null-ptr-deref in unix_stream_sendpage().
1872b2
1872b2
    JIRA: https://issues.redhat.com/browse/RHEL-16144
1872b2
    Upstream Status: git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
1872b2
    CVE: CVE-2023-4622
1872b2
1872b2
    commit 790c2f9d15b594350ae9bca7b236f2b1859de02c
1872b2
    Author: Kuniyuki Iwashima <kuniyu@amazon.com>
1872b2
    Date:   Mon Aug 21 10:55:05 2023 -0700
1872b2
1872b2
        af_unix: Fix null-ptr-deref in unix_stream_sendpage().
1872b2
1872b2
        Bing-Jhong Billy Jheng reported null-ptr-deref in unix_stream_sendpage()
1872b2
        with detailed analysis and a nice repro.
1872b2
1872b2
        unix_stream_sendpage() tries to add data to the last skb in the peer's
1872b2
        recv queue without locking the queue.
1872b2
1872b2
        If the peer's FD is passed to another socket and the socket's FD is
1872b2
        passed to the peer, there is a loop between them.  If we close both
1872b2
        sockets without receiving FD, the sockets will be cleaned up by garbage
1872b2
        collection.
1872b2
1872b2
        The garbage collection iterates such sockets and unlinks skb with
1872b2
        FD from the socket's receive queue under the queue's lock.
1872b2
1872b2
        So, there is a race where unix_stream_sendpage() could access an skb
1872b2
        locklessly that is being released by garbage collection, resulting in
1872b2
        use-after-free.
1872b2
1872b2
        To avoid the issue, unix_stream_sendpage() must lock the peer's recv
1872b2
        queue.
1872b2
1872b2
        Note the issue does not exist in 6.5+ thanks to the recent sendpage()
1872b2
        refactoring.
1872b2
1872b2
        This patch is originally written by Linus Torvalds.
1872b2
1872b2
        BUG: unable to handle page fault for address: ffff988004dd6870
1872b2
        PF: supervisor read access in kernel mode
1872b2
        PF: error_code(0x0000) - not-present page
1872b2
        PGD 0 P4D 0
1872b2
        PREEMPT SMP PTI
1872b2
        CPU: 4 PID: 297 Comm: garbage_uaf Not tainted 6.1.46 #1
1872b2
        Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.org 04/01/2014
1872b2
        RIP: 0010:kmem_cache_alloc_node+0xa2/0x1e0
1872b2
        Code: c0 0f 84 32 01 00 00 41 83 fd ff 74 10 48 8b 00 48 c1 e8 3a 41 39 c5 0f 85 1c 01 00 00 41 8b 44 24 28 49 8b 3c 24 48 8d 4a 40 <49> 8b 1c 06 4c 89 f0 65 48 0f c7 0f 0f 94 c0 84 c0 74 a1 41 8b 44
1872b2
        RSP: 0018:ffffc9000079fac0 EFLAGS: 00000246
1872b2
        RAX: 0000000000000070 RBX: 0000000000000005 RCX: 000000000001a284
1872b2
        RDX: 000000000001a244 RSI: 0000000000400cc0 RDI: 000000000002eee0
1872b2
        RBP: 0000000000400cc0 R08: 0000000000400cc0 R09: 0000000000000003
1872b2
        R10: 0000000000000001 R11: 0000000000000000 R12: ffff888003970f00
1872b2
        R13: 00000000ffffffff R14: ffff988004dd6800 R15: 00000000000000e8
1872b2
        FS:  00007f174d6f3600(0000) GS:ffff88807db00000(0000) knlGS:0000000000000000
1872b2
        CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
1872b2
        CR2: ffff988004dd6870 CR3: 00000000092be000 CR4: 00000000007506e0
1872b2
        PKRU: 55555554
1872b2
        Call Trace:
1872b2
         <TASK>
1872b2
         ? __die_body.cold+0x1a/0x1f
1872b2
         ? page_fault_oops+0xa9/0x1e0
1872b2
         ? fixup_exception+0x1d/0x310
1872b2
         ? exc_page_fault+0xa8/0x150
1872b2
         ? asm_exc_page_fault+0x22/0x30
1872b2
         ? kmem_cache_alloc_node+0xa2/0x1e0
1872b2
         ? __alloc_skb+0x16c/0x1e0
1872b2
         __alloc_skb+0x16c/0x1e0
1872b2
         alloc_skb_with_frags+0x48/0x1e0
1872b2
         sock_alloc_send_pskb+0x234/0x270
1872b2
         unix_stream_sendmsg+0x1f5/0x690
1872b2
         sock_sendmsg+0x5d/0x60
1872b2
         ____sys_sendmsg+0x210/0x260
1872b2
         ___sys_sendmsg+0x83/0xd0
1872b2
         ? kmem_cache_alloc+0xc6/0x1c0
1872b2
         ? avc_disable+0x20/0x20
1872b2
         ? percpu_counter_add_batch+0x53/0xc0
1872b2
         ? alloc_empty_file+0x5d/0xb0
1872b2
         ? alloc_file+0x91/0x170
1872b2
         ? alloc_file_pseudo+0x94/0x100
1872b2
         ? __fget_light+0x9f/0x120
1872b2
         __sys_sendmsg+0x54/0xa0
1872b2
         do_syscall_64+0x3b/0x90
1872b2
         entry_SYSCALL_64_after_hwframe+0x69/0xd3
1872b2
        RIP: 0033:0x7f174d639a7d
1872b2
        Code: 28 89 54 24 1c 48 89 74 24 10 89 7c 24 08 e8 8a c1 f4 ff 8b 54 24 1c 48 8b 74 24 10 41 89 c0 8b 7c 24 08 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 33 44 89 c7 48 89 44 24 08 e8 de c1 f4 ff 48
1872b2
        RSP: 002b:00007ffcb563ea50 EFLAGS: 00000293 ORIG_RAX: 000000000000002e
1872b2
        RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f174d639a7d
1872b2
        RDX: 0000000000000000 RSI: 00007ffcb563eab0 RDI: 0000000000000007
1872b2
        RBP: 00007ffcb563eb10 R08: 0000000000000000 R09: 00000000ffffffff
1872b2
        R10: 00000000004040a0 R11: 0000000000000293 R12: 00007ffcb563ec28
1872b2
        R13: 0000000000401398 R14: 0000000000403e00 R15: 00007f174d72c000
1872b2
         </TASK>
1872b2
1872b2
        Fixes: 869e7c62486e ("net: af_unix: implement stream sendpage support")
1872b2
        Reported-by: Bing-Jhong Billy Jheng <billy@starlabs.sg>
1872b2
        Reviewed-by: Bing-Jhong Billy Jheng <billy@starlabs.sg>
1872b2
        Co-developed-by: Linus Torvalds <torvalds@linux-foundation.org>
1872b2
        Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1872b2
        Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
1872b2
        Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1872b2
1872b2
    Signed-off-by: Guillaume Nault <gnault@redhat.com>
1872b2
1872b2
Signed-off-by: Ryan Sullivan <rysulliv@redhat.com>
1872b2
---
1872b2
 net/unix/af_unix.c | 9 ++++-----
1872b2
 1 file changed, 4 insertions(+), 5 deletions(-)
1872b2
1872b2
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
1872b2
index a264b4598872..033986a95c3d 100644
1872b2
--- a/net/unix/af_unix.c
1872b2
+++ b/net/unix/af_unix.c
1872b2
@@ -1960,6 +1960,7 @@ static ssize_t unix_stream_sendpage(struct socket *socket, struct page *page,
1872b2
 
1872b2
 	if (false) {
1872b2
 alloc_skb:
1872b2
+		spin_unlock(&other->sk_receive_queue.lock);
1872b2
 		unix_state_unlock(other);
1872b2
 		mutex_unlock(&unix_sk(other)->iolock);
1872b2
 		newskb = sock_alloc_send_pskb(sk, 0, 0, flags & MSG_DONTWAIT,
1872b2
@@ -1999,6 +2000,7 @@ alloc_skb:
1872b2
 		init_scm = false;
1872b2
 	}
1872b2
 
1872b2
+	spin_lock(&other->sk_receive_queue.lock);
1872b2
 	skb = skb_peek_tail(&other->sk_receive_queue);
1872b2
 	if (tail && tail == skb) {
1872b2
 		skb = newskb;
1872b2
@@ -2029,14 +2031,11 @@ alloc_skb:
1872b2
 	atomic_add(size, &sk->sk_wmem_alloc);
1872b2
 
1872b2
 	if (newskb) {
1872b2
-		err = unix_scm_to_skb(&scm, skb, false);
1872b2
-		if (err)
1872b2
-			goto err_state_unlock;
1872b2
-		spin_lock(&other->sk_receive_queue.lock);
1872b2
+		unix_scm_to_skb(&scm, skb, false);
1872b2
 		__skb_queue_tail(&other->sk_receive_queue, newskb);
1872b2
-		spin_unlock(&other->sk_receive_queue.lock);
1872b2
 	}
1872b2
 
1872b2
+	spin_unlock(&other->sk_receive_queue.lock);
1872b2
 	unix_state_unlock(other);
1872b2
 	mutex_unlock(&unix_sk(other)->iolock);
1872b2
 
1872b2
-- 
1872b2
2.44.0
1872b2
1872b2