Hi,

On Thu, Nov 28, 2024 at 11:41 PM Solar Designer <so...@openwall.com> wrote:
>
> Hi,
>
> Upon expiration of the maximum of 14 days embargo, I am forwarding a
> vulnerability report (and a couple of replies) that was erroneously
> sent to the linux-distros list and then was not fully handled.  We
> require information actionable for the distros within the maximum of 14
> days, which generally means that the upstream should be contacted first
> and should have a fix ready for the distros to include (or at least
> should expect that by the proposed public disclosure date).  The
> specific wording we use is:
>
> "For Linux kernel issues, you must notify the kernel security team first,
> wait for the fix, and only then notify linux-distros or oss-security
> (depending on whether the information is still private or already
> public, as well as on issue severity)."
>
> While we assume good faith even if the report is misaddressed (which we
> understand does happen as instructions are naturally more complicated
> than we'd have liked), unfortunately this time the reporter also did not
> reply to any of linux-distros' members questions, most notably "have you
> contacted either secur...@kernel.org or the bluetooth maintainers about
> this issue?"  Ideally, someone from linux-distros should have taken over
> and handled this fully - including asking s@k.o and the maintainers
> directly - but unfortunately this also did not happen this time.
>
> As you can see from the messages below, the issue may be the same as
> CVE-2024-27398 fixed by commit 483bc08181827fc475643272ffb69c533007e546
> ("Bluetooth: Fix use-after-free bugs caused by sco_sock_timeout").  The
> report claims that the "race condition bug has not been solved yet" by
> this commit, but then the only testing appears to have been on a kernel
> pre-dating this commit.
>
> I'm also attaching here some of the files from the reporter's referenced
> GitHub repo.  The main claimed PoC is a 9 MB file Linux-6.8.0-PoC.webm,
> not attached here, but I do attach the proposed patch, test.c "test case
> after patch" (as the commit message said), and most-relevant files from
> inside PoC.zip.  I preserved the filenames, but edited the Makefile and
> #include directives to avoid dependency on otherwise-unused files.  Both
> programs (test.c and poc.c) build for me on Rocky Linux 9.5 with
> bluez-libs-devel and fuse-devel installed.  I did not try running them.
>
> On a related note, my searching Linux kernel mailing lists for related
> keywords finds other issues also in Bluetooth and even specifically in
> SCO triggered by syzbot and with recent proposed patches:
>
> 2024-11-25 13:16 [syzbot] [bluetooth?] KASAN: slab-use-after-free Read in 
> sco_sock_connect syzbot
> 2024-11-25 23:58 ` [PATCH] Bluetooth: SCO: remove the redundant sco_conn_put 
> Edward Adam Davis

Well, I guess we are still expecting this to be handled via
secur...@kernel.org? And while there are some changes to SCO related
to sco_conn lifetime, and the patches mentioned above do not affect
the sco_connect to be invoked while helding sock_hold (proposed fix),
that said first we probably need to confirm the problem is still
reproducible upstream, if that is still reproducible I suspect we can
apply a similar fix that was done for ISO sockets since it is quite
similar to SCO sockets:

d40ae85ee62e ("Bluetooth: ISO: fix iso_conn related locking and
validity issues")

> Alexander
>
> From: tianshu qiu <jimuchutiansh...@gmail.com>
> To: linux-distros
> Subject: [vs-plain] Race condition vulnerability that can lead to UAF in 
> net/bluetooth/sco.c:sco_sock_connect
> Date: Thu, 14 Nov 2024 18:35:24 +0800
>
> On Thu, Nov 14, 2024 at 06:35:24PM +0800, tianshu qiu wrote:
> > The bug was introduced on Apr 11, 2023:
> > https://github.com/torvalds/linux/commit/9a8ec9e8ebb5a7c0cfbce2d6b4a6b67b2b78e8f3
> >
> > =*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*= BUG DETAILS
> > =*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=
> >
> > I found the bug when looking for unlocked access to ???struct sock???
> > objects in the ???net??? directory. I think that "struct sock" is shared
> > among multiple threads.
> > Access to struct sock object, especially reading and writing sk
> > ->sk_state, should call lock_sock(sk) in advance to lock, and call
> > release_sock(sk) to
> > unlock after the last access to ???struct sock??? object, so as to prevent
> > race between threads.
> >
> > =*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=
> >
> > static int sco_sock_connect(struct socket *sock, struct sockaddr
> > *addr, int alen, int flags)
> > {
> >         struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
> >         struct sock *sk = sock->sk;
> >         int err;
> >
> >         BT_DBG("sk %p", sk);
> >
> >         if (alen < sizeof(struct sockaddr_sco) ||
> >         addr->sa_family != AF_BLUETOOTH)
> >         return -EINVAL;
> >
> >         if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND)
> >                 return -EBADFD;
> >
> >         if (sk->sk_type != SOCK_SEQPACKET)
> >                 err = -EINVAL;
> >
> >         lock_sock(sk);
> >               // first lock-release pair
> >         /* Set destination address and psm */
> >         bacpy(&sco_pi(sk)->dst, &sa->sco_bdaddr);
> >         release_sock(sk);
> >            // first lock-release pair
> >
> >         err = sco_connect(sk);
> >         if (err)
> >                 return err;
> >
> >         lock_sock(sk);
> >                  // second lock-release pair
> >
> >         err = bt_sock_wait_state(sk, BT_CONNECTED,
> >         sock_sndtimeo(sk, flags & O_NONBLOCK));
> >
> >         release_sock(sk);
> >              // second lock-release pair
> >         return err;
> > }
> >
> >
> >
> > static int sco_connect(struct sock *sk)
> > {
> >         struct sco_conn *conn;
> >         struct hci_conn *hcon;
> >         struct hci_dev  *hdev;
> >
> >         ??????
> >
> >         hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, 
> > BDADDR_BREDR);
> >         if (!hdev)
> >                 return -EHOSTUNREACH;
> >
> >         hci_dev_lock(hdev);
> >
> >         ??????
> >
> >         hcon = hci_connect_sco(hdev, type, &sco_pi(sk)->dst,
> >         sco_pi(sk)->setting, &sco_pi(sk)->codec);
> >
> >         ??????
> >
> >         lock_sock(sk);
> >                  // third lock-release pair
> >
> >         err = sco_chan_add(conn, sk, NULL);
> >         if (err) {
> >                 release_sock(sk);
> >                 goto unlock;
> >         }
> >
> >         /* Update source addr of the socket */
> >         bacpy(&sco_pi(sk)->src, &hcon->src);
> >
> >         if (hcon->state == BT_CONNECTED) {
> >                 sco_sock_clear_timer(sk);
> >                 sk->sk_state = BT_CONNECTED;
> >         } else {
> >                 sk->sk_state = BT_CONNECT;
> >                 sco_sock_set_timer(sk, sk->sk_sndtimeo);
> >         }
> >
> >         release_sock(sk);
> >              // third lock-release pair
> >
> >         ......
> >
> > }
> >
> > =*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=
> >
> > To avoid possible circular locking, the commit that introduced the bug
> > splits the "lock-release" pair which protects the whole
> > sco_sock_connect to three parts.
> >
> > The "if" branch for determining sk ->sk_state in sco_sock_connect is
> > exposed outside the lock_sock(sk) protection, which can lead to race
> > condition if two threads
> > execute ???connect??? system calls simultaneously.
> > This will lead to dangling ???struct sco_conn??? object in the function
> > sco_chan_add, the calling procedure is:
> > sco_sock_connect -> sco_connect -> sco_chan_add -> __sco_chan_add.
> >
> > The timer associated to this dangling ???struct sco_conn??? object is
> > still work, even if the "struct sock" object was freed by the system
> > call "close", which will cause
> > UAF when timeout is reached.
> >
> > Although the following two commits attempt to solve the UAF issue in
> > sco_sock_timeout, race condition bug has not been solved yet:
> >
> > https://github.com/torvalds/linux/commit/1bf4470a3939c678fb822073e9ea77a0560bc6bb
> > https://github.com/torvalds/linux/commit/483bc08181827fc475643272ffb69c533007e546
> >
> > This is a serious vulnerability that can cause local privilege
> > escalation. I hope this vulnerability can be patched and assigned a
> > CVE number.
> >
> > =*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=
> > DMESG LOG 
> > =*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=
> >
> >
> > [ 1084.906919] BUG: KASAN: slab-use-after-free in sco_conn_del+0xa6/0x220
> > [ 1084.906940] Write of size 4 at addr ffff888122c06880 by task
> > kworker/u265:0/162
> >
> > [ 1084.906955] CPU: 0 PID: 162 Comm: kworker/u265:0 Not tainted 6.8.0 #4
> > [ 1084.906966] Hardware name: VMware, Inc. VMware Virtual
> > Platform/440BX Desktop Reference Platform, BIOS 6.00 11/12/2020
> > [ 1084.906974] Workqueue: hci0 hci_rx_work
> > [ 1084.906991] Call Trace:
> > [ 1084.906996]  <TASK>
> > [ 1084.907004]  dump_stack_lvl+0x48/0x70
> > [ 1084.907018]  print_report+0xd2/0x670
> > [ 1084.907028]  ? __pfx__raw_spin_lock_irqsave+0x10/0x10
> > [ 1084.907039]  ? kasan_complete_mode_report_info+0x8a/0x230
> > [ 1084.907052]  kasan_report+0xd7/0x120
> > [ 1084.907060]  ? sco_conn_del+0xa6/0x220
> > [ 1084.907070]  ? sco_conn_del+0xa6/0x220
> > [ 1084.907082]  kasan_check_range+0x11c/0x200
> > [ 1084.907092]  __kasan_check_write+0x14/0x30
> > [ 1084.907103]  sco_conn_del+0xa6/0x220
> > [ 1084.907114]  sco_connect_cfm+0x1d4/0xac0
> > [ 1084.907125]  ? __pfx_sco_connect_cfm+0x10/0x10
> > [ 1084.907135]  ? __pfx_mutex_lock+0x10/0x10
> > [ 1084.907147]  hci_sco_setup+0x397/0x570
> > [ 1084.907157]  ? __pfx_hci_sco_setup+0x10/0x10
> > [ 1084.907165]  ? __pfx_mutex_lock+0x10/0x10
> > [ 1084.907176]  hci_conn_complete_evt+0x957/0x1150
> > [ 1084.907186]  ? kasan_save_track+0x14/0x40
> > [ 1084.907196]  ? __pfx_hci_conn_complete_evt+0x10/0x10
> > [ 1084.907205]  ? __kasan_check_write+0x14/0x30
> > [ 1084.907216]  ? mutex_unlock+0x81/0xe0
> > [ 1084.907224]  ? __pfx_mutex_unlock+0x10/0x10
> > [ 1084.907235]  hci_event_packet+0x818/0x1080
> > [ 1084.907246]  ? __pfx_hci_conn_complete_evt+0x10/0x10
> > [ 1084.907256]  ? __pfx_hci_event_packet+0x10/0x10
> > [ 1084.907266]  ? __pfx__raw_spin_lock_irqsave+0x10/0x10
> > [ 1084.907275]  ? __pfx_hci_cmd_sync_complete+0x10/0x10
> > [ 1084.907286]  ? __kasan_check_read+0x11/0x20
> > [ 1084.907297]  hci_rx_work+0x312/0xd60
> > [ 1084.907308]  ? __pfx__raw_spin_lock_irq+0x10/0x10
> > [ 1084.907318]  process_one_work+0x577/0xd30
> > [ 1084.907371]  ? _raw_spin_lock_irq+0x8b/0x100
> > [ 1084.907384]  worker_thread+0x879/0x15a0
> > [ 1084.907392]  ? __pfx__raw_spin_lock_irqsave+0x10/0x10
> > [ 1084.907403]  ? __pfx_worker_thread+0x10/0x10
> > [ 1084.907411]  kthread+0x2b7/0x390
> > [ 1084.907421]  ? __pfx_kthread+0x10/0x10
> > [ 1084.907431]  ret_from_fork+0x44/0x90
> > [ 1084.907442]  ? __pfx_kthread+0x10/0x10
> > [ 1084.907451]  ret_from_fork_asm+0x1b/0x30
> > [ 1084.907497]  </TASK>
> >
> > [ 1084.907506] Allocated by task 3974:
> > [ 1084.907513]  kasan_save_stack+0x39/0x70
> > [ 1084.907522]  kasan_save_track+0x14/0x40
> > [ 1084.907527]  kasan_save_alloc_info+0x37/0x60
> > [ 1084.907537]  __kasan_kmalloc+0xc3/0xd0
> > [ 1084.907543]  __kmalloc+0x21f/0x530
> > [ 1084.907551]  sk_prot_alloc+0x16d/0x220
> > [ 1084.907560]  sk_alloc+0x35/0x750
> > [ 1084.907568]  bt_sock_alloc+0x2f/0x360
> > [ 1084.907576]  sco_sock_create+0xc6/0x390
> > [ 1084.907617]  bt_sock_create+0x152/0x320
> > [ 1084.907629]  __sock_create+0x212/0x500
> > [ 1084.907636]  __sys_socket+0x139/0x210
> > [ 1084.907670]  __x64_sys_socket+0x72/0xc0
> > [ 1084.907677]  do_syscall_64+0x82/0x180
> > [ 1084.907684]  entry_SYSCALL_64_after_hwframe+0x6e/0x76
> >
> > [ 1084.907750] Freed by task 3974:
> > [ 1084.907755]  kasan_save_stack+0x39/0x70
> > [ 1084.907760]  kasan_save_track+0x14/0x40
> > [ 1084.907764]  kasan_save_free_info+0x3b/0x60
> > [ 1084.907769]  poison_slab_object+0x10a/0x180
> > [ 1084.907773]  __kasan_slab_free+0x33/0x60
> > [ 1084.907777]  kfree+0xda/0x2f0
> > [ 1084.907782]  __sk_destruct+0x44e/0x640
> > [ 1084.907787]  sk_destruct+0xaa/0xd0
> > [ 1084.907792]  __sk_free+0xa5/0x300
> > [ 1084.907797]  sk_free+0x50/0x80
> > [ 1084.907802]  sco_sock_kill+0x12e/0x160
> > [ 1084.907808]  sco_sock_release+0x134/0x290
> > [ 1084.907813]  __sock_release+0xac/0x270
> > [ 1084.907817]  sock_close+0x15/0x30
> > [ 1084.907821]  __fput+0x205/0xa90
> > [ 1084.907825]  __fput_sync+0x3a/0x50
> > [ 1084.907829]  __x64_sys_close+0x7e/0xe0
> > [ 1084.907835]  do_syscall_64+0x82/0x180
> > [ 1084.907839]  entry_SYSCALL_64_after_hwframe+0x6e/0x76
> >
> > [ 1084.907847] The buggy address belongs to the object at ffff888122c06800
> >          which belongs to the cache kmalloc-rnd-04-1k of size 1024
> > [ 1084.907852] The buggy address is located 128 bytes inside of
> >          freed 1024-byte region [ffff888122c06800, ffff888122c06c00)
> >
> > [ 1084.907861] The buggy address belongs to the physical page:
> > [ 1084.907865] page:00000000dd0be509 refcount:1 mapcount:0
> > mapping:0000000000000000 index:0x0 pfn:0x122c00
> > [ 1084.907871] head:00000000dd0be509 order:3 entire_mapcount:0
> > nr_pages_mapped:0 pincount:0
> > [ 1084.907876] flags:
> > 0x17ffffc0000840(slab|head|node=0|zone=2|lastcpupid=0x1fffff)
> > [ 1084.907882] page_type: 0xffffffff()
> > [ 1084.907887] raw: 0017ffffc0000840 ffff88810004f040 dead000000000122
> > 0000000000000000
> > [ 1084.907892] raw: 0000000000000000 0000000080100010 00000001ffffffff
> > 0000000000000000
> > [ 1084.907895] page dumped because: kasan: bad access detected
> >
> > [ 1084.907900] Memory state around the buggy address:
> > [ 1084.907904]  ffff888122c06780: fc fc fc fc fc fc fc fc fc fc fc fc
> > fc fc fc fc
> > [ 1084.907908]  ffff888122c06800: fa fb fb fb fb fb fb fb fb fb fb fb
> > fb fb fb fb
> > [ 1084.907913] >ffff888122c06880: fb fb fb fb fb fb fb fb fb fb fb fb
> > fb fb fb fb
> > [ 1084.907916]                    ^
> > [ 1084.907920]  ffff888122c06900: fb fb fb fb fb fb fb fb fb fb fb fb
> > fb fb fb fb
> > [ 1084.907923]  ffff888122c06980: fb fb fb fb fb fb fb fb fb fb fb fb
> > fb fb fb fb
> > [ 1084.907927] 
> > ==================================================================
> > [ 1084.908048] Disabling lock debugging due to kernel taint
> > [ 1084.908054] ------------[ cut here ]------------
> > [ 1084.908057] refcount_t: addition on 0; use-after-free.
> > [ 1084.908141] WARNING: CPU: 0 PID: 162 at lib/refcount.c:25
> > refcount_warn_saturate+0x171/0x1a0
> > [ 1084.908174] Modules linked in: isofs snd_seq_dummy snd_hrtimer qrtr
> > intel_rapl_msr intel_rapl_common intel_uncore_frequency_common
> > intel_pmc_core intel_vsec pmt_telemetry pmt_class crct10dif_pclmul
> > polyval_clmulni snd_ens1371 polyval_generic snd_ac97_codec
> > ghash_clmulni_intel gameport sha256_ssse3 ac97_bus vmw_balloon
> > sha1_ssse3 snd_pcm aesni_intel uvcvideo crypto_simd snd_seq_midi
> > cryptd rapl snd_seq_midi_event videobuf2_vmalloc uvc snd_rawmidi
> > videobuf2_memops videobuf2_v4l2 snd_seq snd_seq_device videodev
> > snd_timer videobuf2_common snd mc btusb btmtk soundcore i2c_piix4
> > input_leds joydev mac_hid serio_raw vsock_loopback binfmt_misc
> > vmw_vsock_virtio_transport_common vmw_vsock_vmci_transport vsock
> > vmw_vmci sch_fq_codel ramoops reed_solomon vmwgfx drm_ttm_helper ttm
> > msr parport_pc ppdev lp parport efi_pstore nfnetlink dmi_sysfs
> > ip_tables x_tables autofs4 hid_generic crc32_pclmul usbhid psmouse
> > mptspi mptscsih e1000 ahci mptbase libahci scsi_transport_spi
> > pata_acpi floppy
> > [ 1084.908607] CPU: 0 PID: 162 Comm: kworker/u265:0 Tainted: G    B
> >           6.8.0 #4
> > [ 1084.908614] Hardware name: VMware, Inc. VMware Virtual
> > Platform/440BX Desktop Reference Platform, BIOS 6.00 11/12/2020
> > [ 1084.908618] Workqueue: hci0 hci_rx_work
> > [ 1084.908627] RIP: 0010:refcount_warn_saturate+0x171/0x1a0
> > [ 1084.908634] Code: 1d 81 1a eb 03 80 fb 01 0f 87 13 6f df 01 83 e3
> > 01 0f 85 4f ff ff ff 48 c7 c7 40 1c aa 84 c6 05 61 1a eb 03 01 e8 ef
> > de c3 fe <0f> 0b e9 35 ff ff ff 48 89 df e8 f0 99 59 ff e9 bc fe ff ff
> > 48 c7
> > [ 1084.908639] RSP: 0018:ffff888134717940 EFLAGS: 00010246
> > [ 1084.908644] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 
> > 0000000000000000
> > [ 1084.908648] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 
> > 0000000000000000
> > [ 1084.908651] RBP: ffff888134717950 R08: 0000000000000000 R09: 
> > 0000000000000000
> > [ 1084.908654] R10: 0000000000000000 R11: 0000000000000000 R12: 
> > 0000000000000002
> > [ 1084.908657] R13: ffff888104589000 R14: ffff888104589780 R15: 
> > ffff88810033dc08
> > [ 1084.908661] FS:  0000000000000000(0000) GS:ffff8881f3200000(0000)
> > knlGS:0000000000000000
> > [ 1084.908665] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> > [ 1084.908669] CR2: 000062bcbcecc5a0 CR3: 000000011de7a002 CR4: 
> > 00000000003706f0
> > [ 1084.908673] Call Trace:
> > [ 1084.908692]  <TASK>
> > [ 1084.908695]  ? show_regs+0x6d/0x80
> > [ 1084.908702]  ? __warn+0xcd/0x270
> > [ 1084.908706]  ? refcount_warn_saturate+0x171/0x1a0
> > [ 1084.908710]  ? report_bug+0x288/0x310
> > [ 1084.908715]  ? vprintk_default+0x1d/0x30
> > [ 1084.908720]  ? handle_bug+0x9f/0xd0
> > [ 1084.908724]  ? exc_invalid_op+0x18/0x50
> > [ 1084.908728]  ? asm_exc_invalid_op+0x1b/0x20
> > [ 1084.908736]  ? refcount_warn_saturate+0x171/0x1a0
> > [ 1084.908741]  sco_conn_del+0x1ef/0x220
> > [ 1084.908746]  sco_connect_cfm+0x1d4/0xac0
> > [ 1084.908751]  ? __pfx_sco_connect_cfm+0x10/0x10
> > [ 1084.908756]  ? __pfx_mutex_lock+0x10/0x10
> > [ 1084.908762]  hci_sco_setup+0x397/0x570
> > [ 1084.908766]  ? __pfx_hci_sco_setup+0x10/0x10
> > [ 1084.908769]  ? __pfx_mutex_lock+0x10/0x10
> > [ 1084.908774]  hci_conn_complete_evt+0x957/0x1150
> > [ 1084.908779]  ? kasan_save_track+0x14/0x40
> > [ 1084.908784]  ? __pfx_hci_conn_complete_evt+0x10/0x10
> > [ 1084.908788]  ? __kasan_check_write+0x14/0x30
> > [ 1084.908793]  ? mutex_unlock+0x81/0xe0
> > [ 1084.908797]  ? __pfx_mutex_unlock+0x10/0x10
> > [ 1084.908802]  hci_event_packet+0x818/0x1080
> > [ 1084.908807]  ? __pfx_hci_conn_complete_evt+0x10/0x10
> > [ 1084.908812]  ? __pfx_hci_event_packet+0x10/0x10
> > [ 1084.908816]  ? __pfx__raw_spin_lock_irqsave+0x10/0x10
> > [ 1084.908820]  ? __pfx_hci_cmd_sync_complete+0x10/0x10
> > [ 1084.908825]  ? __kasan_check_read+0x11/0x20
> > [ 1084.908831]  hci_rx_work+0x312/0xd60
> > [ 1084.908836]  ? __pfx__raw_spin_lock_irq+0x10/0x10
> > [ 1084.908841]  process_one_work+0x577/0xd30
> > [ 1084.908844]  ? _raw_spin_lock_irq+0x8b/0x100
> > [ 1084.908850]  worker_thread+0x879/0x15a0
> > [ 1084.908853]  ? __pfx__raw_spin_lock_irqsave+0x10/0x10
> > [ 1084.908859]  ? __pfx_worker_thread+0x10/0x10
> > [ 1084.908862]  kthread+0x2b7/0x390
> > [ 1084.908867]  ? __pfx_kthread+0x10/0x10
> > [ 1084.908871]  ret_from_fork+0x44/0x90
> > [ 1084.908876]  ? __pfx_kthread+0x10/0x10
> > [ 1084.908880]  ret_from_fork_asm+0x1b/0x30
> > [ 1084.908886]  </TASK>
> > [ 1084.908888] ---[ end trace 0000000000000000 ]---
> > [ 1084.908894] ------------[ cut here ]------------
> > [ 1084.908896] refcount_t: underflow; use-after-free.
> > [ 1084.908937] WARNING: CPU: 0 PID: 162 at lib/refcount.c:28
> > refcount_warn_saturate+0x13e/0x1a0
> > [ 1084.908946] Modules linked in: isofs snd_seq_dummy snd_hrtimer qrtr
> > intel_rapl_msr intel_rapl_common intel_uncore_frequency_common
> > intel_pmc_core intel_vsec pmt_telemetry pmt_class crct10dif_pclmul
> > polyval_clmulni snd_ens1371 polyval_generic snd_ac97_codec
> > ghash_clmulni_intel gameport sha256_ssse3 ac97_bus vmw_balloon
> > sha1_ssse3 snd_pcm aesni_intel uvcvideo crypto_simd snd_seq_midi
> > cryptd rapl snd_seq_midi_event videobuf2_vmalloc uvc snd_rawmidi
> > videobuf2_memops videobuf2_v4l2 snd_seq snd_seq_device videodev
> > snd_timer videobuf2_common snd mc btusb btmtk soundcore i2c_piix4
> > input_leds joydev mac_hid serio_raw vsock_loopback binfmt_misc
> > vmw_vsock_virtio_transport_common vmw_vsock_vmci_transport vsock
> > vmw_vmci sch_fq_codel ramoops reed_solomon vmwgfx drm_ttm_helper ttm
> > msr parport_pc ppdev lp parport efi_pstore nfnetlink dmi_sysfs
> > ip_tables x_tables autofs4 hid_generic crc32_pclmul usbhid psmouse
> > mptspi mptscsih e1000 ahci mptbase libahci scsi_transport_spi
> > pata_acpi floppy
> > [ 1084.909076] CPU: 0 PID: 162 Comm: kworker/u265:0 Tainted: G    B
> > W          6.8.0 #4
> > [ 1084.909081] Hardware name: VMware, Inc. VMware Virtual
> > Platform/440BX Desktop Reference Platform, BIOS 6.00 11/12/2020
> > [ 1084.909084] Workqueue: hci0 hci_rx_work
> > [ 1084.909090] RIP: 0010:refcount_warn_saturate+0x13e/0x1a0
> > [ 1084.909094] Code: eb 97 0f b6 1d af 1a eb 03 80 fb 01 0f 87 56 6f
> > df 01 83 e3 01 75 82 48 c7 c7 a0 1c aa 84 c6 05 93 1a eb 03 01 e8 22
> > df c3 fe <0f> 0b e9 68 ff ff ff 0f b6 1d 81 1a eb 03 80 fb 01 0f 87 13
> > 6f df
> > [ 1084.909097] RSP: 0018:ffff888134717940 EFLAGS: 00010246
> > [ 1084.909101] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 
> > 0000000000000000
> > [ 1084.909103] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 
> > 0000000000000000
> > [ 1084.909106] RBP: ffff888134717950 R08: 0000000000000000 R09: 
> > 0000000000000000
> > [ 1084.909108] R10: 0000000000000000 R11: 0000000000000000 R12: 
> > 0000000000000003
> > [ 1084.909110] R13: ffff888104589000 R14: ffff888104589780 R15: 
> > ffff88810033dc08
> > [ 1084.909113] FS:  0000000000000000(0000) GS:ffff8881f3200000(0000)
> > knlGS:0000000000000000
> > [ 1084.909116] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> > [ 1084.909119] CR2: 000062bcbcecc5a0 CR3: 000000011de7a002 CR4: 
> > 00000000003706f0
> > [ 1084.909122] Call Trace:
> > [ 1084.909124]  <TASK>
> > [ 1084.909127]  ? show_regs+0x6d/0x80
> > [ 1084.909132]  ? __warn+0xcd/0x270
> > [ 1084.909137]  ? refcount_warn_saturate+0x13e/0x1a0
> > [ 1084.909141]  ? report_bug+0x288/0x310
> > [ 1084.909145]  ? vprintk_default+0x1d/0x30
> > [ 1084.909149]  ? handle_bug+0x9f/0xd0
> > [ 1084.909153]  ? exc_invalid_op+0x18/0x50
> > [ 1084.909158]  ? asm_exc_invalid_op+0x1b/0x20
> > [ 1084.909164]  ? refcount_warn_saturate+0x13e/0x1a0
> > [ 1084.909168]  sco_conn_del+0x1dc/0x220
> > [ 1084.909174]  sco_connect_cfm+0x1d4/0xac0
> > [ 1084.909179]  ? __pfx_sco_connect_cfm+0x10/0x10
> > [ 1084.909184]  ? __pfx_mutex_lock+0x10/0x10
> > [ 1084.909189]  hci_sco_setup+0x397/0x570
> > [ 1084.909193]  ? __pfx_hci_sco_setup+0x10/0x10
> > [ 1084.909196]  ? __pfx_mutex_lock+0x10/0x10
> > [ 1084.909202]  hci_conn_complete_evt+0x957/0x1150
> > [ 1084.909206]  ? kasan_save_track+0x14/0x40
> > [ 1084.909211]  ? __pfx_hci_conn_complete_evt+0x10/0x10
> > [ 1084.909215]  ? __kasan_check_write+0x14/0x30
> > [ 1084.909220]  ? mutex_unlock+0x81/0xe0
> > [ 1084.909224]  ? __pfx_mutex_unlock+0x10/0x10
> > [ 1084.909228]  hci_event_packet+0x818/0x1080
> > [ 1084.909256]  ? __pfx_hci_conn_complete_evt+0x10/0x10
> > [ 1084.909261]  ? __pfx_hci_event_packet+0x10/0x10
> > [ 1084.909267]  ? __pfx__raw_spin_lock_irqsave+0x10/0x10
> > [ 1084.909272]  ? __pfx_hci_cmd_sync_complete+0x10/0x10
> > [ 1084.909278]  ? __kasan_check_read+0x11/0x20
> > [ 1084.909285]  hci_rx_work+0x312/0xd60
> > [ 1084.909291]  ? __pfx__raw_spin_lock_irq+0x10/0x10
> > [ 1084.909297]  process_one_work+0x577/0xd30
> > [ 1084.909301]  ? _raw_spin_lock_irq+0x8b/0x100
> > [ 1084.909308]  worker_thread+0x879/0x15a0
> > [ 1084.909312]  ? __pfx__raw_spin_lock_irqsave+0x10/0x10
> > [ 1084.909319]  ? __pfx_worker_thread+0x10/0x10
> > [ 1084.909323]  kthread+0x2b7/0x390
> > [ 1084.909328]  ? __pfx_kthread+0x10/0x10
> > [ 1084.909350]  ret_from_fork+0x44/0x90
> > [ 1084.909354]  ? __pfx_kthread+0x10/0x10
> > [ 1084.909359]  ret_from_fork_asm+0x1b/0x30
> > [ 1084.909364]  </TASK>
> > [ 1084.909366] ---[ end trace 0000000000000000 ]---
> >
> > =*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=
> > Environment 
> > =*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=
> >
> > linux-6.8.0
> > ubuntu 24.04
> > .config: https://github.com/qiutianshu/sco-race-condition/blob/main/config
> >
> > =*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=
> > Proof of Concept
> > =*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=
> >
> > https://github.com/qiutianshu/sco-race-condition/blob/main/Linux-6.8.0-PoC.webm
> >
> > =*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=
> > PATCH =*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*==*=*=*=*=*=*=*=*=
> >
> > My patch removes the three "lock-release" pairs in the original
> > sco_sock_connect, and use a single "lock-release" pair to protect the
> > whole connect procedure.
> > Circular locking have not been observed after patching:
> > https://github.com/qiutianshu/sco-race-condition/blob/main/test.c
> >
> > Patch:
> > https://github.com/qiutianshu/sco-race-condition/blob/main/diff.txt
>
> The replies originally included some quoting of the message above, which
> I excluded from the copies below.
>
> On Thu, Nov 14, 2024 at 07:51:20PM +0100, Vegard Nossum wrote:
> > Hi tianshu,
> >
> > Thank you for the report.
> >
> > At a glance, 483bc08181827fc475643272ffb69c533007e546 looks like it was
> > only committed in 6.9 yet your crash/kernel messages indicate you are
> > testing against 6.8.0 -- are you sure this wasn't fixed already? Could
> > you verify with a more recent kernel?
> >
> > Secondly, have you contacted either secur...@kernel.org or the bluetooth
> > maintainers about this issue? The maintainers would be:
> >
> > BLUETOOTH SUBSYSTEM
> > M:      Marcel Holtmann <mar...@holtmann.org>
> > M:      Johan Hedberg <johan.hedb...@gmail.com>
> > M:      Luiz Augusto von Dentz <luiz.de...@gmail.com>
> >
> > Please see the kernel documentation on reporting security issues:
> >
> > https://docs.kernel.org/process/security-bugs.html
> >
> > For CVE assignments, you need to contact the CVE assignment team:
> >
> > https://docs.kernel.org/process/cve.html
> >
> > However, be aware that CVE-2024-27398 was already assigned to the issue
> > fixed by commit 483bc08181827fc475643272ffb69c533007e546 ("Bluetooth:
> > Fix use-after-free bugs caused by sco_sock_timeout") -- which, if it's
> > the same issue, would also be the same CVE.
> >
> > I admit I haven't looked very closely at the code yet, I will try to
> > take a better look tomorrow. (Anybody else on the list is obviously
> > welcome to look as well.)
> >
> > Finally, I will point out that we usually require reporters to set an
> > embargo end-date according to the linux-distros list policy (usually 7
> > days, no more than 14 days), after which your report must also be made
> > public by posting it to oss-security; see:
> >
> > https://oss-security.openwall.org/wiki/mailing-lists/distros#list-policy-and-instructions-for-reporters
> >
> > Thanks,
> >
> > Vegard
>
> On Mon, Nov 18, 2024 at 09:33:27PM +0100, Salvatore Bonaccorso wrote:
> > Hi,
> >
> > Question back on your report: have you reached out first to the kernel
> > security team?
> >
> > Cf. 
> > https://oss-security.openwall.org/wiki/mailing-lists/distros#list-policy-and-instructions-for-reporters
> >
> > | Please consider notifying upstream projects/developers of the affected
> > | software, other affected distro vendors, and/or affected Open Source
> > | projects before notifying one of these mailing lists in order to
> > | readily have fixes for the distributions to apply and to ensure that
> > | these other parties are OK with the maximum embargo period that would
> > | apply (if not, you may delay your notification to the mailing list).
> > | For Linux kernel issues, you must notify the kernel security team
> > | first, wait for the fix, and only then notify linux-distros or
> > | oss-security (depending on whether the information is still private or
> > | already public, as well as on issue severity).
> >
> > Regards,
> > Salvatore



-- 
Luiz Augusto von Dentz

Reply via email to