🇰🇷 한글 설명
리눅스 커널의 Bluetooth btnxpuart 드라이버에서 전력 절약 모드 스트레스 테스트 중 TX 타임아웃 오류가 발생하는 취약점입니다. 전력 절약 메커니즘이 UART break를 활성화하는 시점과 데이터 전송 작업이 동시에 예약될 때 상태 관리 오류로 인해 발생합니다. 뮤텍스(mutex)를 사용하여 UART break 제어 및 상태 읽기/쓰기 과정을 동기화함으로써 해결되었습니다.
💡 쉬운 설명
블루투스 기기가 절전 모드로 들어갈 때 데이터 전송 명령이 겹치면 통신이 끊기는 현상입니다. 시스템이 절전 상태인지 깨어있는 상태인지 제대로 구분하지 못해 발생하는 오류입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
Bluetooth: btnxpuart: Resolve TX timeout error in power save stress test
This fixes the tx timeout issue seen while running a stress test on
btnxpuart for couple of hours, such that the interval between two HCI
commands coincide with the power save timeout value of 2 seconds.
Test procedure using bash script:
<load btnxpuart.ko>
hciconfig hci0 up
//Enable Power Save feature
hcitool -i hci0 cmd 3f 23 02 00 00
while (true)
do
hciconfig hci0 leadv
sleep 2
hciconfig hci0 noleadv
sleep 2
done
Error log, after adding few more debug prints:
Bluetooth: btnxpuart_queue_skb(): 01 0A 20 01 00
Bluetooth: hci0: Set UART break: on, status=0
Bluetooth: hci0: btnxpuart_tx_wakeup() tx_work scheduled
Bluetooth: hci0: btnxpuart_tx_work() dequeue: 01 0A 20 01 00
Can't set advertise mode on hci0: Connection timed out (110)
Bluetooth: hci0: command 0x200a tx timeout
When the power save mechanism turns on UART break, and btnxpuart_tx_work()
is scheduled simultaneously, psdata->ps_state is read as PS_STATE_AWAKE,
which prevents the psdata->work from being scheduled, which is responsible
to turn OFF UART break.
This issue is fixed by adding a ps_lock mutex around UART break on/off as
well as around ps_state read/write.
btnxpuart_tx_wakeup() will now read updated ps_state value. If ps_state is
PS_STATE_SLEEP, it will first schedule psdata->work, and then it will
reschedule itself once UART break has been turned off and ps_state is
PS_STATE_AWAKE.
Tested above script for 50,000 iterations and TX timeout error was not
observed anymore.
📍 영향받는 시스템
Linux kernel (Bluetooth btnxpuart driver)
⚔️ 공격 벡터
로컬 시스템에서 특정 타이밍에 블루투스 명령을 반복 실행하여 통신 장애 유도 (DoS)
🛡️ 대응 방법
리눅스 커널을 최신 보안 패치가 적용된 버전으로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전 이후인지 확인