|
|
e91b83 |
From: Joe Lawrence <joe.lawrence@redhat.com>
|
|
|
e91b83 |
Subject: [RHEL8.4 KPATCH v2] bluetooth: kpatch fixes for CVE-2021-33034
|
|
|
e91b83 |
Date: Thu, 10 Jun 2021 09:06:37 -0400
|
|
|
e91b83 |
|
|
|
fe08b2 |
Changes since last build:
|
|
|
fe08b2 |
[x86_64]:
|
|
|
fe08b2 |
hci_event.o: changed function: hci_event_packet
|
|
|
fe08b2 |
|
|
|
fe08b2 |
[ppc64le]:
|
|
|
fe08b2 |
hci_event.o: changed function: hci_event_packet
|
|
|
fe08b2 |
hci_event.o: new function: hci_resolve_name
|
|
|
fe08b2 |
|
|
|
fe08b2 |
---------------------------
|
|
|
fe08b2 |
|
|
|
fe08b2 |
Kernels:
|
|
|
fe08b2 |
4.18.0-305.el8
|
|
|
fe08b2 |
4.18.0-305.3.1.el8_4
|
|
|
fe08b2 |
|
|
|
fe08b2 |
Modifications:
|
|
|
fe08b2 |
- Remove modification of struct hci_chan and add hchan_amp
|
|
|
fe08b2 |
shadow variable as flag instead
|
|
|
fe08b2 |
|
|
|
fe08b2 |
commit 418fac0a2503c7e5b310052431cecab67a0efb8f
|
|
|
fe08b2 |
Author: Gopal Tiwari <gtiwari@redhat.com>
|
|
|
fe08b2 |
Date: Thu May 20 11:27:10 2021 +0530
|
|
|
fe08b2 |
|
|
|
fe08b2 |
Bluetooth: verify AMP hci_chan before amp_destroy
|
|
|
fe08b2 |
|
|
|
fe08b2 |
Bugzilla: https://bugzilla.redhat.com/1962544
|
|
|
fe08b2 |
CVE: CVE-2021-33034
|
|
|
fe08b2 |
Y-Commit: 162078c99ca2f976692d81b532a9eea80332cf82
|
|
|
fe08b2 |
|
|
|
fe08b2 |
O-Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1962546
|
|
|
fe08b2 |
|
|
|
fe08b2 |
O-CVE: CVE-2021-33034
|
|
|
fe08b2 |
|
|
|
fe08b2 |
Testing: Verified by me with the help of reproducer.
|
|
|
fe08b2 |
https://bugzilla.redhat.com/show_bug.cgi?id=1962546#c1
|
|
|
fe08b2 |
|
|
|
fe08b2 |
Upstream: Merged.
|
|
|
fe08b2 |
|
|
|
fe08b2 |
commit 5c4c8c9544099bb9043a10a5318130a943e32fc3
|
|
|
fe08b2 |
Author: Archie Pusaka <apusaka@chromium.org>
|
|
|
fe08b2 |
Date: Mon Mar 22 14:03:11 2021 +0800
|
|
|
fe08b2 |
|
|
|
fe08b2 |
Bluetooth: verify AMP hci_chan before amp_destroy
|
|
|
fe08b2 |
|
|
|
fe08b2 |
hci_chan can be created in 2 places: hci_loglink_complete_evt() if
|
|
|
fe08b2 |
it is an AMP hci_chan, or l2cap_conn_add() otherwise. In theory,
|
|
|
fe08b2 |
Only AMP hci_chan should be removed by a call to
|
|
|
fe08b2 |
hci_disconn_loglink_complete_evt(). However, the controller might mess
|
|
|
fe08b2 |
up, call that function, and destroy an hci_chan which is not initiated
|
|
|
fe08b2 |
by hci_loglink_complete_evt().
|
|
|
fe08b2 |
|
|
|
fe08b2 |
This patch adds a verification that the destroyed hci_chan must have
|
|
|
fe08b2 |
been init'd by hci_loglink_complete_evt().
|
|
|
fe08b2 |
|
|
|
fe08b2 |
Example crash call trace:
|
|
|
fe08b2 |
Call Trace:
|
|
|
fe08b2 |
__dump_stack lib/dump_stack.c:77 [inline]
|
|
|
fe08b2 |
dump_stack+0xe3/0x144 lib/dump_stack.c:118
|
|
|
fe08b2 |
print_address_description+0x67/0x22a mm/kasan/report.c:256
|
|
|
fe08b2 |
kasan_report_error mm/kasan/report.c:354 [inline]
|
|
|
fe08b2 |
kasan_report mm/kasan/report.c:412 [inline]
|
|
|
fe08b2 |
kasan_report+0x251/0x28f mm/kasan/report.c:396
|
|
|
fe08b2 |
hci_send_acl+0x3b/0x56e net/bluetooth/hci_core.c:4072
|
|
|
fe08b2 |
l2cap_send_cmd+0x5af/0x5c2 net/bluetooth/l2cap_core.c:877
|
|
|
fe08b2 |
l2cap_send_move_chan_cfm_icid+0x8e/0xb1 net/bluetooth/l2cap_core.c:4661
|
|
|
fe08b2 |
l2cap_move_fail net/bluetooth/l2cap_core.c:5146 [inline]
|
|
|
fe08b2 |
l2cap_move_channel_rsp net/bluetooth/l2cap_core.c:5185 [inline]
|
|
|
fe08b2 |
l2cap_bredr_sig_cmd net/bluetooth/l2cap_core.c:5464 [inline]
|
|
|
fe08b2 |
l2cap_sig_channel net/bluetooth/l2cap_core.c:5799 [inline]
|
|
|
fe08b2 |
l2cap_recv_frame+0x1d12/0x51aa net/bluetooth/l2cap_core.c:7023
|
|
|
fe08b2 |
l2cap_recv_acldata+0x2ea/0x693 net/bluetooth/l2cap_core.c:7596
|
|
|
fe08b2 |
hci_acldata_packet net/bluetooth/hci_core.c:4606 [inline]
|
|
|
fe08b2 |
hci_rx_work+0x2bd/0x45e net/bluetooth/hci_core.c:4796
|
|
|
fe08b2 |
process_one_work+0x6f8/0xb50 kernel/workqueue.c:2175
|
|
|
fe08b2 |
worker_thread+0x4fc/0x670 kernel/workqueue.c:2321
|
|
|
fe08b2 |
kthread+0x2f0/0x304 kernel/kthread.c:253
|
|
|
fe08b2 |
ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:415
|
|
|
fe08b2 |
|
|
|
fe08b2 |
Allocated by task 38:
|
|
|
fe08b2 |
set_track mm/kasan/kasan.c:460 [inline]
|
|
|
fe08b2 |
kasan_kmalloc+0x8d/0x9a mm/kasan/kasan.c:553
|
|
|
fe08b2 |
kmem_cache_alloc_trace+0x102/0x129 mm/slub.c:2787
|
|
|
fe08b2 |
kmalloc include/linux/slab.h:515 [inline]
|
|
|
fe08b2 |
kzalloc include/linux/slab.h:709 [inline]
|
|
|
fe08b2 |
hci_chan_create+0x86/0x26d net/bluetooth/hci_conn.c:1674
|
|
|
fe08b2 |
l2cap_conn_add.part.0+0x1c/0x814 net/bluetooth/l2cap_core.c:7062
|
|
|
fe08b2 |
l2cap_conn_add net/bluetooth/l2cap_core.c:7059 [inline]
|
|
|
fe08b2 |
l2cap_connect_cfm+0x134/0x852 net/bluetooth/l2cap_core.c:7381
|
|
|
fe08b2 |
hci_connect_cfm+0x9d/0x122 include/net/bluetooth/hci_core.h:1404
|
|
|
fe08b2 |
hci_remote_ext_features_evt net/bluetooth/hci_event.c:4161 [inline]
|
|
|
fe08b2 |
hci_event_packet+0x463f/0x72fa net/bluetooth/hci_event.c:5981
|
|
|
fe08b2 |
hci_rx_work+0x197/0x45e net/bluetooth/hci_core.c:4791
|
|
|
fe08b2 |
process_one_work+0x6f8/0xb50 kernel/workqueue.c:2175
|
|
|
fe08b2 |
worker_thread+0x4fc/0x670 kernel/workqueue.c:2321
|
|
|
fe08b2 |
kthread+0x2f0/0x304 kernel/kthread.c:253
|
|
|
fe08b2 |
ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:415
|
|
|
fe08b2 |
|
|
|
fe08b2 |
Freed by task 1732:
|
|
|
fe08b2 |
set_track mm/kasan/kasan.c:460 [inline]
|
|
|
fe08b2 |
__kasan_slab_free mm/kasan/kasan.c:521 [inline]
|
|
|
fe08b2 |
__kasan_slab_free+0x106/0x128 mm/kasan/kasan.c:493
|
|
|
fe08b2 |
slab_free_hook mm/slub.c:1409 [inline]
|
|
|
fe08b2 |
slab_free_freelist_hook+0xaa/0xf6 mm/slub.c:1436
|
|
|
fe08b2 |
slab_free mm/slub.c:3009 [inline]
|
|
|
fe08b2 |
kfree+0x182/0x21e mm/slub.c:3972
|
|
|
fe08b2 |
hci_disconn_loglink_complete_evt net/bluetooth/hci_event.c:4891 [inline]
|
|
|
fe08b2 |
hci_event_packet+0x6a1c/0x72fa net/bluetooth/hci_event.c:6050
|
|
|
fe08b2 |
hci_rx_work+0x197/0x45e net/bluetooth/hci_core.c:4791
|
|
|
fe08b2 |
process_one_work+0x6f8/0xb50 kernel/workqueue.c:2175
|
|
|
fe08b2 |
worker_thread+0x4fc/0x670 kernel/workqueue.c:2321
|
|
|
fe08b2 |
kthread+0x2f0/0x304 kernel/kthread.c:253
|
|
|
fe08b2 |
ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:415
|
|
|
fe08b2 |
|
|
|
fe08b2 |
The buggy address belongs to the object at ffff8881d7af9180
|
|
|
fe08b2 |
which belongs to the cache kmalloc-128 of size 128
|
|
|
fe08b2 |
The buggy address is located 24 bytes inside of
|
|
|
fe08b2 |
128-byte region [ffff8881d7af9180, ffff8881d7af9200)
|
|
|
fe08b2 |
The buggy address belongs to the page:
|
|
|
fe08b2 |
page:ffffea00075ebe40 count:1 mapcount:0 mapping:ffff8881da403200 index:0x0
|
|
|
fe08b2 |
flags: 0x8000000000000200(slab)
|
|
|
fe08b2 |
raw: 8000000000000200 dead000000000100 dead000000000200 ffff8881da403200
|
|
|
fe08b2 |
raw: 0000000000000000 0000000080150015 00000001ffffffff 0000000000000000
|
|
|
fe08b2 |
page dumped because: kasan: bad access detected
|
|
|
fe08b2 |
|
|
|
fe08b2 |
Memory state around the buggy address:
|
|
|
fe08b2 |
ffff8881d7af9080: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
|
|
|
fe08b2 |
ffff8881d7af9100: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
|
|
|
fe08b2 |
>ffff8881d7af9180: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
|
|
|
fe08b2 |
^
|
|
|
fe08b2 |
ffff8881d7af9200: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
|
|
|
fe08b2 |
ffff8881d7af9280: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
|
|
|
fe08b2 |
|
|
|
fe08b2 |
Signed-off-by: Archie Pusaka <apusaka@chromium.org>
|
|
|
fe08b2 |
Reported-by: syzbot+98228e7407314d2d4ba2@syzkaller.appspotmail.com
|
|
|
fe08b2 |
Reviewed-by: Alain Michaud <alainm@chromium.org>
|
|
|
fe08b2 |
Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
|
|
|
fe08b2 |
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
|
|
|
fe08b2 |
(cherry picked from commit 5c4c8c9544099bb9043a10a5318130a943e32fc3)
|
|
|
fe08b2 |
Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
|
|
|
fe08b2 |
Signed-off-by: Jan Stancek <jstancek@redhat.com>
|
|
|
fe08b2 |
|
|
|
fe08b2 |
Signed-off-by: Joel Savitz <jsavitz@redhat.com> for v1
|
|
|
fe08b2 |
Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
|
|
|
e91b83 |
Acked-by: Artem Savkov <asavkov@redhat.com>
|
|
|
e91b83 |
Acked-by: Yannick Cote <ycote@redhat.com>
|
|
|
e91b83 |
|
|
|
fe08b2 |
---
|
|
|
fe08b2 |
|
|
|
fe08b2 |
v2:
|
|
|
fe08b2 |
- minor code cleanup from v1, removed intermediate variables
|
|
|
fe08b2 |
- I tried forcing hci_resolve_name() as always_inline on ppc64le, but
|
|
|
fe08b2 |
this cascaded into a series of neverending inline / half inline / etc.
|
|
|
fe08b2 |
compiler decisions that I could never completely eliminate.
|
|
|
fe08b2 |
|
|
|
fe08b2 |
Z-MR: https://gitlab.com/redhat/rhel/src/kernel/rhel-8/-/merge_requests/692
|
|
|
fe08b2 |
|
|
|
fe08b2 |
KT0 test PASS: https://beaker.engineering.redhat.com/jobs/5457381
|
|
|
fe08b2 |
for kpatch-patch-4_18_0-193_1_2-1-12.el8_2 scratch build:
|
|
|
fe08b2 |
https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=37373415
|
|
|
fe08b2 |
|
|
|
fe08b2 |
net/bluetooth/hci_event.c | 11 ++++++++++-
|
|
|
fe08b2 |
1 file changed, 10 insertions(+), 1 deletion(-)
|
|
|
fe08b2 |
|
|
|
fe08b2 |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
|
|
|
fe08b2 |
index 8a7af33b0a3e..e66687f5b701 100644
|
|
|
fe08b2 |
--- a/net/bluetooth/hci_event.c
|
|
|
fe08b2 |
+++ b/net/bluetooth/hci_event.c
|
|
|
fe08b2 |
@@ -29,6 +29,9 @@
|
|
|
fe08b2 |
#include <net/bluetooth/bluetooth.h>
|
|
|
fe08b2 |
#include <net/bluetooth/hci_core.h>
|
|
|
fe08b2 |
#include <net/bluetooth/mgmt.h>
|
|
|
fe08b2 |
+#include <linux/livepatch.h>
|
|
|
fe08b2 |
+
|
|
|
fe08b2 |
+#define KLP_CVE_2021_33034_HCHAN_AMP 0x2021330340000000
|
|
|
fe08b2 |
|
|
|
fe08b2 |
#include "hci_request.h"
|
|
|
fe08b2 |
#include "hci_debugfs.h"
|
|
|
fe08b2 |
@@ -4929,6 +4932,11 @@ static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
|
|
fe08b2 |
return;
|
|
|
fe08b2 |
|
|
|
fe08b2 |
hchan->handle = le16_to_cpu(ev->handle);
|
|
|
fe08b2 |
+ if (!klp_shadow_get_or_alloc(hchan, KLP_CVE_2021_33034_HCHAN_AMP,
|
|
|
fe08b2 |
+ 0, GFP_KERNEL, NULL, NULL)) {
|
|
|
fe08b2 |
+ hci_chan_del(hchan);
|
|
|
fe08b2 |
+ return;
|
|
|
fe08b2 |
+ }
|
|
|
fe08b2 |
|
|
|
fe08b2 |
BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan);
|
|
|
fe08b2 |
|
|
|
fe08b2 |
@@ -4961,9 +4969,10 @@ static void hci_disconn_loglink_complete_evt(struct hci_dev *hdev,
|
|
|
fe08b2 |
hci_dev_lock(hdev);
|
|
|
fe08b2 |
|
|
|
fe08b2 |
hchan = hci_chan_lookup_handle(hdev, le16_to_cpu(ev->handle));
|
|
|
fe08b2 |
- if (!hchan)
|
|
|
fe08b2 |
+ if (!hchan || !klp_shadow_get(hchan, KLP_CVE_2021_33034_HCHAN_AMP))
|
|
|
fe08b2 |
goto unlock;
|
|
|
fe08b2 |
|
|
|
fe08b2 |
+ klp_shadow_free(hchan, KLP_CVE_2021_33034_HCHAN_AMP, NULL);
|
|
|
fe08b2 |
amp_destroy_logical_link(hchan, ev->reason);
|
|
|
fe08b2 |
|
|
|
fe08b2 |
unlock:
|
|
|
fe08b2 |
--
|
|
|
fe08b2 |
2.26.3
|
|
|
fe08b2 |
|