CVE-2026-64127 in Linux
Zusammenfassung
von VulDB • 19.07.2026
Im Linux-Kernel wurde folgende Schwachstelle behoben:
Bluetooth: L2CAP: ecred_reconfigure: PDU mit fester Größe senden, keinen Stackzeiger verwenden
Der Commit 1c08108f3014 („Bluetooth: L2CAP: Vermeiden von -Wflex-array-member-not-at-end-Warnungen") hat die on-stack-Anforderungs-PDU in l2cap_ecred_reconfigure() von einer expliziten gepackten Struktur (packed struct) zu DEFINE_RAW_FLEX() konvertiert, jedoch die Größen- und Quellzeigerargumente für l2cap_send_cmd() nicht angepasst:
- struct {
- struct l2cap_ecred_reconf_req req; - __le16 scid; - } pdu; + DEFINE_RAW_FLEX(struct l2cap_ecred_reconf_req, pdu, scid, 1); ... l2cap_send_cmd(conn, chan->ident, L2CAP_ECRED_RECONF_REQ, sizeof(pdu), &pdu);
Nach der Konvertierung expandiert DEFINE_RAW_FLEX() zu einer Deklaration eines anonymen Unions pdu_u sowie eines lokalen Zeigers „pdu", der darauf zeigt. Daher gilt:
- sizeof(pdu) ist nun sizeof(struct l2cap_ecred_reconf_req *) = 8 auf 64-Bit-Systemen (4 auf 32-Bit), nicht die 6 Bytes von (mtu, mps, scid[1]).
- &pdu ist die Adresse des Stack-Speichers des lokalen Zeigers und nicht die Adresse der Anforderungsnutzlast.
l2cap_send_cmd() leitet (data, count) an l2cap_build_cmd() weiter, das skb_put_data(skb, data, count) aufruft. Der Körper des L2CAP_ECRED_RECONFIGURE_REQ-Pakets enthält daher 8 Bytes, die ab &pdu vom Kernel-Stack kopiert wurden – diese 8 Bytes überschneiden sich mit dem Wert des pdu-Zeigers und leaken eine Kernel-Stack-Adresse an den verbundenen Bluetooth-Gegenstellen. Die vorgesehenen Felder (mtu, mps, scid) werden überhaupt nicht übertragen, sodass der Gegenstelle die Anforderung als fehlerhaft zurückweist und das L2CAP_ECRED_RECONFIGURE-Feature selbst für den lokalen Initiator seit dem Einbringen des einführenden Commits defekt ist.
Die Schwesterstelle l2cap_ecred_conn_req() im selben Commit wurde korrekt konvertiert (sizeof(*pdu) + len, pdu); nur diese Stelle wurde übersehen.
Wiederherstellung der ursprünglichen Semantik: Übergeben Sie die volle Flex-Strukturgröße via struct_size(pdu, scid, 1) und den pdu-Zeiger (die Strukturadresse) als Quelle.
Validiert auf einem stock-basierten Host-Kernel mit Version 7.0 über den echten Auferpfad: setsockopt(SOL_BLUETOOTH, BT_RCVMTU, ...) auf einem L2CAP_MODE_EXT_FLOWCTL-Socket im Zustand BT_CONNECTED sendet eine L2CAP_ECRED_RECONFIGURE_REQ, deren Körper aus 8 Bytes (dem Wert der lokalen on-stack pdu-Variablen) besteht und nicht den erwarteten 6 Byte. Drei Capture-Aufzeichnungen von frischem Socket / neuem hciemu-Gegenstelle auf demselben Host – die niedrigen Bytes variieren pro Aufruf, hohe 0xffff bestätigen eine Kernel-Adresse (KASLR-randomisierter Stack-Slot, keine feste Zeichenkette):
RECONF_REQ body (ident=0x02 len=8): 42 fb 54 af 0e ca ff ff RECONF_REQ body (ident=0x02 len=8): 52 3d 2e af 0e ca ff ff RECONF_REQ body (ident=0x02 len=8): b2 fc 5b af 0e ca ff ff
Nach diesem Patch besteht der Körper aus 6 Bytes, die das erwartete little-endian Format von (mtu, mps, scid) tragen.
If you want to get best quality of vulnerability data, you may have to visit VulDB.