🇰🇷 한글 설명
Linux 커널의 CONFIG_PREEMPT_RT 옵션이 활성화된 환경에서 rcutorture 테스트 실행 시 rcutorture_one_extend_check() 함수에서 경고(splat)가 발생하는 취약점입니다. RT 커널에서는 Disable BH 작업이 preempt_count()의 SOFTIRQ 비트를 변경하지 않기 때문에, softirq_count()를 사용하여 BH 비활성화 여부를 확인하도록 수정되었습니다.
💡 쉬운 설명
실시간 성능을 지원하는 리눅스 커널에서 특정 테스트를 수행할 때 시스템 오류 경고가 발생하는 문제입니다. 시스템이 멈추는 치명적인 문제는 아니지만, 커널의 상태를 잘못 판단할 수 있는 논리적 오류를 바로잡은 것입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
rcutorture: Fix rcutorture_one_extend_check() splat in RT kernels
For built with CONFIG_PREEMPT_RT=y kernels, running rcutorture
tests resulted in the following splat:
[ 68.797425] rcutorture_one_extend_check during change: Current 0x1 To add 0x1 To remove 0x0 preempt_count() 0x0
[ 68.797533] WARNING: CPU: 2 PID: 512 at kernel/rcu/rcutorture.c:1993 rcutorture_one_extend_check+0x419/0x560 [rcutorture]
[ 68.797601] Call Trace:
[ 68.797602] <TASK>
[ 68.797619] ? lockdep_softirqs_off+0xa5/0x160
[ 68.797631] rcutorture_one_extend+0x18e/0xcc0 [rcutorture 2466dbd2ff34dbaa36049cb323a80c3306ac997c]
[ 68.797646] ? local_clock+0x19/0x40
[ 68.797659] rcu_torture_one_read+0xf0/0x280 [rcutorture 2466dbd2ff34dbaa36049cb323a80c3306ac997c]
[ 68.797678] ? __pfx_rcu_torture_one_read+0x10/0x10 [rcutorture 2466dbd2ff34dbaa36049cb323a80c3306ac997c]
[ 68.797804] ? __pfx_rcu_torture_timer+0x10/0x10 [rcutorture 2466dbd2ff34dbaa36049cb323a80c3306ac997c]
[ 68.797815] rcu-torture: rcu_torture_reader task started
[ 68.797824] rcu-torture: Creating rcu_torture_reader task
[ 68.797824] rcu_torture_reader+0x238/0x580 [rcutorture 2466dbd2ff34dbaa36049cb323a80c3306ac997c]
[ 68.797836] ? kvm_sched_clock_read+0x15/0x30
Disable BH does not change the SOFTIRQ corresponding bits in
preempt_count() for RT kernels, this commit therefore use
softirq_count() to check the if BH is disabled.
📍 영향받는 시스템
CONFIG_PREEMPT_RT=y 옵션으로 빌드된 Linux 커널
⚔️ 공격 벡터
로컬 시스템에서 rcutorture 테스트를 실행할 수 있는 권한이 필요함 (Local)
🛡️ 대응 방법
해당 수정 사항이 반영된 최신 Linux 커널 버전으로 업데이트
🔧 검증 코드
출력 결과에 CONFIG_PREEMPT_RT=y가 포함되어 있는지 확인하여 대상 커널 여부를 판단합니다.
uname -a && grep CONFIG_PREEMPT_RT /boot/config-$(uname -r) 2>/dev/null