🇰🇷 한글 설명
리눅스 커널의 tracepoint_add_func() 함수에서 프로브 설치 실패 시 등록 함수(regfunc)의 부작용을 정리하지 않는 결함이 있습니다. 이로 인해 시스템 호출 오버헤드가 영구적으로 발생하거나 참조 카운트가 누수되는 문제가 발생합니다.
💡 쉬운 설명
시스템 모니터링 기능을 설정하는 과정에서 오류가 발생하면, 설정된 상태가 초기화되지 않고 그대로 남는 버그입니다. 이로 인해 시스템 성능이 저하되거나 메모리 관련 문제가 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
tracepoint: balance regfunc() on func_add() failure in tracepoint_add_func()
When a tracepoint goes through the 0 -> 1 transition, tracepoint_add_func()
invokes the subsystem's ext->regfunc() before attempting to install the
new probe via func_add(). If func_add() then fails (for example, when
allocate_probes() cannot allocate a new probe array under memory pressure
and returns -ENOMEM), the function returns the error without calling the
matching ext->unregfunc(), leaving the side effects of regfunc() behind
with no installed probe to justify them.
For syscall tracepoints this is particularly unpleasant: syscall_regfunc()
bumps sys_tracepoint_refcount and sets SYSCALL_TRACEPOINT on every task.
After a leaked failure, the refcount is stuck at a non-zero value with no
consumer, and every task continues paying the syscall trace entry/exit
overhead until reboot. Other subsystems providing regfunc()/unregfunc()
pairs exhibit similarly scoped persistent state.
Mirror the existing 1 -> 0 cleanup and call ext->unregfunc() in the
func_add() error path, gated on the same condition used there so the
unwind is symmetric with the registration.
📍 영향받는 시스템
Linux Kernel (tracepoint subsystem)
⚔️ 공격 벡터
메모리 부족 상황에서의 tracepoint 등록 실패를 유발하여 시스템 상태 불일치를 초래
🛡️ 대응 방법
리눅스 커널 최신 버전으로 업데이트하여 패치 적용
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 패치된 최신 안정 버전인지 확인