
CVE-2024-21338에 대한 개념 증명 익스플로잇, Lazarus 그룹이 0day로 사용한 Windows AppLocker 드라이버(appid.sys) 권한 상승 취약점. 조작된 IOCTL 요청 및 PreviousMode 조작을 통해 커널 읽기/쓰기를 달성합니다.
이는 CVE-2024-21338에 대한 POC로, 이 취약점은 Windows AppLocker 드라이버(appid.sys)의 권한 상승 취약점으로, Lazarus 조직이 0day로 활용하여 Windows 로컬 권한 상승에 사용되었습니다.
CVE-2024-21338은 2024년 2월 13일 Microsoft Patch Tuesday에서 공개된 권한 상승 취약점으로, Lazarus 해커 조직이 커널 액세스 권한을 획득하여 FudModule 루트킷을 배포하는 데 악용했습니다.
이 취약점은 appid.sys 드라이버의 0x22A018 제어 코드에 존재하며, 공격자는 특수하게 조작된 IOCTL 요청을 전송하여 취약점을 트리거하고, 임의 콜백 호출을 수행하여 최종적으로 커널 읽기/쓰기 권한을 얻을 수 있습니다.

이 취약점은 appid.sys 드라이버의 AppHashComputeImageHashInternal 함수에 있으며, AipDeviceIoControlDispatch가 0x22A018 요청을 처리할 때 PreviousMode를 올바르게 검사하지 않아 사용자 모드 프로세스가 커널 모드 콜백 함수를 트리거할 수 있습니다.
Local Service 권한 획득: 이 취약점은 \\Device\\AppID 장치에 액세스하기 위해 Local Service 권한이 필요하므로, 도구는 먼저 Local Service 프로세스를 찾아 가장(impersonate)합니다.
IOCTL 요청 구성: 도구는 제어 가능한 함수 포인터와 매개변수를 포함하는 특수하게 조작된 IOCTL 요청을 구성합니다.
취약점 트리거: IOCTL 요청을 전송하여 취약점을 트리거하고, 커널 내의 가젯(gadget) 함수를 호출하여 현재 스레드의 PreviousMode 필드를 사용자 모드에서 커널 모드로 수정합니다.
커널 읽기/쓰기 권한 획득: PreviousMode를 수정한 후, 사용자 모드 프로세스는 NtReadVirtualMemory 및 NtWriteVirtualMemory를 사용하여 임의의 커널 메모리를 읽고 쓸 수 있습니다.
Visual Studio 2026을 사용하여 이 프로젝트를 컴파일하며, Windows SDK 및 C++ 컴파일러 지원이 필요합니다.
패치되지 않은 Windows 시스템(예: Windows 10 1709)에서 Application Identity 서비스를 활성화합니다.
관리자 권한으로 컴파일된 실행 파일을 실행합니다.
도구가 자동으로 Local Service 프로세스를 찾아 해당 프로세스를 가장(impersonate)합니다.
도구가 appid.sys 드라이버를 로드하고 IOCTL 요청을 구성하여 취약점을 트리거합니다.
취약점 트리거 성공 후, 도구는 수정할 커널 주소와 값을 입력하라는 메시지를 표시하여 커널 메모리 수정을 수행합니다.
이 프로젝트는 교육 및 연구 목적으로만 사용되며, 불법적인 용도로 사용할 수 없습니다.
| 파일 이름 | 기능 설명 |
|---|
| main.cpp | 주 함수, 취약점 익스플로잇 흐름 제어 담당 |
| CVE-2024-21338.h | 취약점 익스플로잇 관련 구조체 및 함수 선언 |
| CVE-2024-21338.cpp | 취약점 익스플로잇의 전제 조건 구현 함수 |
| export_func.h | 내보내기 함수 선언 |
| gadget_search.cpp | 커널 가젯 검색 구현 |
| Native.h | 네이티브 Native API 정의 |
| PE.h | PE 파일 처리 관련 유틸리티 함수 |