🇰🇷 한글 설명
Linux 커널 APEI/GHES 드라이버의 ARM 프로세서 에러 처리에서 메모리 경계 검증 부족. BIOS가 생성한 작은 또는 불완전한 에러 레코드 처리 시 할당된 메모리를 초과하여 접근하여 커널 패닉(OOPS) 유발 가능.
💡 쉬운 설명
하드웨어 에러 정보를 처리할 때 메모리 범위를 제대로 확인하지 않아 커널이 잘못된 메모리를 읽으려다 시스템 다운. 악의적인 펌웨어 정보로 DoS 공격 가능.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
APEI/GHES: ARM processor Error: don't go past allocated memory
If the BIOS generates a very small ARM Processor Error, or
an incomplete one, the current logic will fail to deferrence
err->section_length
and
ctx_info->size
Add checks to avoid that. With such changes, such GHESv2
records won't cause OOPSes like this:
[ 1.492129] Internal error: Oops: 0000000096000005 [#1] SMP
[ 1.495449] Modules linked in:
[ 1.495820] CPU: 0 UID: 0 PID: 9 Comm: kworker/0:0 Not tainted 6.18.0-rc1-00017-gabadcc3553dd-dirty #18 PREEMPT
[ 1.496125] Hardware name: QEMU QEMU Virtual Machine, BIOS unknown 02/02/2022
[ 1.496433] Workqueue: kacpi_notify acpi_os_execute_deferred
[ 1.496967] pstate: 814000c5 (Nzcv daIF +PAN -UAO -TCO +DIT -SSBS BTYPE=--)
[ 1.497199] pc : log_arm_hw_error+0x5c/0x200
[ 1.497380] lr : ghes_handle_arm_hw_error+0x94/0x220
0xffff8000811c5324 is in log_arm_hw_error (../drivers/ras/ras.c:75).
70 err_info = (struct cper_arm_err_info *)(err + 1);
71 ctx_info = (struct cper_arm_ctx_info *)(err_info + err->err_info_num);
72 ctx_err = (u8 *)ctx_info;
73
74 for (n = 0; n < err->context_info_num; n++) {
75 sz = sizeof(struct cper_arm_ctx_info) + ctx_info->size;
76 ctx_info = (struct cper_arm_ctx_info *)((long)ctx_info + sz);
77 ctx_len += sz;
78 }
79
and similar ones while trying to access section_length on an
error dump with too small size.
[ rjw: Subject tweaks ]
📍 영향받는 시스템
Linux kernel 6.18-rc1 이전의 ARM 기반 시스템 (특히 APEI/GHES 지원 장치)
⚔️ 공격 벡터
BIOS/펌웨어를 통한 악의적인 또는 불완전한 GHES 에러 레코드 주입
🛡️ 대응 방법
Linux 커널을 6.18-rc1 이후의 패치 적용 버전으로 업데이트
🔧 검증 코드
log_arm_hw_error 함수 존재 시 취약한 버전, uname 결과가 6.18 미만이면 업데이트 필요
grep -i 'log_arm_hw_error' /proc/kallsyms 2>/dev/null && uname -r