CVE-2026-89746 in Linux
요약
\~에 의해 VulDB • 2026. 09. 11.
리눅스 커널에서 다음 취약점이 해결되었습니다:
tracing: 동일한 이름을 가진 네임드 트리거에서의 use-after-free 수정
서로 다른 이벤트에 대한 두 개의 hist 트리거가 같은 name=을 사용하여 등록되면, 두 번째 트리거는 첫 번째를 named_data로 재사용합니다. save_hist_vars() 함수는 event_trigger_register() 이전에 호출되므로, 둘 다 event_hist_trigger_parse() 동안 tr->hist_vars에 추가됩니다. 그러나 이름의 중복은 나중에 hist_register_trigger()에서 감지됩니다.
이름 데이터 분기에서 hist_register_trigger()는 destroy_hist_data()를 통해 두 번째 히스토그램의 hist_data를 해제하지만, 그와 함께 tr->hist_vars 목록 항목도 제거하지 않습니다. 이로 인해 덩글링 포인터(dangling pointer)가 생성되고 해당 hist_data가 보유하고 있는 trace_array 참조가 누출됩니다.
나중에 변수를 참조하는 hist 트리거는 find_var_file()을 호출하여 tr->hist_vars를 순회하고 해제된 hist_data를 역참조합니다. 이 버그는 다음과 같이 세 개의 hist 트리거를 tracefs에 작성함으로써 사용자 공간에서 재현할 수 있습니다:
cd /sys/kernel/tracing echo 'hist:keys=common_pid:x=common_pid:name=mh' > events/sched/sched_switch/trigger echo 'hist:keys=common_pid:x=common_pid:name=mh' > events/sched/sched_process_fork/trigger echo 'hist:keys=common_pid:vals=$x' > events/sched/sched_process_exit/trigger
세 번째 작성은 커널을 패닉 상태로 만듭니다:
BUG: KASAN: slab-use-after-free in find_var_file.part.0+0x272/0x290 Read of size 8 at addr ffff888001f8a0e0 by task sh/1 CPU: 1 UID: 0 PID: 1 Comm: sh Tainted: G D N Call Trace: find_var_file.part.0 find_event_var parse_atom parse_expr __create_val_field event_hist_trigger_parse trigger_process_regex event_trigger_write vfs_write ksys_write do_syscall_64 entry_SYSCALL_64_after_hwframe Allocated by task 1: event_hist_trigger_parse Freed by task 1: hist_register_trigger+0x618/0xa30 event_hist_trigger_parse The buggy address belongs to freed 2048-byte region Oops: general protection fault ... RIP: find_var_file.part.0 Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
해결책은 hist_register_trigger()의 이름 데이터 분기에서 hist_data를 tr->hist_vars에서 제거하고, hist_data를 해제하기 전에 trace_array 참조를 해제하는 것입니다.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.