Blame SOURCES/CVE-2021-33034.patch

fcbf4e
From: Joe Lawrence <joe.lawrence@redhat.com>
fcbf4e
Subject: [RHEL7.9 KPATCH v2] bluetooth: kpatch fixes for CVE-2021-33034
fcbf4e
Date: Thu, 10 Jun 2021 16:45:14 -0400
fcbf4e
fcbf4e
Kernels:
fcbf4e
3.10.0-1160.el7
fcbf4e
3.10.0-1160.2.1.el7
fcbf4e
3.10.0-1160.2.2.el7
fcbf4e
3.10.0-1160.6.1.el7
fcbf4e
3.10.0-1160.11.1.el7
fcbf4e
3.10.0-1160.15.2.el7
fcbf4e
3.10.0-1160.21.1.el7
fcbf4e
3.10.0-1160.24.1.el7
fcbf4e
3.10.0-1160.25.1.el7
fcbf4e
3.10.0-1160.31.1.el7
fcbf4e
fcbf4e
Changes since last build:
fcbf4e
[x86_64]:
fcbf4e
hci_event.o: changed function: hci_event_packet
fcbf4e
hci_event.o: changed function: hci_loglink_complete_evt.isra.120
fcbf4e
hci_event.o: new function: hci_remote_name_evt.isra.69
fcbf4e
hci_event.o: new function: hci_user_passkey_request_evt.isra.111
fcbf4e
fcbf4e
[ppc64le]:
fcbf4e
hci_event.o: changed function: hci_cmd_status_evt
fcbf4e
hci_event.o: changed function: hci_event_packet
fcbf4e
hci_event.o: changed function: hci_inquiry_complete_evt.isra.37
fcbf4e
hci_event.o: changed function: hci_inquiry_result_evt.isra.46
fcbf4e
hci_event.o: changed function: hci_keypress_notify_evt.isra.109
fcbf4e
hci_event.o: changed function: hci_le_meta_evt
fcbf4e
hci_event.o: changed function: hci_link_key_request_evt.isra.49
fcbf4e
hci_event.o: changed function: hci_num_comp_blocks_evt.isra.117
fcbf4e
hci_event.o: changed function: hci_remote_ext_features_evt.isra.64
fcbf4e
hci_event.o: changed function: hci_sync_conn_complete_evt.isra.103
fcbf4e
hci_event.o: changed function: hci_user_passkey_notify_evt.isra.108
fcbf4e
hci_event.o: new function: conn_set_key
fcbf4e
hci_event.o: new function: hci_auth_complete_evt.isra.61
fcbf4e
hci_event.o: new function: hci_conn_request_evt.isra.56
fcbf4e
hci_event.o: new function: hci_inquiry_result_with_rssi_evt.isra.47
fcbf4e
hci_event.o: new function: hci_io_capa_request_evt.isra.104
fcbf4e
hci_event.o: new function: hci_outgoing_auth_needed.isra.2.part.3
fcbf4e
hci_event.o: new function: hci_pscan_rep_mode_evt.isra.54
fcbf4e
hci_event.o: new function: hci_remote_host_features_evt.isra.55
fcbf4e
hci_event.o: new function: hci_simple_pair_complete_evt.isra.62
fcbf4e
fcbf4e
---------------------------
fcbf4e
fcbf4e
Kernels:
fcbf4e
3.10.0-1160.el7
fcbf4e
3.10.0-1160.2.1.el7
fcbf4e
3.10.0-1160.2.2.el7
fcbf4e
3.10.0-1160.6.1.el7
fcbf4e
3.10.0-1160.11.1.el7
fcbf4e
3.10.0-1160.15.2.el7
fcbf4e
3.10.0-1160.21.1.el7
fcbf4e
3.10.0-1160.24.1.el7
fcbf4e
3.10.0-1160.25.1.el7
fcbf4e
3.10.0-1160.31.1.el7
fcbf4e
fcbf4e
Modifications: none
fcbf4e
fcbf4e
commit e103bba0f15a04cb71a2a472973a1ad79aabfd7a
fcbf4e
Author: Gopal Tiwari <gtiwari@redhat.com>
fcbf4e
Date:   Thu May 20 12:01:15 2021 +0530
fcbf4e
fcbf4e
    Bluetooth: verify AMP hci_chan before amp_destroy
