🇰🇷 한글 설명
Linux 커널의 Bluetooth hci_qca 드라이버에서 시리얼 포트가 닫힌 후에도 해당 포트에 쓰기 작업을 시도하여 발생하는 취약점입니다. 컨트롤러 설정 실패 시 전원 관리 프로세스가 닫힌 포트에 접근하면서 NULL 포인터 역참조를 유발하여 커널 패닉을 일으킬 수 있습니다.
💡 쉬운 설명
블루투스 장치를 사용하는 과정에서 오류가 발생했을 때, 이미 꺼진 통신 통로에 데이터를 보내려고 시도하다가 컴퓨터 시스템이 멈추는 문제입니다. 이로 인해 시스템이 갑자기 재부팅되거나 중단될 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
Bluetooth: hci_qca: Do not write to the serial port after it is closed
hci_uart_close() closes the serdev port if HCI_QUIRK_NON_PERSISTENT_SETUP
is set (for example, for the WCN399x family). A failed hci_dev_open_sync()
following a successful qca_setup() calls hdev->close() but not
hdev->shutdown(), so the port is closed while power->vregs_on is left true.
qca_serdev_remove() then passes its power->vregs_on test and calls
qca_power_off(), which writes to the closed port unconditionally.
Seen on a WCN3988 by unbinding the driver after a controller failure. The
trace below is from a 7.0.0 based kernel, where qca_power_off() was still
named qca_power_shutdown():
Unable to handle kernel NULL pointer dereference at virtual address
0000000000000038
Call trace:
tty_set_termios+0x50/0x238 (P)
ttyport_set_baudrate+0x84/0xc0
serdev_device_set_baudrate+0x24/0x40
qca_power_shutdown+0x158/0x1fc [hci_uart]
qca_serdev_remove+0x54/0x68 [hci_uart]
serdev_drv_remove+0x1c/0x2c
device_remove+0x4c/0x80
device_release_driver_internal+0x1cc/0x224
device_driver_detach+0x18/0x24
unbind_store+0xb4/0xc0
Check HCI_UART_PROTO_READY, which hci_uart_close() clears in the same place
it closes the port, before writing to it. The regulator disable is left
unconditional so the controller is still powered down.
The dangling serport->tty that turns this into a use-after-free is
addressed in a separate patch.
📍 영향받는 시스템
Linux kernel (WCN39xx 시리즈 등 hci_qca 드라이버를 사용하는 시스템)
⚔️ 공격 벡터
컨트롤러 실패 상황을 유도하거나 드라이버를 언바인딩(Unbinding)하여 커널 오류를 유발하는 로컬 공격
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하십시오.
🔧 검증 코드
출력된 커널 버전을 확인하여 해당 취약점이 해결된 패치 버전인지 확인하십시오.
💻 영향받는 소프트웨어
NVIDIA Cloud Gaming Guest Driver for Linux