🇰🇷 한글 설명
Linux 커널의 usb: typec: wcove 드라이버에서 wcove_read_rx_buffer() 함수가 구조체 크기를 초과하여 데이터를 쓰는 버퍼 오버플로 취약점이 발견되었습니다. 악의적인 USB 파트너가 허용된 크기보다 큰 데이터를 전송할 경우, 커널 스택의 데이터를 덮어쓸 수 있는 위험이 있습니다.
💡 쉬운 설명
USB 연결 장치가 컴퓨터에 잘못된 크기의 데이터를 보내면, 컴퓨터의 중요한 메모리 영역을 침범하여 시스템을 불안정하게 만들 수 있는 문제입니다. 이를 통해 해커가 시스템 제어권을 얻으려 시도할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
usb: typec: wcove: don't write past struct pd_message in wcove_read_rx_buffer()
wcove_read_rx_buffer() copies the PD RX FIFO into the caller's
struct pd_message with
for (i = 0; i < USBC_RXINFO_RXBYTES(info); i++)
regmap_read(wcove->regmap, USBC_RX_DATA + i, msg + i);
which has two problems:
USBC_RXINFO_RXBYTES() is a 5-bit field (max 31) while struct pd_message
is 30 bytes (__le16 header + __le32 payload[PD_MAX_PAYLOAD], packed).
The byte count latched in RXINFO is the number of bytes the port partner
put on the wire, so a malicious partner that transmits a 31-byte frame
can drive the loop one byte past the destination if the WCOVE BMC
receiver does not enforce the PD object-count limit in hardware. The
existing FIXME flagged this as unverified.
Independently, regmap_read() takes an unsigned int * and stores a full
unsigned int at the destination. Passing the byte pointer msg + i means
each iteration writes four bytes; the high three are zero (val_bits is
8) and are normally overwritten by the next iteration, but the final
iteration's high bytes are not. With RXBYTES == 30 the i == 29 iteration
already writes three zero bytes past msg, which sits on the IRQ thread's
stack in wcove_typec_irq().
Clamp the loop to sizeof(struct pd_message) and read each register into
a local before storing only its low byte, so the copy can never exceed
the destination regardless of what RXINFO reports.
📍 영향받는 시스템
Linux kernel (usb: typec: wcove 드라이버 포함 버전)
⚔️ 공격 벡터
악의적인 USB Type-C 파트너 장치를 통한 데이터 전송 (Physical/Local)
🛡️ 대응 방법
커널 패치를 통해 루프 범위를 pd_message 구조체 크기로 제한하고 데이터 쓰기 방식을 수정해야 합니다.
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 수정된 최신 패치 버전인지 확인합니다.