
높은 로컬 쓰기 프리미티브: LiteBox v0.1.0 SNP UserPtr은 NoValidation이므로 게스트 시스템 콜 버퍼가 커널 VA가 될 수 있음
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · litebox-snp-novalidation-userptr
분류: 쓰기 프리미티브 (게스트→SNP 커널 R/W) 도달 범위: 로컬
LiteBox v0.1.0 (d8556e3) - Microsoft
SNP LinuxKernel은 UserConstPtr / UserMutPtr를 NoValidation에 연결하며, 이는 포인터를 변경 없이 반환한다. 주석은 TODO: implement pointer validation to ensure the pointers are in user space.이다. LVBS는 이미 USER_ADDR_MIN..USER_ADDR_END(x86_64에서 0x10000 .. 0x7ffffffff000) 범위 검사를 수행하고 복사를 STAC/CLAC로 감싼다. SNP는 그렇지 않다. 커널 VA에 대한 게스트 mmap은 거부되므로(TASK_ADDR_MAX), CPL3 저장은 커널 힙에 도달할 수 없다. 시스템 콜 경로는 커널 모드에서 실행되며 도달할 수 있다. memcpy_fallible은 슈퍼바이저 모드에서 rep movsb이다.
이 잔여물은 게스트→SNP 커널(VMPL2 LiteBox) R/W이다. 호스트 VMPL0도, 하이퍼바이저도, SNP 펌웨어도 아니다.
| ID | 아직 CVE 없음 |
| 분류 | 쓰기 프리미티브 (게스트→SNP 커널 R/W) |
| 도달 범위 | 로컬 (litebox_runner_snp 내부의 신뢰할 수 없는 게스트 사용자 공간) |
| CWE | CWE-823, CWE-119 |
| CVSS | 높음: 8.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| 제품 | microsoft/litebox |
| 영향받음 | v0.1.0 (d8556e33676e47244bfefa139c1e9ff95bd67d53) SNP 커널 플랫폼. 97001fd 기준 origin/main에 TODO가 여전히 존재 |
| 인증 | 게스트가 이미 SNP VM 내부에서 실행 중 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용. SNP 하드웨어 없음 |
누가: litebox_runner_snp 내부의 신뢰할 수 없는 게스트 사용자 공간. 이슈 #505(공개 RFC)가 이 분류이다. LVBS는 구현했다. SNP는 하지 않았다.
랩은 두 검증기의 슈퍼바이저 모드 copy_from_slice 가젯과 litebox_platform_linux_kernel/src/lib.rs의 pin 사본이다. SNP 하드웨어에서의 게스트 시스템 콜이 아니다.
| 경로 | 대상 VA | 결과 |
|---|---|---|
SNP NoValidation (항등) | 0x1000 (USER_ADDR_MIN 미만) 및 0xffff800000000000 (GVA_OFFSET) | 수락; memcpy가 LITEBOX-SNP-NOVALIDATION-USERPTR-WITNESS를 커널로 표시된 객체에 기록 |
| LVBS 범위 검사 | 동일한 커널 대상 | 거부, errno=14 EFAULT, 커널 객체 비어 있음 |
| 둘 다 | 합법적 사용자 대상 0x400000 | 둘 다 witness를 사용자 객체에 복사 |
| 이미지 내 pin 파일 | 해당 없음 | TODO 주석과 NoValidation에 연결된 UserConstPtr / UserMutPtr (LvbsValidateAccess 부재) |
| 메서드 + 싱크 | 권한 |
|---|---|
read / readv / pread / recv* / getcwd / uname / epoll_pwait에서 buf = 커널 VA -> UserMutPtr::copy_from_slice -> memcpy_fallible (rep movsb) | 시스템 콜당 최대 MAX_KERNEL_BUF_SIZE(512 KiB), 또는 iovec 페이지 청크를 매핑된 임의의 SNP 커널 VA에 기록. 페이로드는 게스트가 선택(게스트가 기록한 파이프/파일) |
| 메서드 + 싱크 | 권한 |
|---|---|
write / writev / send*에서 buf = 커널 VA -> read_at_offset | 매핑된 SNP 커널 메모리를 게스트 fd로 읽기 |
| 매핑되지 않은 커널 VA | 예외 테이블을 통한 EFAULT (어떤 커널 페이지가 존재하는지 매퍼) |
| 메서드 + 싱크 | 권한 |
|---|---|
| SNP 커널 힙 / 페이지 테이블 / shim TLS 손상 | SNP 게스트 커널을 크래시 또는 전환. 신뢰할 수 있는 RIP 가젯은 주장하지 않음 |
LvbsValidateAccess + STAC/CLAC)sysretq (sanitize_for_user_return은 비사용자 RIP/RSP를 거부)mmap / mprotect (TASK_ADDR_MAX)NoValidation (동일 프로세스; 그곳의 호스트 경계는 seccomp이며, 이는 형제 잔여물)v0.1.0의 litebox_platform_linux_kernel/src/lib.rs 59-67행. TODO는 여전히 main에 있다. LVBS에는 이미 USER_ADDR_MIN = 0x10000과 USER_ADDR_MAX = 0x7ffffffff000을 가진 LvbsValidateAccess가 있다. 나는 SNP 하드웨어가 없었다. 랩은 pin 파일을 복사하고, 항등 vs 범위 검사를 구현하며, LVBS 검사가 거부하는 대상 VA에 NoValidation을 통해 witness를 기록한다.
cd lab
./run.sh
루프백 127.0.0.1:19130. Compose 프로젝트 litebox-snp-novalidation-userptr. Witness LITEBOX-SNP-NOVALIDATION-USERPTR-WITNESS. 마지막 줄:
SUCCESS litebox-snp-novalidation-userptr novalidation-kernel-write-ok lvbs-range-reject pin-TODO-present user-range-copy-ok LITEBOX-SNP-NOVALIDATION-USERPTR-WITNESS
SNP UserPtr를 LVBS가 이미 가진 것과 동일한 사용자 공간 범위 검사(USER_ADDR_MIN..USER_ADDR_END)에 연결하고, 복사를 예외 테이블 뒤에 유지하라. 커널 플랫폼에 NoValidation을 남기지 마라.
벤더 접수는 MSRC(https://msrc.microsoft.com/create-report)이다. microsoft/litebox에 공개 GitHub 이슈를 열지 마라.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]