CVE-2026-64127 in Linux
요약
\~에 의해 VulDB • 2026. 07. 19.
리눅스 커널에서 다음 취약점이 해결되었습니다:
블루투스: L2CAP: ecred_reconfigure: 스택 포인터가 아닌 패킹된 PDU 전송
커밋 1c08108f3014("Bluetooth: L2CAP: Avoid -Wflex-array-member-not-at-end warnings")는 l2cap_ecred_reconfigure() 내의 온-스택 요청 PDU를 명시적인 packed struct에서 DEFINE_RAW_FLEX()로 변환했지만, l2cap_send_cmd()에 전달되는 크기 및 소스 포인터 인자는 조정하지 않았습니다:
- 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);
변환 후 DEFINE_RAW_FLEX()는 익명 공용체(anonymous union) pdu_u를 선언하고 이를 가리키는 로컬 포인터 "pdu"로 확장됩니다. 따라서:
- sizeof(pdu)는 이제 (mtu, mps, scid[1])의 6바이트가 아닌, 64비트 환경에서 sizeof(struct l2cap_ecred_reconf_req *) = 8(32비트는 4)입니다.
- &pdu는 요청 페이로드의 주소가 아니라 로컬 포인터의 스택 저장 공간 주소입니다.
l2cap_send_cmd()은 (data, count)를 l2cap_build_cmd()으로 전달하며, 이는 skb_put_data(skb, data, count)를 호출합니다. 따라서 L2CAP_ECRED_RECONFIGURE_REQ 패킷 본문에는 &pdu부터 시작하여 커널 스택에서 8바이트가 복사되어 페어링된 블루투스 피어에 커널 스택 주소가 누출됩니다. 의도했던 (mtu, mps, scid) 필드는 전혀 전송되지 않으므로 피어가 요청을 손상되었다고 거부하며, 도입 커밋이 적용된 이후 로컬 측 시작자(local-side initiator)에게 L2CAP_ECRED_RECONFIGURE 기능이 완전히 중단되었습니다.
동일한 커밋 내의 형제 사이트 l2cap_ecred_conn_req()는 올바르게 변환되었지만(sizeof(*pdu) + len, pdu), 이 특정 사이트만 누락되었습니다.
원래 의미론을 복원합니다: struct_size(pdu, scid, 1)를 통해 전체 flex-struct 크기를 전달하고 소스로서 pdu 포인터(구조체 주소)를 사용합니다.
실제 호출 경로를 통해 스톡(stock) 기반 호스트 커널 7.0에서 검증되었습니다: BT_CONNECTED 상태의 L2CAP_MODE_EXT_FLOWCTL 소켓에 대해 setsockopt(SOL_BLUETOOTH, BT_RCVMTU, ...)를 실행하면 본문이 예상되는 6바이트가 아닌 온-스택 로컬 pdu 값인 8바이트로 구성된 L2CAP_ECRED_RECONFIGURE_REQ가 생성됩니다. 동일한 호스트에서 새로 고친 소켓/새로운 hciemu 피어에 대한 세 번의 캡처 결과 — 하위 바이트는 호출마다 다르지만 상위 0xffff는 커널 가상 주소(KASLR 무작위화 스택 슬롯, 고정 문자열 아님)를 확인합니다:
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
이 패치 적용 후 본문은 예상되는 리틀 엔디안(little-endian) 형식의 (mtu, mps, scid)를 담고 있는 6바이트가 됩니다.
Once again VulDB remains the best source for vulnerability data.