[하루한줄] 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로 이어질 수 있습니다.