🇰🇷 한글 설명
Linux 커널 KVM SVM 모듈에서, 게스트의 GIF(Global Interrupt Flag)가 0으로 클리어된 상태에서 사용자 공간이 KVM_SET_VCPU_EVENTS로 인터럽트를 주입하면 BUG()가 발생하는 문제가 수정되었습니다. 이제 커널은 패닉 대신 인터럽트 주입 처리를 안전하게 처리합니다.
💡 쉬운 설명
가상 머신 관리 프로그램이 특정 상태에서 잘못된 인터럽트를 요청하면 리눅스 커널이 강제로 멈출 수 있었습니다. 이번 수정으로 이런 요청이 와도 커널이 멈추지 않도록 바뀌었습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
KVM: SVM: Don't BUG if userspace injects an interrupt with GIF=0
Don't BUG/WARN on interrupt injection due to GIF being cleared,
since it's trivial for userspace to force the situation via
KVM_SET_VCPU_EVENTS (even if having at least a WARN there would be correct
for KVM internally generated injections).
kernel BUG at arch/x86/kvm/svm/svm.c:3386!
invalid opcode: 0000 [#1] SMP
CPU: 15 PID: 926 Comm: smm_test Not tainted 5.17.0-rc3+ #264
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015
RIP: 0010:svm_inject_irq+0xab/0xb0 [kvm_amd]
Code: <0f> 0b 0f 1f 00 0f 1f 44 00 00 80 3d ac b3 01 00 00 55 48 89 f5 53
RSP: 0018:ffffc90000b37d88 EFLAGS: 00010246
RAX: 0000000000000000 RBX: ffff88810a234ac0 RCX: 0000000000000006
RDX: 0000000000000000 RSI: ffffc90000b37df7 RDI: ffff88810a234ac0
RBP: ffffc90000b37df7 R08: ffff88810a1fa410 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
R13: ffff888109571000 R14: ffff88810a234ac0 R15: 0000000000000000
FS: 0000000001821380(0000) GS:ffff88846fdc0000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007f74fc550008 CR3: 000000010a6fe000 CR4: 0000000000350ea0
Call Trace:
<TASK>
inject_pending_event+0x2f7/0x4c0 [kvm]
kvm_arch_vcpu_ioctl_run+0x791/0x17a0 [kvm]
kvm_vcpu_ioctl+0x26d/0x650 [kvm]
__x64_sys_ioctl+0x82/0xb0
do_syscall_64+0x3b/0xc0
entry_SYSCALL_64_after_hwframe+0x44/0xae
</TASK>
📍 영향받는 시스템
KVM SVM(AMD 가상화) 기능을 사용하는 리눅스 커널 5.x 계열 (수정 전 버전)
⚔️ 공격 벡터
KVM 가상화 환경에서 권한이 있는 사용자 공간 프로세스가 KVM_SET_VCPU_EVENTS ioctl로 GIF=0 상태에 인터럽트를 주입하여 커널 BUG를 유발 (서비스 거부)
🛡️ 대응 방법
커널을 해당 수정이 포함된 최신 안정 버전으로 업데이트하고 재부팅
🔧 검증 코드
출력된 커널 버전이 배포판의 수정 패치가 적용된 버전인지 확인하고, kvm_amd 모듈이 로드되어 있으면 배포판 보안 공지에서 해당 CVE 패치 포함 여부를 대조합니다.
uname -r && (lsmod | grep -E 'kvm_amd|kvm') 2>/dev/null