[하루한줄] CVE-2021-1648: CVE-2020-0986 패치 우회 및 arbitrary address read
URL
Target
- Windows splwow64
Explain
2021년 1월 patch tuesday에서 CVE-2020-0986 패치를 우회하는 splwow64 서비스 취약점을 패치했습니다. CVE-2020-0986이 패치된 후 splwow64와 gdi32full에는 두 가지 검사가 추가되었습니다.
- 프린터 핸들 검사 함수
FindDriverForCookie
와FindPrinterHandle
추가 - 포인터 유효성 검사를 위한 함수
UMPDStringPointerFromOffset
과UMPDPointerFromOffset
추가
1번의 함수들은 전역 변수에 어떤 프린터 드라이버 핸들이 저장되었는지 확인합니다. 그중 0x6A
커맨드를 호출하면 함수 bAddPrinterHandle
가 전역 변수 qword_1800EABA0
에 저장된 드라이버 힙에 프린트 핸들을 추가하여 전역 변수에 프린터 핸들 값을 조작해 0x6D
에서 호출하는 FindDriverForCookie
와 FindPrinterHandle
을 우회할 수 있습니다. 또한 0x6D
에서 memcpy
를 호출할 때 source address를 확인하지 않고 복사를 진행하여 arbitrary address read가 가능합니다.
2번 함수들은 잘못된 범위 검사로 인해 우회가 가능합니다. splwow64는 x86에 대한 호환성으로 인해 항상 32비트 힙을 할당합니다. 하지만 두 함수들은 offset과 portview+offset이 0x7fffffff
보다 작은지만 검사합니다. splwow64에서 힙은 낮은 주소에 할당되므로(ex. 0x7d7c70
) 검사를 우회할 수 있습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.