CVE-2026-90251: Bluetooth: MSFT: validate evt_prefix_len against the response length
In the Linux kernel, the following vulnerability has been resolved:
Bluetooth: MSFT: validate evtprefixlen against the response length
readsupportedfeatures() only checks that the response covers the fixed part of struct msftrpreadsupportedfeatures, which is 11 bytes:
if (skb->len < sizeof(rp)) { btdeverr(hdev, "MSFT supported features length mismatch"); goto failed; }
evtprefix[] is a flexible array member and rp->evtprefixlen is an unvalidated u8 taken straight out of that response, so
msft->evtprefix = kmemdup(rp->evtprefix, rp->evtprefixlen, GFPKERNEL);
copies up to 255 bytes from a reply that may have carried none of them. What is copied is data the controller never sent, and it is then used to match incoming vendor events in msftvendorevt().
This is not an out-of-bounds access. An skb data allocation always has at least SKBDATAALIGN(sizeof(struct skbsharedinfo)) bytes past the payload, which is more than the 255 byte maximum, so the read stays inside the allocation and KASAN does not report it. It is still a read of bytes the host was never given, with the length fully controlled by the controller.
Reject a response that is too short for the prefix it declares.
Verified with an emulated controller over /dev/vhci on a KASAN kernel, with vhci made to advertise an MSFT opcode the way btintel, btqca, btmtk and btrtl do unconditionally. A reply of exactly 11 bytes declaring evtprefixlen = 255 reaches kmemdup and copies 255 bytes ("skb->len=11 evtprefixlen=255", with the copied buffer dumped); since the reply ends at the fixed part, all 255 come from past the end of the response. No KASAN report is produced, as expected from the allocation slack described above. With this patch the response is rejected with "MSFT event prefix length mismatch" and msft->evtprefix is left unset.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Configuration
Apply the Linux kernel fix that adds validation in the MSFT supported features event handling: validate evt_prefix_len against the response length and reject responses that are too short for the prefix it declares (i.e., ensure msft->evt_prefix/evt_prefix_len are only copied/used when skb->len is sufficient for rp->evt_prefix_len).
Linux kernel Bluetooth (MSFT) Reject response when evt_prefix_len is inconsistent with actual response length = implemented per patch