🇰🇷 한글 설명
Linux 커널의 ALSA caiaq 드라이버에서 USB 장치의 참조 횟수(reference count)를 적절히 관리하지 않아 발생하는 취약점입니다. USB 장치가 연결 해제된 후에도 드라이버가 해당 장치 포인터에 접근하여 이미 해제된 메모리를 참조(Use-After-Free)하거나, 해제 과정에서 부적절한 장치 리셋을 시도하여 시스템 불안정을 초래할 수 있습니다.
💡 쉬운 설명
USB 장치를 뽑았을 때 컴퓨터가 해당 장치가 아직 연결되어 있다고 착각하여 잘못된 메모리 주소를 건드리는 문제입니다. 이로 인해 시스템이 멈추거나 오류가 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
ALSA: caiaq: take a reference on the USB device in create_card()
The caiaq driver stores a pointer to the parent USB device in
cdev->chip.dev but never takes a reference on it. The card's
private_free callback, snd_usb_caiaq_card_free(), can run
asynchronously via snd_card_free_when_closed() after the USB
device has already been disconnected and freed, so any access to
cdev->chip.dev in that path dereferences a freed usb_device.
On top of the refcounting issue, the current card_free implementation
calls usb_reset_device(cdev->chip.dev). A reset in a free callback
is inappropriate: the device is going away, the call takes the
device lock in a teardown context, and the reset races with the
disconnect path that the callback is already cleaning up after.
Take a reference on the USB device in create_card() with
usb_get_dev(), drop it with usb_put_dev() in the free callback,
and remove the usb_reset_device() call.
📍 영향받는 시스템
ALSA caiaq 드라이버를 사용하는 Linux 커널 버전
⚔️ 공격 벡터
USB 장치를 비정상적으로 연결 해제하거나 특정 드라이버 동작을 유도하여 메모리 오류 유발
🛡️ 대응 방법
커널 패치를 통해 create_card()에서 usb_get_dev()를 호출하고, free 콜백에서 usb_put_dev()를 수행하며 usb_reset_device() 호출을 제거해야 함
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 해결된 패치 버전인지 확인합니다.