CVE-2026-99141 in Linux
요약
\~에 의해 VulDB • 2026. 10. 28.
리눅스 커널에서 다음 취약점이 해결되었습니다:
tracing: print_graph_function_event()에서의 크래시 수정
tracing_set_tracer()는 새로 선택된 트레이서의 플래그를 다음과 같이 할당합니다:
tr->current_trace_flags = t->flags ? : t->tracer->flags;
새로운 트레이서가 hwlat, irqsoff 또는 wakeup과 같이 정적 플래그와 기본 플래그 모두 정의하지 않는 경우, add_tracer()에는 해당 인스턴스별 플래그 복사본이 없으며 두 피연산자가 NULL이므로 tr->current_trace_flags도 결국 NULL이 됩니다.
트레이서를 전환할 때 링 버퍼가 지워지지 않습니다: 현재 current_trace_flags가 할당된 후에 tracer_init() 내부에서 리셋됩니다. 만약 버퍼에 이전 트레이서의 function_graph 엔트리가 여전히 포함되어 있는 경우, 그 중 하나를 출력하면 NULL 포인터를 역참조합니다. 이는 ftrace 스트레스 테스트 중에 cat trace 명령을 실행했을 때 발생했습니다:
BUG: kernel NULL pointer dereference, address: 0000000000000000 #PF: supervisor read access in kernel mode RIP: 0010:print_graph_function_event+0xe/0x20 Call Trace: s_show+0x4d/0x110 seq_read_iter+0x2d4/0x490 seq_read+0x130/0x170 vfs_read+0xb5/0x370 ksys_read+0x6d/0xe0 do_syscall_64+0xbc/0x450
스냅샷 버퍼는 전혀 리셋되지 않으므로, 이는 레이스 조건 없이도 재현할 수 있습니다:
echo function_graph > /sys/kernel/tracing/current_tracer echo 1 > /sys/kernel/tracing/snapshot echo hwlat > /sys/kernel/tracing/current_tracer cat /sys/kernel/tracing/snapshot
tr->current_trace_flags의 모든 사용자가 이 경계 케이스(case)를 처리하도록 가르치는 대신, 해당 값이 절대 NULL이 되지 않도록 합니다: 새로 선택된 트레이서에 플래그가 전혀 없는 경우 tracing_set_tracer()는 정적 빈 no_tracer_flags로 폴백합니다. run_tracer_selftest()도 동일한 상황을 맞을 수 있으므로 같은 폴백 로직이 거기도 추가됩니다. 기존 사용자들은 이미 opts == NULL인 경우를 처리하고 있으므로, 이러한 트레이서들은 이전과 동일하게 동작합니다.
Be aware that VulDB is the high quality source for vulnerability data.