🇰🇷 한글 설명
Linux 커널의 xHCI 드라이버에서 USB 장치 연결 해제 시 스트림 리소스를 해제하는 과정 중 원자적 컨텍스트(atomic context)에서 수면(sleep)이 발생하여 시스템 버그를 유발하는 취약점입니다. xhci_free_streams() 함수가 인터럽트가 비활성화된 상태에서 잠금(lock)을 보유한 채로 수면이 가능한 dma_free_coherent()를 호출하는 것이 원인입니다.
💡 쉬운 설명
USB 장치를 뽑을 때 컴퓨터 내부의 특정 작업이 잠시 멈춰야 하는 상황인데, 시스템이 '멈추면 안 되는 규칙'을 어기고 멈추려 시도하여 오류가 발생하는 문제입니다. 이로 인해 시스템이 불안정해지거나 충돌이 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
usb: xhci: Fix sleep in atomic context in xhci_free_streams()
When a USB device with active stream endpoints is disconnected,
xhci_free_streams() is called from the hub_event workqueue to
free the stream resources. It calls xhci_free_stream_info()
while holding xhci->lock with irqs disabled.
xhci_free_stream_info() invokes xhci_free_stream_ctx(), which
calls dma_free_coherent() for large stream context arrays.
dma_free_coherent() can sleep (e.g. via vunmap), triggering
a BUG when called from atomic context.
Call trace:
dma_free_attrs+0x174/0x220
xhci_free_stream_info+0xd0/0x11c
xhci_free_streams+0x278/0x37c
usb_free_streams+0x98/0xc0
usb_unbind_interface+0x1b8/0x2f8
device_release_driver_internal+0x1d4/0x2cc
device_release_driver+0x18/0x28
bus_remove_device+0x160/0x1a4
device_del+0x1ec/0x350
usb_disable_device+0x98/0x214
usb_disconnect+0xf0/0x35c
hub_event+0xab4/0x19ec
process_one_work+0x278/0x63c
Fix this by saving the stream_info pointers and clearing the
ep references under the lock, then calling xhci_free_stream_info()
outside the lock where sleeping is allowed.
📍 영향받는 시스템
Linux Kernel (xHCI driver implementation)
⚔️ 공격 벡터
물리적 또는 가상 USB 장치의 연결 해제(Disconnect)를 통한 트리거
🛡️ 대응 방법
커널 패치를 적용하여 스트림 정보 해제 작업을 잠금(lock) 외부에서 수행하도록 수정해야 합니다.
🔧 검증 코드
출력된 커널 버전을 확인하여 해당 취약점이 수정된 최신 패치 버전이 적용되었는지 확인합니다.