fcbf4e
fcbf4e
    Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1962532
fcbf4e
fcbf4e
    CVE: CVE-2021-33034
fcbf4e
fcbf4e
    Testing: Sanity_only.
fcbf4e
fcbf4e
    Upstream: Merged.
fcbf4e
fcbf4e
    commit 5c4c8c9544099bb9043a10a5318130a943e32fc3
fcbf4e
    Author: Archie Pusaka <apusaka@chromium.org>
fcbf4e
    Date:   Mon Mar 22 14:03:11 2021 +0800
fcbf4e
fcbf4e
        Bluetooth: verify AMP hci_chan before amp_destroy
fcbf4e
fcbf4e
        hci_chan can be created in 2 places: hci_loglink_complete_evt() if
fcbf4e
        it is an AMP hci_chan, or l2cap_conn_add() otherwise. In theory,
fcbf4e
        Only AMP hci_chan should be removed by a call to
fcbf4e
        hci_disconn_loglink_complete_evt(). However, the controller might mess
fcbf4e
        up, call that function, and destroy an hci_chan which is not initiated
fcbf4e
        by hci_loglink_complete_evt().
fcbf4e
fcbf4e
        This patch adds a verification that the destroyed hci_chan must have
fcbf4e
        been init'd by hci_loglink_complete_evt().
fcbf4e
fcbf4e
        Example crash call trace:
fcbf4e
        Call Trace:
fcbf4e
         __dump_stack lib/dump_stack.c:77 [inline]
fcbf4e
         dump_stack+0xe3/0x144 lib/dump_stack.c:118
fcbf4e
         print_address_description+0x67/0x22a mm/kasan/report.c:256
fcbf4e
         kasan_report_error mm/kasan/report.c:354 [inline]
fcbf4e
         kasan_report mm/kasan/report.c:412 [inline]
fcbf4e
         kasan_report+0x251/0x28f mm/kasan/report.c:396
fcbf4e
         hci_send_acl+0x3b/0x56e net/bluetooth/hci_core.c:4072
fcbf4e
         l2cap_send_cmd+0x5af/0x5c2 net/bluetooth/l2cap_core.c:877
fcbf4e
         l2cap_send_move_chan_cfm_icid+0x8e/0xb1 net/bluetooth/l2cap_core.c:4661
fcbf4e
         l2cap_move_fail net/bluetooth/l2cap_core.c:5146 [inline]
fcbf4e
         l2cap_move_channel_rsp net/bluetooth/l2cap_core.c:5185 [inline]
fcbf4e
         l2cap_bredr_sig_cmd net/bluetooth/l2cap_core.c:5464 [inline]
fcbf4e
         l2cap_sig_channel net/bluetooth/l2cap_core.c:5799 [inline]
fcbf4e
         l2cap_recv_frame+0x1d12/0x51aa net/bluetooth/l2cap_core.c:7023
fcbf4e
         l2cap_recv_acldata+0x2ea/0x693 net/bluetooth/l2cap_core.c:7596
fcbf4e
         hci_acldata_packet net/bluetooth/hci_core.c:4606 [inline]
fcbf4e
         hci_rx_work+0x2bd/0x45e net/bluetooth/hci_core.c:4796
fcbf4e
         process_one_work+0x6f8/0xb50 kernel/workqueue.c:2175
fcbf4e
         worker_thread+0x4fc/0x670 kernel/workqueue.c:2321
fcbf4e
         kthread+0x2f0/0x304 kernel/kthread.c:253
fcbf4e
         ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:415
fcbf4e
fcbf4e
        Allocated by task 38:
fcbf4e
         set_track mm/kasan/kasan.c:460 [inline]
