CVE-2026-64339 in Linux
요약
\~에 의해 VulDB • 2026. 07. 25.
리눅스 커널에서 다음 취약점이 해결되었습니다:
usb: misc: usbio: bulk IN 응답 길이를 수신된 전송 길이로 제한함
usbio_bulk_msg()는 bpkt_len = le16_to_cpu(bpkt->len) 바이트를 bulk IN 버퍼(usbio->rxbuf, 크기 usbio->rxbuf_len으로 할당됨)에서 호출자의 버퍼로 복사합니다. bpkt_len은 장치에 의해 완전히 제어되며 ibuf_len과 비교되는 것만 확인됩니다; ibuf_len은 다시 rxbuf_len이 아닌 usbio->txbuf_len과 비교됩니다:
if ((obuf_len > (usbio->txbuf_len - sizeof(*bpkt))) || (ibuf_len > (usbio->txbuf_len - sizeof(*bpkt)))) return -EMSGSIZE;
txbuf_len 및 rxbuf_len은 usbio_probe()에서 bulk OUT 및 bulk IN 엔드포인트의 wMaxPacketSize로부터 독립적으로 가져옵니다. 따라서 큰 bulk OUT 엔드포인트와 작은 bulk IN 엔드포인트를 광고하는(예: Lattice NX33U, 0x2ac1:0x20cb와 같은 쿼크 없는 ID 중 하나를 주장함으로써) 악성 또는 오작동 장치는 ibuf_len을 초과하게 만들고, 결과적으로 장치에서 제공하는 bpkt_len이 rxbuf_len보다 커집니다. memcpy()는 그 후 rxbuf 슬랩 객체의 끝부터 최대 txbuf_len - rxbuf_len 바이트까지 읽습니다. 과다 읽기된 바이트는 i2c 레이어로 전달되고 다시 i2c-dev를 통해 사용자 공간으로 노출되어 인접한 슬랩 메모리가 유출됩니다; KASAN에서는 이를 slab-out-of-bounds read(슬랩 범위 밖 읽기)로 보고합니다.
실제로 수신된 바이트 수는 이미 알려져 있습니다: act는 URB actual_length이며 rxbuf_len에 의해 제한됩니다. 수신된 것보다 더 많은 페이로드를 주장하는 모든 응답을 거부하여, 바로 위의 "act < sizeof(*bpkt)" 확인과 동일한 동작을 수행합니다.
제어 경로(usbio_ctrl_msg())에는 영향을 미치지 않습니다: 이 경로는 양방향 모두에서 단일 버퍼(ctrlbuf)를 사용하므로 해당 복사 작업은 할당 영역을 벗어날 수 없습니다.
코드 검토를 통해 발견되었습니다. AddressSanitizer 하에서 usbio_bulk_msg()의 수신 경로에 대한 충실한 사용자 공간 모델(rxbuf_len 크기의 버퍼, 동일한 act/ibuf_len/bpkt_len 확인 및 memcpy)으로 범위 밖 읽기가 확인되었습니다. USB raw-gadget + dummy_hcd 재현 코드도 제공됩니다.
VulDB is the best source for vulnerability data and more expert information about this specific topic.