
pstrip64.sys 커널 드라이버는 낮은 권한의 사용자가 물리 메모리의 임의 범위를 자신의 가상 주소 공간에 매핑할 수 있게 해주는 IOCTL을 노출합니다. 이 프리미티브는 시스템의 물리적 RAM에 대한 전체 읽기/쓰기 액세스를 허용하므로, 공격자가 중요한 커널 구조를 수정하고 NT AUTHORITY\SYSTEM으로 권한을 상승시킬 수 있습니다.
pstrip64.sys 커널 드라이버는 낮은 권한의 사용자가 임의의 물리 메모리 범위를 자신의 가상 주소 공간에 매핑할 수 있게 해주는 IOCTL을 노출합니다. 이 프리미티브는 시스템의 물리 RAM에 대한 완전한 읽기/쓰기 액세스를 허용하므로, 공격자가 중요한 커널 구조를 수정하고 NT AUTHORITY\SYSTEM 권한으로 권한을 상승시킬 수 있습니다.
이 드라이버는 사용자가 접근할 수 있는 디바이스 객체 \Device\PSTRIP64와 심볼릭 링크 \DosDevices\PSTRIP64를 생성합니다.
취약점은 DispatchDeviceControl 루틴, 특히 IOCTL 0x80002008용 핸들러에 존재합니다. sub_11000 함수는 \Device\PhysicalMemory에 대한 핸들을 열고 ZwMapViewOfSection을 통해 호출 프로세스의 주소 공간에 직접 매핑합니다. 입력 버퍼에서 물리 주소와 길이를 받아 HalTranslateBusAddress를 통해 변환한 다음 ZwCurrentProcess()를 사용하여 매핑합니다. 공격자는 물리 메모리를 스캔하여 자신의 프로세스의 _EPROCESS 구조를 찾고 보안 토큰을 System으로 덮어쓰거나 커널 코드를 직접 패치할 수 있습니다.
유사한 취약점은 이전 버전의 앱에서 pstrip.sys 파일에 대해 CVE-2008-5725로 처음 확인되었습니다. 당시 PowerStrip 드라이버는 IOCTL 0x800020A8을 사용하여 공격자가 대상 주소(예: HalDispatchTable)와 해당 주소에 쓸 데이터를 전달할 수 있게 했습니다. 이번에 최신 버전에서 발견된 취약점은 사용자가 임의의 물리 메모리를 자신의 프로세스에 매핑할 수 있도록 명시적으로 허용합니다. 공격자는 물리 RAM을 매핑하고, 자신의 프로세스 구조를 스캔한 다음, 토큰을 수동으로 편집하여 관리자 권한을 획득합니다. 메모리에 직접 작용합니다.
RtlInitUnicodeString(&DestinationString, L"\\Device\\PhysicalMemory");
// ...
result = ZwOpenSection(&SectionHandle, 0xF001Fu, &ObjectAttributes);
// ...
v8 = ZwMapViewOfSection(..., (HANDLE)0xFFFFFFFFFFFFFFFFLL, ...);
권한 상승을 입증하기 위한 PoC가 개발되었으나, 오용을 방지하기 위해 코드는 공개적으로 제공되지 않습니다.
_EPROCESS 구조를 스캔합니다._EPROCESS를 찾으면, 도구는 System Token 값을 공격자의 Token 필드에 복사합니다.
