🇰🇷 한글 설명
리눅스 커널의 IMA(Integrity Measurement Architecture) 기능에서 이전 커널의 ima-kexec-buffer가 주소 지정 가능한 메모리 범위를 벗어나는지 확인하지 않는 취약점입니다. 새로운 커널 부팅 시 'mem=X' 인자를 사용하여 메모리 범위를 제한할 경우, 이전 커널이 할당한 버퍼가 해당 범위를 초과하여 커널 패닉(Kernel Panic)이 발생할 수 있습니다.
💡 쉬운 설명
새로운 운영체제를 실행할 때 사용할 메모리 양을 제한하면, 이전 운영체제가 남겨둔 데이터가 허용된 메모리 영역 밖에 있을 수 있습니다. 이때 시스템이 잘못된 메모리 위치를 읽으려고 시도하다가 컴퓨터가 갑자기 멈추거나 꺼지는 현상이 발생합니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
of: check previous kernel's ima-kexec-buffer against memory bounds
Presently ima_get_kexec_buffer() doesn't check if the previous kernel's
ima-kexec-buffer lies outside the addressable memory range. This can result
in a kernel panic if the new kernel is booted with 'mem=X' arg and the
ima-kexec-buffer was allocated beyond that range by the previous kernel.
The panic is usually of the form below:
$ sudo kexec --initrd initrd vmlinux --append='mem=16G'
<snip>
BUG: Unable to handle kernel data access on read at 0xc000c01fff7f0000
Faulting instruction address: 0xc000000000837974
Oops: Kernel access of bad area, sig: 11 [#1]
<snip>
NIP [c000000000837974] ima_restore_measurement_list+0x94/0x6c0
LR [c00000000083b55c] ima_load_kexec_buffer+0xac/0x160
Call Trace:
[c00000000371fa80] [c00000000083b55c] ima_load_kexec_buffer+0xac/0x160
[c00000000371fb00] [c0000000020512c4] ima_init+0x80/0x108
[c00000000371fb70] [c0000000020514dc] init_ima+0x4c/0x120
[c00000000371fbf0] [c000000000012240] do_one_initcall+0x60/0x2c0
[c00000000371fcc0] [c000000002004ad0] kernel_init_freeable+0x344/0x3ec
[c00000000371fda0] [c0000000000128a4] kernel_init+0x34/0x1b0
[c00000000371fe10] [c00000000000ce64] ret_from_kernel_thread+0x5c/0x64
Instruction dump:
f92100b8 f92100c0 90e10090 910100a0 4182050c 282a0017 3bc00000 40810330
7c0802a6 fb610198 7c9b2378 f80101d0 <a1240000> 2c090001 40820614 e9240010
---[ end trace 0000000000000000 ]---
Fix this issue by checking returned PFN range of previous kernel's
ima-kexec-buffer with page_is_ram() to ensure correct memory bounds.
📍 영향받는 시스템
IMA(Integrity Measurement Architecture) 기능이 활성화된 리눅스 커널
⚔️ 공격 벡터
kexec를 사용하여 메모리 제한 인자('mem=X')와 함께 새로운 커널을 부팅할 때 발생 (DoS)
🛡️ 대응 방법
ima-kexec-buffer의 PFN 범위를 page_is_ram() 함수로 검사하도록 커널을 업데이트하십시오.
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 해결된 보안 패치 버전인지 확인합니다.