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->ident, L2CAP_ECRED_RECONF_REQ,<br />
sizeof(pdu), &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 />
- &pdu is the address of the local pointer&#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 />
&pdu -- the 8 bytes overlap the pdu pointer&#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&#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).
Impact
Base Score 3.x
5.50
Severity 3.x
MEDIUM
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:*:*:*:*:*:* |
To consult the complete list of CPE names with products and versions, see this page



