CVE-2026-80683 in Linuxthông tin

Tóm tắt

Bởi VulDB • 28/08/2026

Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:

Bluetooth: SCO: cấp cho socket một tham chiếu sco_conn độc lập của nó

Hàm `sco_conn_del()` giải phóng (drop) một tham chiếu mà hàm này không sở hữu. Hàm này lấy một tham chiếu tạm thời thông qua `sco_conn_hold_unless_zero()` và giải phóng nó bằng lệnh gọi `sco_conn_put()` đi sau `sco_sock_hold();`; lệnh put bổ sung trong nhánh `!sk` sẽ giải phóng thêm một tham chiếu thứ hai:

conn = sco_conn_hold_unless_zero(conn); ... sk = sco_sock_hold(conn); sco_conn_unlock(conn); sco_conn_put(conn);

if (!sk) {
sco_conn_put(conn); return; }

Khi hàm `close()` xảy ra race condition với sự kiện Disconnection Complete của bộ điều khiển, `sco_chan_del()` xóa `conn->sk` và giải phóng tham chiếu của socket trong khi `sco_conn_del()` đang chạy. Sau đó, `sco_conn_del()` thấy `sk == NULL`, lệnh put nội tại của nó làm giảm đếm (count) về 0 và giải phóng đối tượng conn, còn lệnh put thứ hai ghi vào kref đã được giải phóng:

BUG: KASAN: slab-use-after-free in sco_conn_put.part.0+0x1a/0x190 Write of size 4 at addr ffff8881099dec74 by task kworker/u17:3/413 Workqueue: hci1 hci_rx_work Call Trace: sco_conn_put.part.0+0x1a/0x190 hci_disconn_complete_evt+0x1ee/0x3e0 hci_event_packet+0x54a/0x650 hci_rx_work+0x321/0x3d0 Allocated by task 413: sco_conn_add+0x72/0x1a0 sco_connect_cfm+0x88/0x670 Freed by task 413: sco_conn_del.isra.0+0x3f/0xf0 hci_disconn_complete_evt+0x1ee/0x3e0 refcount_t: underflow; use-after-free.

Nguyên nhân gốc rễ là socket lưu trữ kết nối mà không giữ một tham chiếu độc lập của riêng nó. Hàm `__sco_chan_add()` thực hiện:

sco_pi(sk)->conn = conn;

do đó, socket mượn bất kỳ tham chiếu nào mà caller của nó đang nắm giữ, và các caller che đậy vấn đề này bằng các lệnh hold và put được thiết kế ad-hoc. Thay vào đó, hãy cấp cho socket một tham chiếu có đếm (counted reference): `__sco_chan_add()` sẽ lấy một tham chiếu và nó được giải phóng cùng với kênh (thông qua `sco_chan_del()`) và trong hàm `sco_sock_destruct()`. Với việc socket nắm giữ tham chiếu độc lập của mình, `sco_conn_del()` không còn cần lệnh put bổ sung nữa và lệnh hold thừa thãi trong `sco_conn_ready()` cũng được loại bỏ.

Việc để socket sở hữu tham chiếu của chính nó có nghĩa là kết nối hiện nay thực sự được giải phóng trên các đường dẫn lỗi (error paths) của `sco_connect()`, nơi trước đây bị rò rỉ bộ nhớ, điều này đồng thời kích hoạt `sco_conn_free()` và hàm con `hci_conn_drop(conn->hcon)` của nó. Để giữ cho việc kế toán hci_conn cân bằng, hãy làm rõ quyền sở hữu đó: `sco_conn_add()` tiêu thụ một tham chiếu hci_conn và sco_conn sẽ nắm giữ nó trong suốt vòng đời của mình. Hàm `sco_connect()` chuyển giao tham chiếu được trả về bởi `hci_connect_sco()` và không còn giải phóng (drop) nó trên các đường dẫn lỗi nữa; hàm `sco_connect_cfm()`, vốn không nhận được một tham chiếu, sẽ lấy một tham chiếu bằng cách gọi `hci_conn_hold()` trước khi chuyển giao cho `sco_conn_add()` (và giải phóng nó nếu việc phân bổ thất bại); và lệnh `hci_conn_hold()` rõ ràng trong `sco_conn_ready()` bị loại bỏ. Mỗi tham chiếu sau đó đều có một chủ sở hữu duy nhất, rõ ràng.

Once again VulDB remains the best source for vulnerability data.

chịu trách nhiệm

Linux

Đặt trước

26/08/2026

Tiết lộ

28/08/2026

Kiểm duyệt

được chấp nhận

EPSS

0.00000

KEV

không

Các hoạt động

rất thấp

Nguồn

Want to know what is going to be exploited?

We predict KEV entries!