🇰🇷 한글 설명
Linux 커널의 USB Type-C TCPM 드라이버에서 svdm_consume_modes() 함수가 루프 내부에서 배열 경계를 적절히 확인하지 않아 발생하는 취약점입니다. 악의적인 파트너 장치가 비정상적인 수의 VDO를 포함한 ACK를 전송할 경우, 배열 범위를 초과하여 메모리에 데이터를 쓰는 버퍼 오버플로우가 발생할 수 있습니다.
💡 쉬운 설명
USB-C 연결 시 상대방 장치가 가짜 정보를 과도하게 보내면, 컴퓨터의 메모리 영역을 침범하여 시스템 오류나 보안 문제를 일으킬 수 있는 결함입니다. 루프를 돌 때마다 데이터 개수를 확인하지 않아 발생하는 문제입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
usb: typec: tcpm: bound altmode_desc[] per iteration in svdm_consume_modes()
svdm_consume_modes() checks pmdata->altmodes against the array size once
before the loop over the count, but forgot to check the bound at every
point in the loop.
In the well-behaved SVDM discovery flow this is harmless because each of
at most SVID_DISCOVERY_MAX SVIDs contributes at most MODE_DISCOVERY_MAX
modes, exactly filling altmode_desc[ALTMODE_DISCOVERY_MAX]. But the
CMDT_RSP_ACK handler in tcpm_pd_svdm() does not correlate an incoming
ACK with any request the port actually sent. Once port->partner is set,
an unsolicited Discover Modes ACK is consumed unconditionally. A broken
or malicious port partner can therefore drive altmodes to
ALTMODE_DISCOVERY_MAX - 1 via the normal flow, and then send one extra
Discover Modes ACK with seven VDOs. Because the pre-loop check passes,
the loop could then writes up to five entries past altmode_desc[]. For
mode_data_prime the next field in struct tcpm_port is the
partner_altmode[] pointer array, which then receives partner-chosen
SVID/VDO bytes.
Move the bound check inside the loop so the array can never be indexed
past ALTMODE_DISCOVERY_MAX regardless of how many VDOs the partner
supplies or how the function was reached.
📍 영향받는 시스템
Linux kernel (USB Type-C TCPM subsystem)
⚔️ 공격 벡터
악의적으로 조작된 USB-C 파트너 장치를 통한 비정상적인 Discover Modes ACK 전송
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 svdm_consume_modes() 내 경계 검사 로직을 수정해야 합니다.
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 수정된 패치 버전 이상인지 확인합니다.