[하루한줄] Windows 커널 모드 그래픽 모듈의 권한 상승 취약점

URL

ZDI-CAN-12671: WINDOWS KERNEL DOS/PRIVILEGE ESCALATION VIA A NULL POINTER DEREF

Target

win32kfull.sys (Windows 32bit)

Explain

Windows kernel 모듈인 win32kfull.sys에서 NULL pointer dereference로 인한 권한 상승 취약점이 발견되었습니다.

win32k에서 모든 그리기 작업은 SURFOBJ 구조체를 통해 이루어집니다. SURFOBJhdev 필드는 특정 장치 드라이버에 대한 핸들이며 flags 필드 중 일부는 HOOK_ * 플래그로, 여기에서 확인할 수 있습니다.

취약점은 PlgBlt 그리기 작업을 수행하는 win32kfull.sys!BLTRECORD::bRotate에서 발생합니다. HOOK_PLGBLTSURFOBJflags 필드에 설정되어 있으면 기본 장치 드라이버의 DrvPlgBlt가 사용되는데, 이때 hdev에서 지정한 드라이버가 네이티브 DrvPlgBlt를 지원하는지 확인하지 않아 이를 지원하지 않는 경우 해당 테이블의 항목이 NULL이 되고 win32kfull.sys!BLTRECORD::bRotate에서 NULL 주소를 호출하게 됩니다.

취약점을 악용할 때 기본적으로 Windows 시스템에서는 유저 모드 프로세스에서 NULL 페이지를 매핑할 수 없지만 16비트 유저 모드 프로세스에서는 NULL 페이지 매핑이 가능해 16비트 가상 도스 머신인 NTVDM이 설치되어 있고, SMEP 적용이 되지 않은 Windows 32 bit에서만 제한적인 권한 상승이 가능합니다.