🇰🇷 한글 설명
Linux 커널의 xHCI 사이드밴드 엔드포인트 제거 함수(xhci_sideband_remove_endpoint)가 엔드포인트가 실행 중이며 유효한 전송 링이 있다고 잘못 가정하고 있었습니다. 이로 인해 suspend/resume, 재열거, 연결 해제 등의 상황에서 이미 해제되었거나 존재하지 않는 링을 참조하여 커널 크래시가 발생할 수 있었습니다. 링 접근을 제거하고 링 존재 여부와 엔드포인트 실행 상태를 확인하도록 수정되었습니다.
💡 쉬운 설명
USB 오디오 같은 장치의 연결 정보를 정리하는 과정에서 이미 사라진 데이터를 잘못 읽어 시스템이 멈출 수 있는 문제입니다. 수정으로 존재하지 않는 데이터를 건드리지 않도록 막았습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
xhci: sideband: don't dereference freed ring when removing sideband endpoint
xhci_sideband_remove_endpoint() incorrecly assumes that the endpoint is
running and has a valid transfer ring.
Lianqin reported a crash during suspend/wake-up stress testing, and
found the cause to be dereferencing a non-existing transfer ring
'ep->ring' during xhci_sideband_remove_endpoint().
The endpoint and its ring may be in unknown state if this function
is called after xHCI was reinitialized in resume (lost power), or if
device is being re-enumerated, disconnected or endpoint already dropped.
Fix this by both removing unnecessary ring access, and by checking
ep->ring exists before dereferencing it. Also make sure endpoint is
running before attempting to stop it.
Remove the xhci_initialize_ring_info() call during sideband endpoint
removal as is it only initializes ring structure enqueue, dequeue and
cycle state values to their starting values without changing actual
hardware enqueue, dequeue and cycle state. Leaving them out of sync
is worse than leaving it as it is. The endpoint will get freed in after
this in most usecases.
If the (audio) class driver want's to reuse the endpoint after offload
then it is up to the class driver to ensure endpoint is properly set up.
📍 영향받는 시스템
수정 이전의 xHCI 사이드밴드 기능을 사용하는 Linux 커널 버전 (안정 버전 패치 적용 여부에 따라 상이)
⚔️ 공격 벡터
로컬 사용자가 USB 장치 연결/해제 및 절전 복귀를 반복 유발하여 커널 크래시(서비스 거부)를 일으킬 수 있음
🛡️ 대응 방법
배포판 제공 최신 커널로 업데이트하여 해당 커널 패치를 적용
🔧 검증 코드
출력된 커널 버전을 배포판의 보안 공지에서 CVE-2026-23009 수정이 포함된 버전과 비교하고, 해당 버전 이상이면 패치된 것입니다.