CVE-2026-64365 in Linux
요약
\~에 의해 VulDB • 2026. 07. 25.
리눅스 커널에서 다음 취약점이 해결되었습니다:
HID: letsketch - 드라이버 언바인드 시 inrange_timer에 대한 UAF(Use-After-Free) 수정
letsketch_driver는 .remove 콜백을 제공하지 않지만, letsketch_probe()는 장치별 타이머를 활성화합니다.
timer_setup(&data->inrange_timer, letsketch_inrange_timeout, 0);
타이머는 펜 인레인지(pen-in-range) 보고가 있을 때마다 raw_event에서 100ms의 타임아웃으로 재활성화되며, 해당 콜백은 합성 BTN_TOOL_PEN 릴리즈를 전달하기 위해 data->input_tablet을 역참조합니다.
letsketch_data는 devm_kzalloc()로 할당되고, input_dev 필드는 letsketch_setup_input_tablet()를 통해 devm으로 할당됩니다. 장치 언바인드(USB 제거 또는 rmmod) 시 HID 코어는 기본 정리 절차를 실행하고 devm 정리는 letsketch_data와 입력 장치를 모두 해제합니다. .remove 콜백이 존재하지 않기 때문에 타이머가 먼저 비워지지 않습니다: 만약 raw_event가 언바인드 후 약 100ms 이내에 타이머를 활성화했다면, 대기 중인 타이머는 이미 해지된 메모리에서 실행됩니다. 이는 data 및 data->input_tablet에 대한 UAF 읽기이며, 이어져서 해제된 input_dev로 input_report_key() / input_sync()가 호출됩니다.
동일한 문제는 probe 오류 경로에서도 발생할 수 있습니다: hid_hw_start()가 항상 폴링(quirk) 장치를 위해 I/O를 활성화한 후 실패하면, devm이 data를 해제하기 전에 raw_event에서 타이머가 활성화되었을 수 있습니다.
해결책은 먼저 hid_hw_stop()을 호출하는 .remove 콜백을 추가하는 것입니다. hid_hw_stop()은 raw_event()를 전달하는 URB들을 동기적으로 종료하므로, 반환 시에는 어떤 경로에서도 타이머를 재활성화할 수 없습니다. 그런 다음 timer_shutdown_sync()는 진행 중인 모든 콜백을 비우고 영구적으로 이후의 mod_timer() 호출을 비활성화합니다. probe 오류 경로에도 동일한 timer_shutdown_sync()를 적용하여 타이머가 data보다 오래 지속되지 않도록 보장합니다.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.