🇰🇷 한글 설명
Linux 커널의 tracing 기능에서 update_event_fields와 event_define_fields 함수 간의 경쟁 상태(Race Condition) 취약점이 발견되었습니다. 두 함수가 동시에 실행될 때 class->fields에 대한 보호 조치가 미흡하여 커널 패닉이 발생할 수 있습니다.
💡 쉬운 설명
여러 개의 커널 모듈이 동시에 로드될 때, 시스템의 기록(tracing) 정보를 업데이트하는 과정에서 충돌이 발생할 수 있습니다. 이 충돌이 발생하면 시스템이 갑자기 멈추거나 오류를 일으키며 재부팅될 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
tracing: Fix race between update_event_fields and, event_define_fields
The following sequence may leads race between event_define_fields()
and update_event_fields():
CPU0 (loads module A) CPU1 (loads module B)
=============================== ===============================
load_module(A) load_module(B)
notifier_call_chain notifier_call_chain
trace_module_notify trace_module_notify
mutex_lock(&event_mutex) trace_event_update_all()
trace_module_add_events(A) down_write(&trace_event_sem)
__register_event(call_A)
__add_event_to_tracers(call_A)
event_define_fields(call_A)
for each f: list_for_each_entry(field,
list_add(&f->link, &class->fields, link)
&class->fields) field = class->fields->next;
Where access to the class->fields is not protected by the event_mutex in
trace_event_update_all().
This produces the following panic:
Unable to handle kernel access ... at virtual address 0000000000000018
pc : update_event_fields+0xf8/0x368
Call trace:
update_event_fields+0xf8/0x368
trace_event_update_all+0x7c/0x2b4
trace_module_notify+0x4c/0x1dc
notifier_call_chain+0x84/0x168
blocking_notifier_call_chain_robust+0x64/0xd4
load_module+0x10c8/0x123c
__arm64_sys_finit_module+0x230/0x31c
Fix by taking event_mutex in trace_event_update_all() before
trace_event_sem.
📍 영향받는 시스템
Linux Kernel (tracing 기능이 활성화된 버전)
⚔️ 공격 벡터
로컬 공격자가 여러 커널 모듈을 동시에 로드하여 경쟁 상태를 유도함으로써 커널 패닉 유발
🛡️ 대응 방법
trace_event_update_all() 함수 내에서 trace_event_sem를 취하기 전에 event_mutex를 먼저 획득하도록 커널 패치를 적용해야 합니다.
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 수정된 패치 버전인지 확인합니다.