[하루한줄] CVE-2021-2127: Oracle VirtualBox Divide by Zero DoS

URL

CVE-2021-2127

Target

Oracle VirtualBox 6.1.16 (realease 2020/11/17)

Windows 호스트 제외

Explain

Oracle VirtualBox 6.1.16에서 Divide by zero 취약점이 발견되었습니다. VMWare SVGA II PCI를 통해 전달된 커맨드들은 SVGA command buffer에 저장된 후 FIFO loop을 통해 파싱 및 실행됩니다. 함수 vmsvgaR3FifoLoop는 switch-case문을 통해 상황에 맞는 vmsvga~ 함수를 호출하는 것으로 커맨드를 처리합니다. 그중 SVGA_3D_CMD_SURFACE_DMA 커맨드를 처리하는 vmsvga3dSurfaceDMA에서 divide by zero 취약점이 있습니다.

AssertReturn(srcz < UINT32_MAX / pMipLevel->mipmapSize.height / cbGuestPitch, VERR_INVALID_PARAMETER);

위는 Divide by zero 취약점이 발생하는 코드이고, Root cause는 다음과 같습니다.

  1. Invalid surface가 정의될 수 있음.

    mipmap의 값이 0이 아니며, cbGuestPitch의 값이 0인 surface가 정의될 수 있습니다.

  2. Texture는 Invalid surface에 bound 됨

    Texture가 surface에 bound 되어야 취약점에 도달할 수 있습니다.

  3. 제수(divisor)의 검사 부재

해당 취약점을 통해 3D acceleration 옵션이 켜져 있는 VM들을 대상으로 로컬 혹은 원격 Crash를 발생시킬 수 있습니다.