🇰🇷 한글 설명
Linux 커널의 mshv_vtl 모듈에서 VTL0 메모리 등록 시 vmemmap_shift 값이 MAX_FOLIO_ORDER를 초과하여 memremap_pages() 함수에서 거부되는 메모리 관리 버그입니다. 특정 물리 주소 범위에서 과도한 shift 값이 계산되어 커널 경고와 -EINVAL 에러가 발생합니다.
💡 쉬운 설명
Linux 커널이 메모리를 정렬할 때 너무 큰 값을 계산하면 시스템이 거부합니다. 이를 수정하려면 계산된 값을 커널이 허용하는 최대값으로 제한해야 합니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
mshv_vtl: Fix vmemmap_shift exceeding MAX_FOLIO_ORDER
When registering VTL0 memory via MSHV_ADD_VTL0_MEMORY, the kernel
computes pgmap->vmemmap_shift as the number of trailing zeros in the
OR of start_pfn and last_pfn, intending to use the largest compound
page order both endpoints are aligned to.
However, this value is not clamped to MAX_FOLIO_ORDER, so a
sufficiently aligned range (e.g. physical range
[0x800000000000, 0x800080000000), corresponding to start_pfn=0x800000000
with 35 trailing zeros) can produce a shift larger than what
memremap_pages() accepts, triggering a WARN and returning -EINVAL:
WARNING: ... memremap_pages+0x512/0x650
requested folio size unsupported
The MAX_FOLIO_ORDER check was added by
commit 646b67d57589 ("mm/memremap: reject unreasonable folio/compound
page sizes in memremap_pages()").
Fix this by clamping vmemmap_shift to MAX_FOLIO_ORDER so we always
request the largest order the kernel supports, in those cases, rather
than an out-of-range value.
Also fix the error path to propagate the actual error code from
devm_memremap_pages() instead of hard-coding -EFAULT, which was
masking the real -EINVAL return.
📍 영향받는 시스템
Linux 커널 (mshv_vtl 모듈, Hyper-V Isolated VMs 관련 시스템)
⚔️ 공격 벡터
로컬 권한 상승 후 MSHV_ADD_VTL0_MEMORY ioctl을 특정 물리 주소 범위로 호출하여 커널 에러 유발
🛡️ 대응 방법
Linux 커널 패치 적용: vmemmap_shift를 MAX_FOLIO_ORDER로 제한하고 오류 코드 전파 수정
🔧 검증 코드
경고 메시지가 나타나면 취약한 버전이고, 메시지가 없으면 패치된 버전입니다.
dmesg | grep -i 'memremap_pages\|requested folio size' || echo 'No vulnerability detected'