IPBUF安全漏洞报告
English
CVE-2023-53673 CVSS 7.8 高危

CVE-2023-53673 Linux内核蓝牙子系统释放后使用漏洞

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2023-53673
漏洞类型
释放后使用(Use-After-Free)
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel(蓝牙子系统 net/bluetooth)

相关标签

Linux Kernel蓝牙安全释放后使用Use-After-Free内核漏洞本地权限提升拒绝服务hci_eventL2CAPISO

漏洞概述

CVE-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,确保上层协议有机会清理引用。

攻击链分析

STEP 1
步骤1
攻击者通过本地低权限账户访问蓝牙子系统,建立ISO、L2CAP或SCO类型的蓝牙连接
STEP 2
步骤2
通过发送恶意的HCI断开连接命令,强制控制器返回失败状态码(如0x0c),触发hci_cs_disconnect的错误处理路径
STEP 3
步骤3
hci_cs_disconnect在未调用disconn_cfm回调的情况下直接调用hci_conn_del释放hci_conn结构体,导致上层协议(ISO/L2CAP/SCO)保留悬空指针
STEP 4
步骤4
攻击者通过已建立的socket发送数据,内核通过悬空指针访问已释放的hci_conn成员
STEP 5
步骤5
触发释放后使用漏洞,导致内核空指针解引用或KASAN检测到的slab-use-after-free,可造成系统崩溃(拒绝服务)或权限提升

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2023-53673 PoC - Trigger Use-After-Free in Bluetooth hci_cs_disconnect // This PoC demonstrates triggering the vulnerability by: // 1. Creating an ISO/L2CAP/SCO Bluetooth connection // 2. Forcing a disconnect command that fails (returns error status 0x0c) // 3. Attempting to send data through the socket after failed disconnect // // Note: Requires Bluetooth hardware (or virtual BT via QEMU) and root for HCI control #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <bluetooth/bluetooth.h> #include <bluetooth/l2cap.h> #include <bluetooth/iso.h> int main(int argc, char *argv[]) { int sock; struct sockaddr_l2 addr; char buf[48]; // Step 1: Create L2CAP socket sock = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); if (sock < 0) { perror("socket"); return 1; } // Step 2: Set up destination address (remote Bluetooth device) memset(&addr, 0, sizeof(addr)); addr.l2_family = AF_BLUETOOTH; bacpy(&addr.l2_bdaddr, (bdaddr_t *)argv[1]); // Target BT address addr.l2_psm = htobs(0x0001); // Step 3: Connect to remote device if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("connect"); close(sock); return 1; } // Step 4: Trigger disconnect with forced failure // Using HCI command to disconnect with invalid handle causing status 0x0c // This triggers hci_cs_disconnect with failed status, leading to UAF struct hci_request req; // ... (requires HCI socket privilege to send raw HCI commands) // Step 5: Attempt to send data - triggers UAF in l2cap_chan_send/hci_send_acl memset(buf, 'A', sizeof(buf)); write(sock, buf, sizeof(buf)); // Triggers slab-use-after-free or NULL deref close(sock); return 0; }

影响范围

Linux Kernel < 6.1.63
Linux Kernel 6.2 < 6.5.12
Linux Kernel 6.6 < 6.6.2
Linux Kernel 6.7-rc1 ~ 6.7-rc5

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议临时禁用蓝牙子系统以阻止漏洞利用。可以使用以下命令:sudo systemctl stop bluetooth && sudo systemctl disable bluetooth,或使用sudo rfkill block bluetooth禁用蓝牙设备。同时应限制本地非特权用户对蓝牙硬件的访问权限,并监控系统日志以发现潜在的攻击行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表