[하루한줄] CVE-2021-1732: win32kfull.sys 0-day
URL
WINDOWS KERNEL ZERO-DAY EXPLOIT (CVE-2021-1732) IS USED BY BITTER APT IN TARGETED ATTACK
Target
Windows10 1709 ~ 1909 64-bits
Explain
DBAPPSecurity Threat Intelligence가 작년 12월에 BITTER APT의 새로운 컴포넌트를 분석해 win32kfull.sys에서 발생하는 취약점(CVE-2021-1732)을 발견했습니다. CVE-2021-1732는 win32kfull 콜백에 의해 발생하는 System 권한 상승 취약점으로 IE browser, Adobe Reader 등의 sandbox escape에 사용될 수 있습니다.
취약점(out-of-bound access)은 win32kfull!xxxCreateWindowEx
가 콜백 함수 xxxClientAllocWindowClassExtraBytes
를 호출한 후, 커널 구조 멤버에 대한 설정과 flag값이 서로 상응하지 않을 때 발생합니다.
win32kfull!xxxCreateWindowEx
가 WndExtra
영역을 갖는 새로운 창을 만들 때 콜백 함수 user32!_xxxClientAllocWindowClassExtraBytes
를 호출해 WndExtra
를 할당합니다. 그 후 할당된 WndExtra
의 유저 모드 포인터를 반환받아 WndExtra
멤버에 저장합니다.
만약 커스텀 콜백 _xxxClientAllocWindowClassExtraBytes
에서 win32kfull!ConsoleControl
을 호출해 현재 창에 대한 핸들을 받으면 저장된 WndExtra
멤버를 오프셋으로 변환합니다. 또한 그에 맞게 flag는 현재 멤버가 오프셋임을 나타내도록(0x800) 값이 변경됩니다.
커스텀 콜백이 끝난 직후 NtCallbackReturn
를 통해 임의의 값(fake_offset)을 win32kfull!xxxCreateWindowEx
에 반환하면 WndExtra
멤버를 해당 반환 값으로 오염시킬 수 있습니다. 하지만 flag값은 여전히 WndExtra
멤버가 오프셋임을 나타내기 때문에 커널 힙 해제 시 발생하는 분기에 영향을 미치게 됩니다.
win32kfull!xxxFreeWindow
는
Flag값 설정됨
오프셋을 통해
WndExtra
를 free 하는RtlFreeHeap
호출Flag가 설정되지 않음
유저 모드 포인터와
xxxClientFreeWindowClassExtraBytes
를 통해WndExtra
를 free
RtlFeeHeap
은 Base+offset이 아닌 Base+fake_offset을 free 하게 됩니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.