fcbf4e
         kasan_kmalloc+0x8d/0x9a mm/kasan/kasan.c:553
fcbf4e
         kmem_cache_alloc_trace+0x102/0x129 mm/slub.c:2787
fcbf4e
         kmalloc include/linux/slab.h:515 [inline]
fcbf4e
         kzalloc include/linux/slab.h:709 [inline]
fcbf4e
         hci_chan_create+0x86/0x26d net/bluetooth/hci_conn.c:1674
fcbf4e
         l2cap_conn_add.part.0+0x1c/0x814 net/bluetooth/l2cap_core.c:7062
fcbf4e
         l2cap_conn_add net/bluetooth/l2cap_core.c:7059 [inline]
fcbf4e
         l2cap_connect_cfm+0x134/0x852 net/bluetooth/l2cap_core.c:7381
fcbf4e
         hci_connect_cfm+0x9d/0x122 include/net/bluetooth/hci_core.h:1404
fcbf4e
         hci_remote_ext_features_evt net/bluetooth/hci_event.c:4161 [inline]
fcbf4e
         hci_event_packet+0x463f/0x72fa net/bluetooth/hci_event.c:5981
fcbf4e
         hci_rx_work+0x197/0x45e net/bluetooth/hci_core.c:4791
fcbf4e
         process_one_work+0x6f8/0xb50 kernel/workqueue.c:2175
fcbf4e
         worker_thread+0x4fc/0x670 kernel/workqueue.c:2321
fcbf4e
         kthread+0x2f0/0x304 kernel/kthread.c:253
fcbf4e
         ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:415
fcbf4e
fcbf4e
        Freed by task 1732:
fcbf4e
         set_track mm/kasan/kasan.c:460 [inline]
fcbf4e
         __kasan_slab_free mm/kasan/kasan.c:521 [inline]
fcbf4e
         __kasan_slab_free+0x106/0x128 mm/kasan/kasan.c:493
fcbf4e
         slab_free_hook mm/slub.c:1409 [inline]
fcbf4e
         slab_free_freelist_hook+0xaa/0xf6 mm/slub.c:1436
fcbf4e
         slab_free mm/slub.c:3009 [inline]
fcbf4e
         kfree+0x182/0x21e mm/slub.c:3972
fcbf4e
         hci_disconn_loglink_complete_evt net/bluetooth/hci_event.c:4891 [inline]
fcbf4e
         hci_event_packet+0x6a1c/0x72fa net/bluetooth/hci_event.c:6050
fcbf4e
         hci_rx_work+0x197/0x45e net/bluetooth/hci_core.c:4791
fcbf4e
         process_one_work+0x6f8/0xb50 kernel/workqueue.c:2175
fcbf4e
         worker_thread+0x4fc/0x670 kernel/workqueue.c:2321
fcbf4e
         kthread+0x2f0/0x304 kernel/kthread.c:253
fcbf4e
         ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:415
fcbf4e
fcbf4e
       The buggy address belongs to the object at ffff8881d7af9180
fcbf4e
         which belongs to the cache kmalloc-128 of size 128
fcbf4e
        The buggy address is located 24 bytes inside of
fcbf4e
         128-byte region [ffff8881d7af9180, ffff8881d7af9200)
fcbf4e
        The buggy address belongs to the page:
fcbf4e
        page:ffffea00075ebe40 count:1 mapcount:0 mapping:ffff8881da403200 index:0x0
fcbf4e
        flags: 0x8000000000000200(slab)
fcbf4e
        raw: 8000000000000200 dead000000000100 dead000000000200 ffff8881da403200
fcbf4e
        raw: 0000000000000000 0000000080150015 00000001ffffffff 0000000000000000
fcbf4e
        page dumped because: kasan: bad access detected
fcbf4e
fcbf4e
        Memory state around the buggy address:
fcbf4e
         ffff8881d7af9080: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
fcbf4e
         ffff8881d7af9100: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
fcbf4e
        >ffff8881d7af9180: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
fcbf4e
                                    ^
fcbf4e
         ffff8881d7af9200: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
