🇰🇷 한글 설명
ARM64 아키텍처의 ioremap_prot() 함수에서 사용자 메모리 유형을 추출하지 않아 커널이 PAN(Privileged Access Never) 보호로 인해 메모리 접근 실패를 일으키는 취약점입니다. 이는 generic_access_phys() 호출 시 잘못된 페이지 보호 속성이 전달되어 발생합니다.
💡 쉬운 설명
리눅스 커널의 특정 메모리 매핑 함수가 잘못된 권한 정보를 처리하여 시스템 오류를 유발하는 문제입니다. 공격자가 이를 악용하면 시스템 불안정이나 서비스 거부(DoS)를 초래할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
arm64: io: Extract user memory type in ioremap_prot()
The only caller of ioremap_prot() outside of the generic ioremap()
implementation is generic_access_phys(), which passes a 'pgprot_t' value
determined from the user mapping of the target 'pfn' being accessed by
the kernel. On arm64, the 'pgprot_t' contains all of the non-address
bits from the pte, including the permission controls, and so we end up
returning a new user mapping from ioremap_prot() which faults when
accessed from the kernel on systems with PAN:
| Unable to handle kernel read from unreadable memory at virtual address ffff80008ea89000
| ...
| Call trace:
| __memcpy_fromio+0x80/0xf8
| generic_access_phys+0x20c/0x2b8
| __access_remote_vm+0x46c/0x5b8
| access_remote_vm+0x18/0x30
| environ_read+0x238/0x3e8
| vfs_read+0xe4/0x2b0
| ksys_read+0xcc/0x178
| __arm64_sys_read+0x4c/0x68
Extract only the memory type from the user 'pgprot_t' in ioremap_prot()
and assert that we're being passed a user mapping, to protect us against
any changes in future that may require additional handling. To avoid
falsely flagging users of ioremap(), provide our own ioremap() macro
which simply wraps __ioremap_prot().
📍 영향받는 시스템
ARM64 기반 리눅스 커널 (ioremap_prot 관련 코드 경로)
⚔️ 공격 벡터
로컬에서 generic_access_phys를 호출하여 잘못된 메모리 접근을 유도
🛡️ 대응 방법
리눅스 커널 최신 버전으로 업그레이드하여 패치 적용
🔧 검증 코드
출력된 커널 버전이 패치가 적용된 최신 버전인지 확인