[하루한줄] CVE-2021–40449: Windows 커널의 UAF 취약점
URL
- https://movaxbx.ru/2021/10/25/callbackhell/
- https://ti.qianxin.com/blog/articles/CVE-2021-40449-vulnerability-recurrence-process/
Target
- Microsoft Windows 10 build 14393
- Microsoft Windows 10 build 17763
Explain
Windows의 win32kfull.sys
커널 함수에서 발생하는 UAF 취약점의 세부 정보가 공개되었습니다.
취약점은 GreResetDCInternal
에 존재합니다.
BOOL GreResetDCInternal(HDC hdc,DEVMODEW *pdmw,BOOL
*pbBanding,DRIVER_INFO_2W *pDriverInfo2,PVOID ppUMdhpdev){
..
HDC hdcNew;
{
// 매개변수 hdc로부터 DCOBJ dco 생성
DCOBJ dco(hdc);
if (!dco.bValid())
SAVE_ERROR_CODE(ERROR_INVALID_HANDLE);
else {
// dco로부터 PDEVOBJ po 생성
PDEVOBJ po(dco.hdev());
...
// new DC 생성
// 이때 유저 모드 콜백으로 ResetDC를 호출해 컨텍스트 파괴
hdcNew = hdcOpenDCW(L"", pdmw, DCTYPE_DIRECT, po.hSpooler,
prton, pDriverInfo2, ppUMdhpdev);
if (hdcNew)
{
po->hSpooler = NULL;
DCOBJ dcoNew(hdcNew);
if (!dcoNew.bValid())
SAVE_ERROR_CODE(ERROR_INVALID_HANDLE);
else {
// Transfer any remote fonts
dcoNew->pPFFList = dco->pPFFList;
dco->pPFFList = NULL;
// Transfer any color transform
dcoNew->pCXFList = dco->pCXFList;
dco->pCXFList = NULL;
PDEVOBJ poNew((HDEV)dcoNew.pdc->ppdev())
// 파괴된 기존 컨텍스트에 접근, UAF 트리거
PFN_DrvResetPDEV rfn = po->ppfn[INDEX_DrvResetPDEV];
if (rfn != NULL)
(*rfn)(po->dhpdev, poNew->dhpdev);
...
}
}
}
}
// Destroy old DC
...
}
hdcOpenDCW
호출 과정에서 DrvEnablePDEV
를 후킹해 ResetDC
를 유저모드 콜백으로 호출할 수 있으며 이를 이용해 GreResetDCInternal
에서 사용되는 디바이스 컨텍스트 객체를 해제할 수 있습니다. GreResetDCInternal
는 객체가 해제되었는지 확인하지 않고 접근을 시도하기 때문에 UAF가 트리거됩니다.
취약점을 악용하는 방법은 아래와 같습니다.
KernelCallbackTable
에 유저모드 콜백 설정합니다.- 전역 DC 객체를 만들고 핸들을 저장합니다.
ResetDC
함수를 호출해 전역 DC의 핸들을 전달하고,ResetDC
함수는 내부적으로GreResetDCInternal
을 호출합니다.GreResetDCInternal
의hdcOpenDCW
함수 호출직후 유저모드 콜백으로 인해ResetDC
를 다시 호출합니다.- 컨텍스트를 해제하고
GreResetDCInternal
로 복귀하지만 해당 함수에서 해제된 컨텍스트인지 확인하지 않고 접근해 UAF가 트리거됩니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.