CVE-2023-53673CVE-2023-53673是Linux内核蓝牙子系统中的一个高危释放后使用(Use-After-Free)漏洞,位于net/bluetooth/hci_event.c文件的hci_cs_disconnect函数中。该漏洞源于当HCI(Host Controller Interface)断开连接命令执行失败时,内核仍然调用hci_conn_del删除连接对象,但未先调用disconn_cfm回调通知上层协议(ISO、L2CAP、SCO)进行清理。由于ISO、L2CAP和SCO连接引用hci_conn时并未通过hci_conn_get增加引用计数,它们依赖于disconn_cfm回调来清理自身的连接引用。当disconn_cfm未被调用时,上层协议仍然持有已被释放的连接指针,导致后续操作(如iso_sock_sendmsg或l2cap_chan_send)访问已释放的内存区域,从而触发内核空指针解引用或KASAN检测到的slab-use-after-free错误。攻击者可以通过本地低权限账户触发该漏洞,实现权限提升或拒绝服务攻击。该漏洞影响多个Linux内核稳定版本,需要尽快升级修复。
该漏洞的核心问题在于hci_cs_disconnect函数的错误处理逻辑。当蓝牙控制器返回断开连接失败的状态码(如status 0x0c)时,hci_cs_disconnect仍然会调用hci_conn_del删除hci_conn结构体。然而,对于ISO、L2CAP和SCO类型的连接,它们在创建时通过iso_conn_add、l2cap_chan_add等函数引用hci_conn,但并未调用hci_conn_get增加引用计数。这些上层协议依赖hci_conn_del内部调用的disconn_cfm回调来清理自身的连接引用。当disconn_cfm未被调用时,上层协议仍然保留对已释放hci_conn的引用。后续当用户空间通过socket接口(如iso_sock_sendmsg或l2cap_sock_sendmsg)发送数据时,内核会通过已释放的指针访问hci_conn的成员,导致释放后使用漏洞。具体表现为:在ISO场景中触发iso_sock_sendmsg中的NULL指针解引用(地址0x668);在L2CAP场景中触发hci_send_acl中的slab-use-after-free(KASAN检测到读取已释放内存)。修复方案是在hci_cs_disconnect中调用hci_conn_del之前先调用hci_disconn_cfm,确保上层协议有机会清理引用。