[하루한줄] CVE-2021-1648: CVE-2020-0986 패치 우회 및 arbitrary address read

URL

THE STORY OF CVE-2021-1648

Target

  • Windows splwow64

Explain

2021년 1월 patch tuesday에서 CVE-2020-0986 패치를 우회하는 splwow64 서비스 취약점을 패치했습니다. CVE-2020-0986이 패치된 후 splwow64와 gdi32full에는 두 가지 검사가 추가되었습니다.

  1. 프린터 핸들 검사 함수 FindDriverForCookieFindPrinterHandle 추가
  2. 포인터 유효성 검사를 위한 함수 UMPDStringPointerFromOffsetUMPDPointerFromOffset 추가

1번의 함수들은 전역 변수에 어떤 프린터 드라이버 핸들이 저장되었는지 확인합니다. 그중 0x6A 커맨드를 호출하면 함수 bAddPrinterHandle가 전역 변수 qword_1800EABA0에 저장된 드라이버 힙에 프린트 핸들을 추가하여 전역 변수에 프린터 핸들 값을 조작해 0x6D에서 호출하는 FindDriverForCookieFindPrinterHandle을 우회할 수 있습니다. 또한 0x6D에서 memcpy를 호출할 때 source address를 확인하지 않고 복사를 진행하여 arbitrary address read가 가능합니다.

2번 함수들은 잘못된 범위 검사로 인해 우회가 가능합니다. splwow64는 x86에 대한 호환성으로 인해 항상 32비트 힙을 할당합니다. 하지만 두 함수들은 offset과 portview+offset이 0x7fffffff보다 작은지만 검사합니다. splwow64에서 힙은 낮은 주소에 할당되므로(ex. 0x7d7c70) 검사를 우회할 수 있습니다.