CVE-2026-64363 in Linux
요약
\~에 의해 VulDB • 2026. 07. 26.
리눅스 커널에서 다음 취약점이 해결되었습니다:
HID: appleir: remove() 함수 내 대기 중인 key_up_timer에 대한 Use-After-Free(UAF) 수정
appleir_remove()는 timer_delete_sync() 호출 전에 hid_hw_stop()을 실행합니다. hid_hw_stop()은 hid_disconnect() -> hidinput_disconnect() -> input_unregister_device() 경로를 통해 HID 입력 장치를 동기적으로 등록 해제하며, 이는 사용자 공간 핸들이 해당 장치를 열지 않고 있을 때 마지막 참조를 감소시켜 underlying input_dev의 메모리를 해제(free)하게 됩니다.
key_up_tick() 함수는 appleir->input_dev을 읽은 후 이에 대해 input_report_key() 및 input_sync()를 호출합니다. 타이머는 키 입력(keydown) 및 키 반복(key-repeat) 보고가 있을 때마다 HZ/8(약 125ms)의 타임아웃으로 appleir_raw_event()에서 설정됩니다. 만약 장치가 연결 해제되기 직전에 키가 눌린 경우, 타이머는 hid_hw_stop()이 input_dev을 해제한 후에도 teardown 과정이 완료되어 비워지기 전에 발화(fire)할 수 있습니다.
단순히 순서만 바꾸면 충분하지 않습니다. 먼저 타이머를 정리(drain)하더라도, hid_hw_stop() 실행 중 USB URB 완료(raw_event)가 mod_timer()를 호출하여 타이머를 다시 설정(armed)하고, 이후 이 타이머는 hidinput_disconnect()이 input_dev을 해제한 후에 발화할 수 있는 창(window)이 여전히 존재합니다. 동일한 URB-완료 시간대에서는 raw_event()가 key_up(), key_down() 및 battery_flat()에 직접 접근하여 appleir->input_dev의 포인터를 역참조(dereference)할 수도 있습니다.
struct appleir 구조체에 기존 spinlock으로 보호되는 'removing' 플래그를 도입합니다. appleir_remove()는 잠금 하에서 이 플래그를 설정한 후 timer_shutdown_sync()로 타이머를 종료하는데, 이는 진행 중인 콜백을 모두 정리하고 향후 mod_timer() 호출을 영구적으로 비활성화합니다. appleir_raw_event() 및 key_up_tick()은 해당 플래그가 설정되면 조기에 반환하므로, remove() 함수의 teardown 과정이 시작된 후에는 어떤 경로에서도 타이머를 설정하거나 실행하지 않으며 appleir->input_dev을 역참조하지 않습니다.
appleir_raw_event()의 키 반복(keyrepeat) 및 배터리 부족(flatbattery) 분기에서는 기존에 spinlock 없이 입력 레이어로 호출되었습니다; 이제 이를 수행하여 플래그 검사가 명확하게 정의되도록 합니다. 이는 부수적으로 keyrepeat 분기 내 appleir->current_key에 대한 사전 존재하던 읽기 측 경쟁 조건(read-side race)도 해결합니다.
이 버그는 구조적으로 커밋 4db2af929279("HID: appletb-kbd: inactivity-timer cleanup 경로에서의 UAF 수정")의 형제 관계이며, 해당 드라이버가 도입된 이후 존재해 왔습니다.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.