Re: [PATCH v2] Bluetooth: hci_conn: Fix possible UAF

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Archie,

On Mon, Apr 3, 2023 at 3:44 PM Luiz Augusto von Dentz
<luiz.dentz@xxxxxxxxx> wrote:
>
> From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
>
> This fixes the following trace:
>
> ==================================================================
> BUG: KASAN: slab-use-after-free in hci_conn_del+0xba/0x3a0
> Write of size 8 at addr ffff88800208e9c8 by task iso-tester/31
>
> CPU: 0 PID: 31 Comm: iso-tester Not tainted 6.3.0-rc2-g991aa4a69a47
>  #4716
> Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.1-2.fc36
> 04/01/2014
> Call Trace:
>  <TASK>
>  dump_stack_lvl+0x1d/0x70
>  print_report+0xce/0x610
>  ? __virt_addr_valid+0xd4/0x150
>  ? hci_conn_del+0xba/0x3a0
>  kasan_report+0xdd/0x110
>  ? hci_conn_del+0xba/0x3a0
>  hci_conn_del+0xba/0x3a0
>  hci_conn_hash_flush+0xf2/0x120
>  hci_dev_close_sync+0x388/0x920
>  hci_unregister_dev+0x122/0x260
>  vhci_release+0x4f/0x90
>  __fput+0x102/0x430
>  task_work_run+0xf1/0x160
>  ? __pfx_task_work_run+0x10/0x10
>  ? mark_held_locks+0x24/0x90
>  exit_to_user_mode_prepare+0x170/0x180
>  syscall_exit_to_user_mode+0x19/0x50
>  do_syscall_64+0x4e/0x90
>  entry_SYSCALL_64_after_hwframe+0x70/0xda
>
> Fixes: 0f00cd322d22 ("Bluetooth: Free potentially unfreed SCO connection")
> Link: https://syzkaller.appspot.com/bug?extid=8bb72f86fc823817bc5d
> Cc: <stable@xxxxxxxxxxxxxxx>
> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
> ---
>  net/bluetooth/hci_conn.c | 30 ++++++++++++++++++++++++------
>  1 file changed, 24 insertions(+), 6 deletions(-)
>
> diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
> index fe8d54f8f04f..5672b4924572 100644
> --- a/net/bluetooth/hci_conn.c
> +++ b/net/bluetooth/hci_conn.c
> @@ -1069,6 +1069,17 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst,
>         return conn;
>  }
>
> +static bool hci_conn_unlink(struct hci_conn *conn)
> +{
> +       if (!conn->link)
> +               return false;
> +
> +       conn->link->link = NULL;
> +       conn->link = NULL;
> +
> +       return true;
> +}
> +
>  int hci_conn_del(struct hci_conn *conn)
>  {
>         struct hci_dev *hdev = conn->hdev;
> @@ -1080,15 +1091,16 @@ int hci_conn_del(struct hci_conn *conn)
>         cancel_delayed_work_sync(&conn->idle_work);
>
>         if (conn->type == ACL_LINK) {
> -               struct hci_conn *sco = conn->link;
> -               if (sco) {
> -                       sco->link = NULL;
> +               struct hci_conn *link = conn->link;
> +
> +               if (link) {
> +                       hci_conn_unlink(conn);
>                         /* Due to race, SCO connection might be not established
>                          * yet at this point. Delete it now, otherwise it is
>                          * possible for it to be stuck and can't be deleted.
>                          */
> -                       if (sco->handle == HCI_CONN_HANDLE_UNSET)
> -                               hci_conn_del(sco);
> +                       if (link->handle == HCI_CONN_HANDLE_UNSET)
> +                               hci_conn_del(link);
>                 }
>
>                 /* Unacked frames */
> @@ -1104,7 +1116,7 @@ int hci_conn_del(struct hci_conn *conn)
>                 struct hci_conn *acl = conn->link;
>
>                 if (acl) {
> -                       acl->link = NULL;
> +                       hci_conn_unlink(conn);
>                         hci_conn_drop(acl);
>                 }
>
> @@ -2444,6 +2456,12 @@ void hci_conn_hash_flush(struct hci_dev *hdev)
>                 c->state = BT_CLOSED;
>
>                 hci_disconn_cfm(c, HCI_ERROR_LOCAL_HOST_TERM);
> +
> +               /* Unlink before deleting otherwise it is possible that
> +                * hci_conn_del removes the link which may cause the list to
> +                * contain items already freed.
> +                */
> +               hci_conn_unlink(c);
>                 hci_conn_del(c);
>         }
>  }
> --
> 2.39.2

Can you give it a try if this doesn't break the existing problem you
were trying to fix, anyway it is quite easy to reproduce with the
likes of iso-tester and syzbot also seems to have bumped into it as
well.


-- 
Luiz Augusto von Dentz




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux