KernelScan.io

HIGH

bluetooth VirtIO OOB

CVE-2026-46123

CVSS 7.7 / 10.0 NVD

CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H

KernelScan AI6.8MEDIUM

01

In the Linux kernel, the following vulnerability has been resolved: Bluetooth: virtio_bt: clamp rx length before skb_put virtbt_rx_work() calls skb_put(skb, len) where len comes directly from virtqueue_get_buf() with no validation against the buffer we posted to the device. The RX skb is allocated in virtbt_add_inbuf() and exposed to virtio as exactly 1000 bytes via sg_init_one(). Checking len against skb_tailroom(skb) is not sufficient because alloc_skb() can leave more tailroom than the 1000 bytes actually handed to the device. A malicious or buggy backend can therefore report used.len between 1001 and skb_tailroom(skb), causing skb_put() to include uninitialized kernel heap bytes that were never written by the device. The same path also accepts len == 0, in which case skb_put(skb, 0) leaves the skb empty but virtbt_rx_handle() still reads the pkt_type byte from skb->data, consuming uninitialized memory. Define VIRTBT_RX_BUF_SIZE once and reuse it in alloc_skb() and sg_init_one(), and gate virtbt_rx_work() on that same constant so the bound checked matches the buffer actually exposed to the device. Reject used.len == 0 in the same gate so an empty completion can no longer reach virtbt_rx_handle(). Use bt_dev_err_ratelimited() because the length value comes from an untrusted backend that can otherwise flood the kernel log. Same class of bug as commit c04db81cd028 ("net/9p: Fix buffer overflow in USB transport layer"), which hardened the USB 9p transport against unchecked device-reported length.

02

Engine v0.2.0

Risk summary

A malicious or buggy virtio backend can cause the kernel to read uninitialized heap memory or trigger a kernel panic by reporting invalid buffer lengths to the virtio_bt driver. This affects guest VMs using the Bluetooth virtio transport. The vulnerability can lead to limited disclosure of adjacent kernel heap contents (C:Low) and denial of service via kernel panic when excessively large lengths cause skb_over_panic (A:High).

Affecteddrivers/bluetooth/virtio_bt.c (Bluetooth virtio transport)

Vulnerability analysis

The root cause is insufficient validation of the length parameter returned by virtqueue_get_buf() in virtbt_rx_work(). The RX buffer exposed to the device is exactly 1000 bytes, but the original code calls skb_put(skb, len) without enforcing this bound. If the backend reports a length between 1001 and skb_tailroom(skb), skb_put includes uninitialized heap bytes in the SKB that are later processed by virtbt_rx_handle(), resulting in an out-of-bounds read relative to the device buffer and information disclosure. If the backend reports a length greater than skb_tailroom(skb), skb_put() triggers skb_over_panic() and crashes the kernel. Additionally, len == 0 is accepted, causing virtbt_rx_handle() to read an uninitialized pkt_type byte. The fix introduces VIRTBT_RX_BUF_SIZE, rejects len == 0, and drops overlong completions.

03

BranchFixed inPatch commit
5.155.15.2094236e55b2d9d
6.16.1.175fd91fa2678ab
6.126.12.886c1730099a6f
6.186.18.30b40cdd1b1370
6.66.6.140ed41c81d30b2
7.07.0.7e6b4296f170d
mainline7.1-rc321bd244b6de5