
CVE-2018-7249에 대한 PoC
secdrv.sys에서 발견된 문제로, Microsoft Windows Vista, Windows 7, Windows 8, KB3086255 이전의 Windows 8.1 및 Macrovision SafeDisc에 포함된 버전에 영향을 미칩니다. IOCTL 0xCA002813에 대한 두 번의 정밀한 타이밍 호출은 use-after-free로 이어지는 경쟁 조건을 유발할 수 있습니다. 악용될 경우, 권한이 없는 공격자가 커널에서 임의 코드를 실행할 수 있습니다.
이 취약점은 Microsoft에 보고되었지만, 최신 Windows 시스템(KB3086255 이전 버전만 해당)에는 영향을 미치지 않으므로 Microsoft는 어떤 조치도 취하지 않을 것입니다. Windows 7 x86에서 테스트 및 악용에 성공했습니다.
또한 CVE-2018-7250과 관련이 있습니다.

이 문서는 secdrv.sys 드라이버에 대한 저의 작은 연구를 기록한 것입니다. 설명된 드라이버의 모든 동작은 리버스 엔지니어링된 것이며 부정확하거나 틀릴 수 있습니다.
IOCTL (0x0CA002813) 입력 버퍼의 오프셋 0x4에는 TYPE이라고 부를 숫자가 포함되어 있습니다. 이 IOCTL (0x0CA002813)의 기본 처리 함수인 sub_11A88은 0x96, 0x97, 0x98의 세 가지 유형을 받습니다.
IOCTL 유형 0x96이 새 청크를 할당하고 완전히는 아니지만 초기화한 후, 해당 청크를 사용자 모드에 복사합니다. 새로 할당된 청크의 16비트는 초기화되지 않은 채로 남아 있으며 이전 PagedPool 할당의 데이터를 포함합니다. 그런 다음 초기화되지 않은 비트는 REP MOVSD 명령에 의해 .text:00011BE9에서 사용자 모드로 복사됩니다. PoC 코드는 여기에 있습니다.
IOCTL 유형 0x97이 호출되면, 태그를 통해 이전에 유형 0x96으로 할당된 필요한 청크를 찾습니다. 할당이 이미 IOCTL 유형 0x97에 의해 해제된 경우 DeviceIoControl은 오류를 반환합니다. 여기서의 취약점은 유형 0x97이 사용하는 할당이 작업 중에 해제될 수 있다는 것입니다(동기화 메커니즘이 사용되지 않으므로). 따라서 경쟁에서 이기면 use-after-free가 발생합니다.
공격자가 IOCTL 유형 0x97의 작업 중에(유형 0x98을 사용하여) 청크를 해제하고, 정확히 동일한 메모리 위치에 자신이 제어하는 새 청크를 할당할 수 있다면, 다른 구조체를 가리키는 포인터를 덮어쓸 수 있습니다. 해당 구조체에는 함수 포인터가 포함되어 있으며, 이를 사용하여 궁극적으로 드라이버의 실행 흐름을 가로채고 ring 0에서 임의 코드를 실행할 수 있습니다.
암호화 루틴은 크기가 매우 클 수 있는 사용자 제공 버퍼에 대해 수행되므로 암호화 실행에 오랜 시간이 걸릴 수 있습니다. 이는 IOCTL 유형 0x98이 청크가 아직 사용 중일 때 해제할 수 있는 완벽한 시간 창을 제공합니다. 이 시간 창은 매우 길어질 수 있으므로(1초 이상!) 첫 시도에서도 확실하게 경쟁에서 이길 수 있습니다. use-after-free는 .text:00011B68에서 시작되며, 셸코드로 점프하도록 가로채질 실제 호출은 .text:00011B86에서 발생합니다.
이 취약점을 성공적으로 악용하기 위해 수행되는 단계는 다음과 같습니다:
OS: Windows 7 Kernel Version 7600 MP (1 procs) Free x86 compatible Built by: 7600.16385.x86fre.win7_rtm.090713-1255 VM: 4GB RAM, 1 CPU 하드웨어: Windows 10 Pro 64 bit, 메인보드 Gigabyte Z370 HD3, 16GB RAM, Intel i5-8400 2.80GHz (6 CPUs)