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.

출처

Want to know what is going to be exploited?

We predict KEV entries!