🇰🇷 한글 설명
리눅스 커널의 block/bio-integrity 구성 요소에서 bio_integrity_map_user() 함수가 메모리 핀(pinning) 실패를 적절히 처리하지 못하는 취약점이 발견되었습니다. pin_user_pages_fast()가 요청된 페이지 중 일부만 성공했을 때, 이를 검증하지 않고 접근을 시도하여 null 포인터 역참조로 인한 일반 보호 오류(General Protection Fault)가 발생합니다.
💡 쉬운 설명
컴퓨터가 데이터를 안전하게 처리하기 위해 메모리를 고정하는 과정에서 일부가 실패했을 때, 이를 확인하지 않고 잘못된 주소를 참조하여 시스템이 멈추거나 오류가 발생하는 문제입니다. 이로 인해 시스템이 갑자기 꺼지거나 충돌할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
block: bio-integrity: Fix null-ptr-deref in bio_integrity_map_user()
pin_user_pages_fast() can partially succeed and return the number of
pages that were actually pinned. However, the bio_integrity_map_user()
does not handle this partial pinning. This leads to a general protection
fault since bvec_from_pages() dereferences an unpinned page address,
which is 0.
To fix this, add a check to verify that all requested memory is pinned.
If partial pinning occurs, unpin the memory and return -EFAULT.
Kernel Oops:
Oops: general protection fault, probably for non-canonical address 0xdffffc0000000001: 0000 [#1] SMP KASAN NOPTI
KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f]
CPU: 0 UID: 0 PID: 1061 Comm: nvme-passthroug Not tainted 7.0.0-11783-g90957f9314e8-dirty #16 PREEMPT(lazy)
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.17.0-0-gb52ca86e094d-prebuilt.qemu.org 04/01/2014
RIP: 0010:bio_integrity_map_user.cold+0x1b0/0x9d6
📍 영향받는 시스템
Linux Kernel (bio-integrity 관련 모듈을 사용하는 시스템)
⚔️ 공격 벡터
메모리 핀 작업이 부분적으로만 성공하도록 유도하여 커널의 null 포인터 역참조를 유발하는 방식
🛡️ 대응 방법
커널 업데이트를 통해 bio_integrity_map_user() 함수 내에 메모리 핀 성공 여부를 확인하고, 실패 시 메모리를 해제한 후 -EFAULT를 반환하도록 수정된 패치를 적용해야 합니다.
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 수정된 패치 버전인지 확인합니다.