CVE-2026-64127

Severity CVSS v4.0:
Pending analysis
Type:
Unavailable / Other
Publication date:
19/07/2026
Last modified:
13/08/2026

Description

In the Linux kernel, the following vulnerability has been resolved:<br /> <br /> Bluetooth: L2CAP: ecred_reconfigure: send packed pdu, not stack pointer<br /> <br /> Commit 1c08108f3014 ("Bluetooth: L2CAP: Avoid -Wflex-array-member-not-at-end<br /> warnings") converted the on-stack request PDU in l2cap_ecred_reconfigure()<br /> from an explicit packed struct to DEFINE_RAW_FLEX(), but did not adjust the<br /> size and source-pointer arguments to l2cap_send_cmd():<br /> <br /> - struct {<br /> - struct l2cap_ecred_reconf_req req;<br /> - __le16 scid;<br /> - } pdu;<br /> + DEFINE_RAW_FLEX(struct l2cap_ecred_reconf_req, pdu, scid, 1);<br /> ...<br /> l2cap_send_cmd(conn, chan-&gt;ident, L2CAP_ECRED_RECONF_REQ,<br /> sizeof(pdu), &amp;pdu);<br /> <br /> After the conversion, DEFINE_RAW_FLEX() expands to declare an anonymous<br /> union pdu_u plus a local pointer "pdu" pointing at it. Therefore:<br /> <br /> - sizeof(pdu) is now sizeof(struct l2cap_ecred_reconf_req *) = 8 on<br /> 64-bit (4 on 32-bit), not the 6 bytes of (mtu, mps, scid[1]).<br /> - &amp;pdu is the address of the local pointer&amp;#39;s stack storage, not the<br /> address of the request payload.<br /> <br /> l2cap_send_cmd() forwards (data, count) to l2cap_build_cmd(), which calls<br /> skb_put_data(skb, data, count). The L2CAP_ECRED_RECONFIGURE_REQ packet<br /> body therefore contains 8 bytes copied from the kernel stack starting at<br /> &amp;pdu -- the 8 bytes overlap the pdu pointer&amp;#39;s value, leaking a kernel<br /> stack address to the paired Bluetooth peer. The intended (mtu, mps, scid)<br /> fields are not transmitted at all, so the peer rejects the request as<br /> malformed and the L2CAP_ECRED_RECONFIGURE feature itself has been broken<br /> for the local-side initiator since the introducing commit landed.<br /> <br /> The sibling site l2cap_ecred_conn_req() in the same commit was converted<br /> correctly (sizeof(*pdu) + len, pdu); only this site was missed.<br /> <br /> Restore the original semantics: pass the full flex-struct size via<br /> struct_size(pdu, scid, 1) and the pdu pointer (the struct address) as<br /> the source.<br /> <br /> Validated on a stock 7.0-based host kernel via the real call path:<br /> setsockopt(SOL_BLUETOOTH, BT_RCVMTU, ...) on a BT_CONNECTED<br /> L2CAP_MODE_EXT_FLOWCTL socket emits an L2CAP_ECRED_RECONFIGURE_REQ<br /> whose body is 8 bytes (the on-stack pdu local&amp;#39;s value) rather than<br /> the expected 6. Three captures from fresh socket / fresh hciemu peer<br /> on the same host -- low bytes vary per call, high 0xffff confirms a<br /> kernel virtual address (KASLR-randomised stack slot, not a fixed<br /> string):<br /> <br /> RECONF_REQ body (ident=0x02 len=8): 42 fb 54 af 0e ca ff ff<br /> RECONF_REQ body (ident=0x02 len=8): 52 3d 2e af 0e ca ff ff<br /> RECONF_REQ body (ident=0x02 len=8): b2 fc 5b af 0e ca ff ff<br /> <br /> After this patch the body is 6 bytes carrying the expected<br /> little-endian (mtu, mps, scid).

Vulnerable products and versions

CPE From Up to
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.10 (including) 6.12.92 (excluding)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.13 (including) 6.18.34 (excluding)
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* 6.19 (including) 7.0.11 (excluding)
cpe:2.3:o:linux:linux_kernel:7.1:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.1:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.1:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:7.1:rc4:*:*:*:*:*:*