🇰🇷 한글 설명
Linux 커널의 net/sched 모듈에서 HFSC 큐잉 디스플린의 rtsc_min() 함수에 divide-by-zero 취약점이 존재합니다. m2sm() 함수가 32비트 slope를 64비트 값으로 변환할 때 큰 입력값(예: 4000000000)에서 2^32에 도달하는데, 이 차이를 32비트 변수에 저장하면 truncation으로 0이 되어 나누기 에러를 유발합니다.
💡 쉬운 설명
Linux 커널의 네트워크 트래픽 관리 기능에서 특정 계산값이 0이 되어 수학 오류(0으로 나누기)가 발생하고 시스템이 멈추는 문제입니다. 네트워크 설정을 변경할 수 있는 권한이 있으면 이를 악용할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
net/sched: sch_hfsc: fix divide-by-zero in rtsc_min()
m2sm() converts a u32 slope to a u64 scaled value. For large inputs
(e.g. m1=4000000000), the result can reach 2^32. rtsc_min() stores
the difference of two such u64 values in a u32 variable `dsm` and
uses it as a divisor. When the difference is exactly 2^32 the
truncation yields zero, causing a divide-by-zero oops in the
concave-curve intersection path:
Oops: divide error: 0000
RIP: 0010:rtsc_min (net/sched/sch_hfsc.c:601)
Call Trace:
init_ed (net/sched/sch_hfsc.c:629)
hfsc_enqueue (net/sched/sch_hfsc.c:1569)
[...]
Widen `dsm` to u64 and replace do_div() with div64_u64() so the full
difference is preserved.
📍 영향받는 시스템
Linux kernel net/sched/sch_hfsc.c 모듈을 포함한 리눅스 커널 (패치 전)
⚔️ 공격 벡터
로컬 공격자가 HFSC 큐잉 디스플린 설정 시 특정 slope 값으로 rtsc_min() 호출 트리거
🛡️ 대응 방법
Linux 커널을 divide-by-zero 패치가 적용된 버전으로 업그레이드
🔧 검증 코드
커널 버전 확인 후 sch_hfsc.c 파일에서 dsm 변수가 u64로 선언되고 div64_u64() 사용 여부 확인 (u32 dsm이면 취약)
uname -r && grep -n 'dsm' /sys/kernel/debug/sched/sch_hfsc.c 2>/dev/null || grep -A5 'rtsc_min' /usr/src/linux-*/net/sched/sch_hfsc.c 2>/dev/null | head -20