🇰🇷 한글 설명
Linux 커널의 ARM 아키텍처 캐시 플러시 코드(flush.c)에서, pfn_valid() 의미 변경 이후 커널이 매핑하지 않은 예약 메모리 주소에 대해 캐시 연산을 시도하여 커널 패닉이 발생하는 문제입니다. 수정으로 PG_reserved 플래그를 확인하도록 변경되었습니다.
💡 쉬운 설명
ARM 기반 리눅스에서 일부 예약된 메모리 영역을 잘못 건드려 시스템이 갑자기 멈추는 버그입니다. 특정 장치(UIO)용 메모리 매핑 작업 중에 발생합니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
ARM: 9359/1: flush: check if the folio is reserved for no-mapping addresses
Since commit a4d5613c4dc6 ("arm: extend pfn_valid to take into account
freed memory map alignment") changes the semantics of pfn_valid() to check
presence of the memory map for a PFN. A valid page for an address which
is reserved but not mapped by the kernel[1], the system crashed during
some uio test with the following memory layout:
node 0: [mem 0x00000000c0a00000-0x00000000cc8fffff]
node 0: [mem 0x00000000d0000000-0x00000000da1fffff]
the uio layout is:0xc0900000, 0x100000
the crash backtrace like:
Unable to handle kernel paging request at virtual address bff00000
[...]
CPU: 1 PID: 465 Comm: startapp.bin Tainted: G O 5.10.0 #1
Hardware name: Generic DT based system
PC is at b15_flush_kern_dcache_area+0x24/0x3c
LR is at __sync_icache_dcache+0x6c/0x98
[...]
(b15_flush_kern_dcache_area) from (__sync_icache_dcache+0x6c/0x98)
(__sync_icache_dcache) from (set_pte_at+0x28/0x54)
(set_pte_at) from (remap_pfn_range+0x1a0/0x274)
(remap_pfn_range) from (uio_mmap+0x184/0x1b8 [uio])
(uio_mmap [uio]) from (__mmap_region+0x264/0x5f4)
(__mmap_region) from (__do_mmap_mm+0x3ec/0x440)
(__do_mmap_mm) from (do_mmap+0x50/0x58)
(do_mmap) from (vm_mmap_pgoff+0xfc/0x188)
(vm_mmap_pgoff) from (ksys_mmap_pgoff+0xac/0xc4)
(ksys_mmap_pgoff) from (ret_fast_syscall+0x0/0x5c)
Code: e0801001 e2423001 e1c00003 f57ff04f (ee070f3e)
---[ end trace 09cf0734c3805d52 ]---
Kernel panic - not syncing: Fatal exception
So check if PG_reserved was set to solve this issue.
[1]: https://lore.kernel.org/lkml/
[email protected]/
📍 영향받는 시스템
ARM 아키텍처 기반 Linux 커널 (수정 이전 5.x 계열 등, 해당 커밋 적용 버전)
⚔️ 공격 벡터
로컬 사용자가 UIO 장치의 메모리 매핑(mmap) 작업을 수행하여 커널 패닉을 유발할 수 있으며, 서비스 거부(DoS) 형태입니다.
🛡️ 대응 방법
해당 수정이 포함된 최신 Linux 커널로 업데이트하거나 배포판의 보안 패치를 적용하세요.
🔧 검증 코드
출력된 커널 버전을 배포판 보안 공지 또는 Linux 커널 Git의 수정 커밋 포함 여부와 대조하여, 패치된 버전 이상인지 확인합니다. 구버전이면 취약할 수 있습니다.