🇰🇷 한글 설명
Linux 커널의 uclogic HID 드라이버에서 장치 제거 시 inrange_timer가 재설정되어 발생하는 Use-After-Free 취약점입니다. timer_delete_sync() 호출 후 장치가 완전히 중지되기 전 타이머가 다시 활성화되어, 이미 해제된 메모리에 접근함으로써 시스템 불안정이나 권한 상승을 초래할 수 있습니다.
💡 쉬운 설명
컴퓨터 부품을 제거하는 과정에서 타이머 기능이 꺼진 줄 알았는데 다시 켜지면서, 이미 사라진 데이터 영역을 건드려 오류가 발생하는 문제입니다. 이로 인해 시스템이 멈추거나 보안 문제가 생길 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
HID: uclogic: fix use-after-free of inrange_timer on remove
uclogic_remove() cancels the pen in-range timer and then stops the
device:
timer_delete_sync(&drvdata->inrange_timer);
hid_hw_stop(hdev);
timer_delete_sync() only guarantees the timer is idle at that instant.
uclogic_raw_event_pen() keeps delivering pen reports until hid_hw_stop()
stops the transport several lines later, and every report with
pen->inrange == UCLOGIC_PARAMS_PEN_INRANGE_NONE re-arms the timer:
mod_timer(&drvdata->inrange_timer, jiffies + msecs_to_jiffies(100));
A report landing between the timer_delete_sync() call and the transport
teardown in hid_hw_stop() re-arms inrange_timer after it was cancelled.
uclogic_remove() then returns and the devm drvdata is freed, while
hid_hw_stop() has already freed the input device drvdata->pen_input
points at, so when the timer fires ~100 ms later
uclogic_inrange_timeout() dereferences freed memory -- a use-after-free
in timer-softirq context.
Swapping the two calls is not a fix: stopping the device first frees
drvdata->pen_input via hidinput_disconnect() while the timer may still
be pending, so a timer already armed before removal fires on the freed
input device in the window before timer_delete_sync() runs.
Use timer_shutdown_sync() before hid_hw_stop() instead. It cancels the
timer, waits for a running callback while pen_input is still valid, and
prevents any further re-arming -- a later mod_timer() from an in-flight
report is silently ignored -- so the timer is provably dead before
hid_hw_stop() frees the inputs. This is the ordering the timer core
documents for this "timer re-armed from another path" teardown case.
📍 영향받는 시스템
Linux kernel (uclogic HID driver 포함 버전)
⚔️ 공격 벡터
로컬 공격자가 특정 HID 장치(펜 등)를 제거하거나 연결을 해제하는 동작을 유도하여 발생
🛡️ 대응 방법
timer_delete_sync() 대신 timer_shutdown_sync()를 사용하여 장치 중지 전 타이머를 완전히 종료하도록 커널 패치 적용
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 수정된 최신 패치 버전인지 확인