
Gigabyte gdrv3.sys IOCTL을 악용하여 검사되지 않은 물리 메모리 읽기를 통해 SYSTEM 토큰을 사용자 프로세스에 기록하는 로컬 권한 상승 개념 증명.
안녕 해커들.
gdrv3.sys는 Gigabyte App Center와 EasyTune에 포함되어 배포되는 서명된 커널 드라이버다. 이 드라이버는 보안 서술자 없이 \.\GIOV3를 생성하므로, 로컬 사용자라면 누구나 관리자 권한 없이, UAC 없이 열 수 있다. 이 드라이버의 IOCTL 두 개가 전부다.
첫 번째 IOCTL(0xC3502019)은 물리 메모리를 읽는다고 되어 있다. 물리 주소, 길이, 출력 포인터를 주면 그곳에 바이트를 복사한다. 문제는 출력 포인터다. 드라이버는 그것이 사용자 공간인지 전혀 확인하지 않는다. ProbeForWrite도, 경계 검사도, 아무것도 없다. 그래서 "읽기"는 사실상 write-what-where이며, 결과가 어디에 떨어질지만 고르면 된다. 물리 메모리에서 SYSTEM 프로세스 토큰을 읽은 다음, 출력 포인터를 자신의 EPROCESS 토큰 필드로 바로 향하게 하면 된다. 드라이버가 SYSTEM 토큰을 당신의 프로세스에 대신 써 넣어준다.
그게 익스플로잇의 전부다. 메모리 손상도, 커널 모드 셸코드도 없다. CPL0에서 실행되어서는 안 되는 것이 실행되지 않으므로 SMEP, SMAP, KVAS, CET, CFG는 등장하지 않는다. 데이터만 사용하는 방식이며, 매번 성공했다. 두 번째 IOCTL 쌍(0xC3502584 읽기, 0xC3502580 쓰기)은 고전적인 방식이다. 임의의 MSR, 인덱스 화이트리스트 없음. IA32_LSTAR를 읽는 것만으로도 KASLR이 그 자체로 깨지고, 쓰면 syscall 진입점을 탈취한다. SMEP/SMAP 우회가 필요해서 보조 경로로 남겨두었지만, 그것만으로도 심각하다.
일반 사용자 계정에서 빌드하고 실행:
gcc -O2 -o poc.exe poc.c -lpsapi
poc.exe
Windows 10 x64 22H2(빌드 19045)에서 테스트했다. 이 드라이버는 Gigabyte App Center와 함께 배포되므로, 많은 Gigabyte 메인보드에서 이미 로드되어 있다.
2026년 6월에 Gigabyte에 제보했고 그들은 수정했다. 최신 빌드는 장치에 SDDL을 적용해 관리자만 접근하도록 잠그고, MSR 쓰기에 화이트리스트를 추가한다. 현재의 gdrv3는 더 이상 이 방식으로 익스플로잇할 수 없다.
