[하루한줄] Two CVEs in Parallels Desktop RDPMC
URL
PARALLELS DESKTOP RDPMC HYPERCALL INTERFACE AND VULN
Target
Parallels Desktop 15.1.5 (Guest)
macOS Caltalina 10.15.7 (Host)
Explain
Parallels Desktop에서 hypercall 인터페이스를 통해 Guest 유저가 Host 커널에서 임의 코드를 실행할 수 있는 취약점이 발견되었습니다. Parallels Desktop은 RDPMC(Read Performance-Monitor Counter) instruction을 사용하는 hypercall 인터페이스를 통해 guest와 host의 통신을 지원합니다. 해당 인터페이스는 guest 유저 권한으로도 접근할 수 있기 때문에 host VMM(Virtual Machine Monitor)의 취약점을 트리거해 권한 상승이 가능합니다.
CVE-2021-31424 : Heap overflow
host VMM은 guest와 데이터를 주고받을 때
ReadLinear()
와WriteLinear()
를 사용합니다. guest 유저가 제어할 수 있는 데이터(UEFI variable name)에 대한 길이 검증 미흡으로 인해 해당 데이터를 복사하는 과정에서 Heap overflow가 발생합니다.uint64_t OTGHandleGenericCommand(uint64_t x) { /* case 9 */ MonReadLinear(regs.rsi, &request, 0x30); SharedMem->EFIVar.op = request.op; ReadLinear(request.name, SharedMem->EFIVar.name, 2 * request.size); // heap overflow when copying variable name from guest SharedMem->EFIVar.name[request.size] = 0; ...
CVE-2021-31427 : TOCTOU
guest에 보내야 할 데이터의 크기 값(
EFIVar.datasize
) 검증은 user space에서 이루어집니다. VMM과 userspace 사이 컨트롤 위임을 담당하는 함수MonRetToHostSwitch()
와 공유 메모리로부터EFIVar.datasize
를 복사해오는 함수WriteLinear()
사이에서 race condition이 발생합니다. 데이터 길이 검증과 데이터 복사 작업 사이에EFIVar.datasize
값을 번경하는 것이 가능하므로 host kernel 데이터에 대한 OOB(out-of-bound) read로 이어질 수 있습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.