
Windows 커널 섀도 스택 완화의 일부 측면을 시연하는 개념 증명(PoC)
이 프로젝트는 Microsoft가 Windows 11에서 구현한 섀도 스택(shadow stack) 완화 기능의 특정 측면을 조명하는 것을 목표로 합니다. 코드는 특히 Windows 11 24H2에 초점을 맞추고 있습니다. 커널 오프셋 관리 방식으로 인해 다른 버전의 Windows 11에서는 작동하지 않을 수 있습니다.
이 프로젝트는 클라이언트와 드라이버 두 부분으로 나뉩니다. 둘 사이의 통신은 IOCTL 메커니즘을 통해 처리됩니다. 클라이언트는 드라이버에게 커널 수준에서 작업을 수행하도록 요청합니다.
CR4 레지스터에서 CET를 활성화/비활성화하여 BSOD를 유발합니다.try/except 및 섀도 스택 동작을 강조하기 위해 나눗셈을 수행합니다.build.bat을 사용하세요.
전제 조건으로, 다음 키트는 동일한 Windows 빌드용이어야 합니다:
참고:
POC는 키트 버전 10.0.26100.0으로 테스트되었습니다.
커널 섀도 스택 완화 기능을 활성화하려면 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\ 키에 다음 값을 추가하거나 설정해야 합니다:
| Name | Type | Data |
|---|---|---|
| EnableVirtualizationBasedSecurity | REG_DWORD | 1 |
| Scenarios\HypervisorEnforcedCodeIntegrity\Enabled | REG_DWORD | 1 |
| Scenarios\KernelShadowStacks\Enabled | REG_DWORD | 1 |
또한 테스트 서명된 드라이버를 로드하려면 관리자 콘솔에서 다음 명령을 실행해야 합니다:
bcdedit /set testsigning on
그런 다음 재부팅이 필요합니다.
드라이버를 로드하려면 관리자 콘솔에서 다음 명령을 입력해야 합니다:
sc create shadow type= kernel binPath= ABSOLUTE_PATH_TO_THE_DRIVER
sc start shadow
클라이언트에는 다음과 같은 옵션이 있습니다:
FindWDK를 제공한 SergiusTheBest.
| Option | Description |
|---|
| inc | 호출자로의 반환 주소를 1만큼 증가시킵니다 |
| skip | 이전 스택 프레임을 가리키도록 RSP를 패치합니다 |
| cdisable | CR4에서 CET를 비활성화합니다 |
| cenable | CR4에서 CET를 활성화합니다 |
| wrmsr REGISTER VALUE | REGISTER를 주어진 VALUE로 씁니다 |
| wrshsk | 섀도 스택에 씁니다 |
| wrshskpte | 섀도 스택 PTE를 다시 씁니다 |
| div DIVIDEND DIVISOR | 커널 공간에서 정수 나눗셈을 수행합니다 |