[하루한줄] CVE-2021-34486: Windows(ETW) 의 UAF 취약점
URL
Target
- Windows 10(x64) 21H1(OS 빌드 19043.1083, 2021년 7월 7일 KB5004945 누적 업데이트)
- Windows 10(x64) 21H1(OS 빌드 19043.1052, 2021년 6월 KB5003637 누적 업데이트)
- Windows 10(x64) 21H1(OS 빌드 19043.1023, 2021년 5월 KB5003214 누적 업데이트)
- Windows 10(x64) 21H1(OS 빌드 19043.985, 2021년 5월 KB5003173 누적 업데이트)
Explain
Windows ETW(Event Tracing for Windows, 이벤트 추적) 는 유저 모드 어플리케이션을 디버깅하기 위해 커널과 어플리케이션 이벤트를 로깅하는 서비스입니다.
ETW는 주기적으로 logging state를 업데이트하기 위해 커널(ntoskrnl.exe
)에 system call을 하는데, 이때 특정 조건에서 임의 코드를 실행할 수 있는 UAF 취약점이 발생합니다.
UAF를 통해 제어 가능한 0x30
bytes 크기의 _CONTEXTINFO 구조체는 아래와 같습니다.
typedef struct _CONTEXTINFO
{
WORK_QUEUE_ITEM WorkItem;
ULONG64 Unknown;
USHORT LoggerId;
UCHAR Padding[6];
} CONTEXTINFO, *PCONTEXTINFO;
취약점은 총 세 번의 logging state 업데이트 요청을 통해 트리거 됩니다.
첫 번째 요청에서 커널은 아래와 같이 동작합니다.
- ntoskrnl은
LoggerId
에 해당하는LoggerContext
를 찾아 모든Guids
가LoggerContext
의 알림 액세스 권한을 갖도록 합니다. - 타이머 콜백 루틴
PeriodicCaptureStateTimerCallback()
에서는CONTEXTINFO TimerContextInfo
객체를 할당하고SendCaptureStateNotificationsWorker(PCONTEXTINFO TimerContentInfo)
콜백 루틴을 대기열에 넣습니다, SendCaptureStateNotificationsWorker()
은 알림 데이터 패킷을 빌드하고 모든Guids
에 보냅니다.
취약점은 첫 번째 요청 이후 두 번째 요청에서 Guid
중 하나라도 LoggerContext
의 알림 액세스 권한이 없는 경우 LoggerContext→NumOfGuids
를 0으로 설정해 발생합니다. 두 번째 요청에서 SendCaptureStateNotificationsWorker()
루틴은 먼저 해당 LoggerContext
를 검색하는데 LoggerContext→NumOfGuids
가 0이면 할당된 TimerContextInfo
를 해제합니다.
이후 세 번째 요청에서 LoggerContext_->ExTimer
에 이미 해제된 TimerContextInfo
객체가 저장되어 있어 이를 참조해 새로운 타이머 작업 ExSetTimer()
을 시작하고 결과적으로 해제된 풀이 참조되어 UAF가 발생합니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.