[하루한줄] CVE-2025-53149 : Windows ksthunk.sys heap-based buffer overflow로 인한 LPE 취약점
URL
Target
- < Windows 11 Version 24H2 / Server 2025 Build version 10.0.26100.4946
- < Windows 11 Version 23H2 Build version 10.0.22631.5768
- < Windows 11 Version 22H2 Build version 10.0.22621.5768
Explain
이 취약점은 Kernel Streaming의 ksthunk.sys 드라이버에서 발생했습니다. 32bit 프로세스가 64비트 커널 드라이버와 통신하는 과정에서 Kernel Pool Heap Overflow가 발생하고 LPE로 이어져 SYSTEM권한을 획득할 수 있습니다.
Root Cause
취약점의 발생 위치는 CKSAutomationThunk::HandleArrayProperty() 이고, 이 함수는 커널 공간 메모리에서 버퍼의 복사본을 수신합니다.

CKSAutomationThunk::ThunkPropertyIrp() 함수는 프로세스가 사용자 모드이고, wow64 환경일 때 호출됩니다. 이 함수는 입력 버퍼 길이를 검사하고 KSPROPERTY.Flags를 읽고 최하위 2비트가 0이면 1을 반환하게 됩니다.

이때, 만약 KSPROPERTY.Flags에 KSPROPERTY.Flags에 KSPROPERTY_TYPE_SET 또는 KSPROPERTY_TYPE_GET이 설정된 경우 특정 속성 세트로 처리됩니다.

이 속성 세트 중 VPConfig와 VPVBIConfig는 동일한 세트의 항목을 가지고,

항목 중 KSPROPERTY_VPCONFIG_DDRAWSURFACEHANDLE를 0xE인덱스로 접근했을 때 취약한 함수인 CKSAutomationThunk::HandleArrayProperty()가 핸들러로 사용됩니다.
NTSTATUS CKSAutomationThunk::HandleArrayProperty(PIRP Irp, PKSIDENTIFIER SystemInputBuffer, unsigned int *SystemOutputBuffer);
이 함수는 IRP포인터, KSPROPERTY포인터와 data포인터를 인자로 받습니다.
CKSAutomationThunk::HandleArrayProperty() 는 커널 공간 메모리에서 버퍼의 복사본을 받고 이 영역은 ks!KspPropertyHandler()함수에 의해 비페이지 메모리에 할당 됩니다. 실제로 SystemInputBuffer와 SystemOutputBuffer 2가지 포인터는 동일한 영역을 가리키지만 그 안의 서로 다른 오프셋을 가리키고 있습니다.

CKSAutomationThunk::HandleArrayProperty() 함수 내부엔 속성을 설정하고 가져오는 코드가 존재하는데, 취약점은 속성을 가져오는 코드에 존재합니다.
첫 KsSynchronousIoControlDevice()호출에서는 읽을 바이트 수를 확인 후 메모리를 할당하고, 2번째 호출에서 장치의 배열을 읽게 됩니다. 읽은 후 배열 내용을 SystemOutputBuffer가 가리키는 메모리로 복사 하게 되는데 이때 OutputBufferLength가 올바르게 검사되지 않게 됩니다. 첫 KsSynchronousIoControlDevice()호출에서 반환된 값과 비교하지 않기 때문입니다.
이로 인해 코드 하단의 while문에서 비페이지형 힙 오버플로우가 발생합니다.
Patch

2번째 KsSynchronousIoControlDevice()함수 이후에 OutputBufferLength를 확인하는 코드가 추가 되었습니다. 출력 버퍼에 공간이 부족하면 코드의 흐름이 RtlLogUnexpectedCodepath()함수로 이동하게 됩니다.
Reference
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.