[하루한줄] CVE-2021-27077: SELECTING BITMAPS INTO MISMATCHED DEVICE CONTEXTS

URL

CVE-2021-27077: SELECTING BITMAPS INTO MISMATCHED DEVICE CONTEXTS

Target

  • Windows

Explain

Windows에서 device context에서 bitmap을 선택하여 권한 상승 및 코드 실행이 가능한 취약점이 발견되었습니다.

Device context는 Windows에서 픽셀 기반 장치에 무언가를 그리기 위해 제공됩니다. Device context는 user-mode code와 low-level device driver 사이에 추상 계층이며 컨테이너처럼 작동합니다. Screen-related와 print-related 일 수 있으며 device context는 커널 메모리 상에 존재합니다. 필드 중 hdev 필드는 커널 메모리에 존재하는 다른 객체에 대한 포인터입니다.

커널 메모리에서 bitmap은 surface object로 표현되며 이 구조체 또한 hdev를 가지고 있습니다. printer-related device context와 screen-related device context를 하나씩 생성한 후, 모든 device context에서 호환 가능한 monochrome (1 bite deep) bitmap을 생성합니다. 그 후 Printer DC에서 bitmap을 선택하면 bitmap의 hdev는 커널 메모리에 printer device object를 가리킵니다. 그 후 bitmap 선택을 해제한 후 다시 Screen DC에서 bitmap을 선택하면 hdev 필드는 screen device object를 가리킵니다. 해당 코드는 다음과 같습니다.

DCPrn = CreateCompatibleDC(CreateDC("Microsoft XPS Document Writer", "Microsoft XPS Document Writer", NULL, NULL)); 
DCScr = CreateCompatibleDC(0); 
 
Bitmap = CreateBitmap(100, 100, 1, 1, NULL); 
 
PrevBitmap = SelectObject(DCPrn, Bitmap); // Bitmap's hdev is set to DCPrn's hdev 
SelectObject(DCPrn, PrevBitmap); 
 
SelectObject(DCScr, Bitmap);              // Bitmap's hdev is set to DCScr's hdev

프린터 드라이버의 보안을 위해서 Windows Vista까지는 kernel-mode와 user-mode에 프린터 드라이버가 공존하였지만, 그 이후에는 user-mode driver만 사용됩니다. 프린터에 대한 처리를 위해 커널에는 user-mode에 대한 콜백을 만드는 stub이 존재합니다. user-mode 드라이버에 필요한 기능을 제공하기 위해 일부 kernel-mode API에는 user-mode API도 존재합니다. 이 중 EngAssociateSurface 함수를 통해 hdev, dhpdev, flHooks를 설정할 수 있습니다. 이를 악용하여 flHooks를 통해 권한 상승 및 다른 악용이 가능합니다.

해당 취약점은 SelectObject에서 win32kbase.sys!blsSurfaceAllowedInDC 함수를 호출하여 surface object를 검사하는 방식으로 패치되었습니다.