[하루한줄] CVE-2021-34486: Windows(ETW) 의 UAF 취약점

URL

cve-2021-34486

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 업데이트 요청을 통해 트리거 됩니다.

첫 번째 요청에서 커널은 아래와 같이 동작합니다.

  1. ntoskrnl은 LoggerId에 해당하는 LoggerContext를 찾아 모든 GuidsLoggerContext의 알림 액세스 권한을 갖도록 합니다.
  2. 타이머 콜백 루틴 PeriodicCaptureStateTimerCallback() 에서는 CONTEXTINFO TimerContextInfo 객체를 할당하고 SendCaptureStateNotificationsWorker(PCONTEXTINFO TimerContentInfo) 콜백 루틴을 대기열에 넣습니다,
  3. SendCaptureStateNotificationsWorker()은 알림 데이터 패킷을 빌드하고 모든 Guids에 보냅니다.

취약점은 첫 번째 요청 이후 두 번째 요청에서 Guid중 하나라도 LoggerContext의 알림 액세스 권한이 없는 경우 LoggerContext→NumOfGuids를 0으로 설정해 발생합니다. 두 번째 요청에서 SendCaptureStateNotificationsWorker() 루틴은 먼저 해당 LoggerContext를 검색하는데 LoggerContext→NumOfGuids가 0이면 할당된 TimerContextInfo를 해제합니다.

이후 세 번째 요청에서 LoggerContext_->ExTimer에 이미 해제된 TimerContextInfo 객체가 저장되어 있어 이를 참조해 새로운 타이머 작업 ExSetTimer()을 시작하고 결과적으로 해제된 풀이 참조되어 UAF가 발생합니다.



본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.