fcbf4e
         ffff8881d7af9280: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
fcbf4e
fcbf4e
        Signed-off-by: Archie Pusaka <apusaka@chromium.org>
fcbf4e
        Reported-by: syzbot+98228e7407314d2d4ba2@syzkaller.appspotmail.com
fcbf4e
        Reviewed-by: Alain Michaud <alainm@chromium.org>
fcbf4e
        Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
fcbf4e
        Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
fcbf4e
fcbf4e
    Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
fcbf4e
fcbf4e
Signed-off-by: Joel Savitz <jsavitz@redhat.com> for v1
fcbf4e
Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
fcbf4e
Acked-by: Artem Savkov <asavkov@redhat.com>
fcbf4e
Acked-by: Yannick Cote <ycote@redhat.com>
fcbf4e
---
fcbf4e
fcbf4e
v1:
fcbf4e
- not posted, but Joel sent to my e-mail
fcbf4e
fcbf4e
v2:
fcbf4e
- minor code cleanup from v1, removed intermediate variables
fcbf4e
- a bunchmore ppc64le inlines changed, but this time I didn't attempt
fcbf4e
  to steer the compiler.  I assume it's a similar fool's errand as with
fcbf4e
  8.4, only with even more functions to worry about.
fcbf4e
- tested repro on ppc64le
fcbf4e
fcbf4e
Z-Status: merged
fcbf4e
fcbf4e
KT0 test PASS: https://beaker.engineering.redhat.com/jobs/5461337
fcbf4e
for kpatch-patch-3_10_0-1160-1-7.el7 scratch build:
fcbf4e
https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=37392562
fcbf4e
fcbf4e
 net/bluetooth/hci_event.c | 11 ++++++++++-
fcbf4e
 1 file changed, 10 insertions(+), 1 deletion(-)
fcbf4e
fcbf4e
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
fcbf4e
index e17aacbc5630..613b2493288f 100644
fcbf4e
--- a/net/bluetooth/hci_event.c
fcbf4e
+++ b/net/bluetooth/hci_event.c
fcbf4e
@@ -29,6 +29,9 @@
fcbf4e
 #include <net/bluetooth/bluetooth.h>
fcbf4e
 #include <net/bluetooth/hci_core.h>
fcbf4e
 #include <net/bluetooth/mgmt.h>
fcbf4e
+#include <linux/livepatch.h>
fcbf4e
+
fcbf4e
+#define KLP_CVE_2021_33034_HCHAN_AMP 0x2021330340000000
fcbf4e
 
fcbf4e
 #include "hci_request.h"
fcbf4e
 #include "hci_debugfs.h"
fcbf4e
@@ -4394,6 +4397,11 @@ static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
fcbf4e
 		return;
fcbf4e
 
fcbf4e
 	hchan->handle = le16_to_cpu(ev->handle);
fcbf4e
+	if (!klp_shadow_get_or_alloc(hchan, KLP_CVE_2021_33034_HCHAN_AMP,
fcbf4e
+				     0, GFP_KERNEL, NULL, NULL)) {
fcbf4e
+		hci_chan_del(hchan);
fcbf4e
+		return;
fcbf4e
+	}
fcbf4e
 
fcbf4e
 	BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
fcbf4e
 
fcbf4e
@@ -4426,9 +4434,10 @@ static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
fcbf4e
 	hci_dev_lock(hdev);
fcbf4e
 
fcbf4e
 	hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
fcbf4e
-	if (!hchan)
fcbf4e
+	if (!hchan || !klp_shadow_get(hchan, KLP_CVE_2021_33034_HCHAN_AMP))
fcbf4e
 		goto unlock;
fcbf4e
 
fcbf4e
+	klp_shadow_free(hchan, KLP_CVE_2021_33034_HCHAN_AMP, NULL);
fcbf4e
 	amp_destroy_logical_link(hchan, ev->reason);
fcbf4e
 
fcbf4e
 unlock:
fcbf4e
-- 
fcbf4e
2.26.3
fcbf4e
fcbf4e