🇰🇷 한글 설명
Linux 커널의 letsketch HID 드라이버에서 장치 해제 시 타이머가 적절히 종료되지 않아 발생하는 Use-After-Free(UAF) 취약점입니다. 장치가 제거될 때 메모리가 해제된 후에도 타이머 콜백이 실행되어 해제된 메모리 영역에 접근함으로써 시스템 불안정성이나 권한 상승을 초래할 수 있습니다.
💡 쉬운 설명
기기가 컴퓨터에서 분리될 때, 기기를 관리하던 프로그램이 아직 작동 중인 타이머를 끄지 않아 발생합니다. 이로 인해 이미 사라진 데이터를 다시 읽으려 시도하면서 컴퓨터 시스템에 오류가 생길 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
HID: letsketch: fix UAF on inrange_timer at driver unbind
letsketch_driver does not provide a .remove callback, but
letsketch_probe() arms a per-device timer:
timer_setup(&data->inrange_timer, letsketch_inrange_timeout, 0);
The timer is re-armed from letsketch_raw_event() with a 100 ms
timeout on every pen-in-range report, and its callback dereferences
data->input_tablet to deliver a synthetic BTN_TOOL_PEN release.
letsketch_data is allocated with devm_kzalloc(), and its input_dev
fields are devm-allocated via letsketch_setup_input_tablet(). On
device unbind (USB unplug or rmmod), the HID core runs its default
teardown and devm cleanup frees both letsketch_data and the input
devices. Because no .remove callback exists, nothing drains the
timer first: if raw_event armed it within ~100 ms of the unbind,
the pending timer fires on freed memory. This is a UAF read of
data and of data->input_tablet, followed by input_report_key() /
input_sync() into the freed input_dev.
The same problem can occur on the probe error path: if
hid_hw_start() enabled I/O on an always-poll-quirk device and then
failed, raw_event may have armed the timer before devm releases
data.
Fix by adding a .remove callback that calls hid_hw_stop() first.
hid_hw_stop() synchronously kills the URBs that deliver raw_event(),
so once it returns no path can re-arm the timer. timer_shutdown_sync()
then drains any in-flight callback and permanently disables further
mod_timer() calls. Apply the same timer_shutdown_sync() in the probe
error path so the timer is guaranteed not to outlive data.
📍 영향받는 시스템
Linux kernel (letsketch HID driver 포함 버전)
⚔️ 공격 벡터
장치 해제(USB 분리 또는 모듈 제거) 시 발생하는 타이머 콜백을 이용한 메모리 오염
🛡️ 대응 방법
커널 패치를 통해 .remove 콜백에서 hid_hw_stop() 및 timer_shutdown_sync()를 호출하도록 업데이트
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 취약점이 수정된 패치 버전인지 확인합니다.