[하루한줄] CVE-2021-28310: Desktop Window Manager out-of-bound write 취약점

URL

Zero-day vulnerability in Desktop Window Manager (CVE-2021-28310) used in the wild

Target

  • Windows OS 빌드 19041.928 이하 버전

Explain

Windows 데스크톱 창 관리자(Desktop Window Manager, dwm.exe)의 dwmcore.dll에서 out-of-bounds write 취약점이 발견되었습니다. 해커는 DirectComposition API를 사용하여 오프셋을 조작하여 데이터를 쓸 수 있습니다.

DirectComposition은 다양한 소스(GDI, DirectX 등)의 비트맵을 지원하는 변환, 효과, 애니메이션 비트맵 구성을 위해 Windows 8에서 도입된 Windows 구성 요소입니다. DirectComposition API는 win32kbase.sys 드라이버에 구현되어 있으며 관련된 syscall은 NtDComposition으로 시작합니다.

취약점을 트리거하기 위해서 3개의 syscall이 필요합니다. NtDCompositionCreateChannelNtDCompositionProcessChannelBatchBuffer와 함께 채널을 초기화하여 kernel batch mode에서 처리되도록 여러 개의 DirectComposition을 전송합니다. 커널에 의해 명령어가 처리되지만 명령어들은 다른 포맷으로 serialize 되어 Local Procedure Call(LPC) 프로토콜에서 Desktop Window Manager(dwm.exe)로 전달되고 화면에 출력됩니다. 이 프로시저는 NtDCompositionCommitChannel에 의해 초기화됩니다.

해당 취약점을 트리거하기 위해서는 3가지 명령어(CreateResource, ReleaseResource, SetResourceBufferProperty)를 사용해야 합니다. dwmcore.dllCPropertySet::ProcessSetPropertyValue 함수는 SetResourceBufferProperty를 호출합니다. D2DVector2로 expression type이 설정된 SetResourceBufferProperty의 경우 CPropertySet::ProcessSetPropertyValue에서 업데이트 여부에 따라 CPropertySet::AddProperty<D2DVector2> 혹은 CPropertySet::UpdateProperty<D2DVector2>를 호출하여 명령어를 설정합니다. 이때 UpdateProperty에서 propertyId가 리소스에 추가된 property 수보다 작은지 확인하지 않아 property 배열 내부 데이터에 대한 두 가지 검사를 우회하면 propertiesData 버퍼를 지나 OOB write가 가능합니다. 해커가 dwm.exe 프로세스에서 객체를 할당하고 해제할 수 있으면 heap spray를 통해 이 검사를 우회할 수 있습니다.

검사를 우회한 후 조작된 propertyId로 명령을 전송하면 NtDCompositionProcessChannelBatchBuffer에서 에러를 반환하고 명령어가 dwm.exe에 전송되지 않습니다. kernel mode UpdateProperty<D2DVector2>propertiesCount 검사는 user mode에서의 악성 명령 실행을 방지합니다. 하지만 kernel mode AddProperty는 user mode와 유사하게 작동하며 생성된 property의 propertyIdstorageOffset이 제공된 값과 동일한지만 확인하고 다르면 에러를 반환합니다. AddProperty를 통해 새 속성을 추가하여 함수가 에러를 반환하면 kernel mode와 user mode 동일 리소스 간에 property 수의 불일치가 발생하여 kernel mode propertiesCount 검사를 우회하여 dwm.exe에서 명령어 실행이 가능합니다.