RegPhantom Backdoor: Threat Analysis and Detection Insights
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
RegPhantom은 숨겨진 레지스트리 기반 명령 채널을 통해 커널 공간에서 임의의 코드를 실행할 수 있도록 저권한 사용자 모드 프로세스를 허용하는 은밀한 윈도우 커널 루트킷입니다. 드라이버는 유효한 인증서로 서명되어 있으며, 반사적 PE 로딩을 기반으로 하며 작업이 완료되면 실행 아티팩트를 제거합니다. 이는 파일이나 레지스트리 항목 없이 드라이버 서명 집행 제어를 회피하도록 설계되었습니다. 효과적인 탐지는 따라서 드라이버 바이너리 자체 및 그에 포함된 독특한 코드 패턴을 식별하는 데 의존합니다.
조사
연구는 여러 서명되거나 서명되지 않은 .sys 샘플을 2025년 6월부터 8월까지 수집하여, 공통의 CFG-난독화된 코드 기반과 CmRegisterCallback에 기반한 레지스트리 가로채기 메커니즘을 폭로했습니다. 드라이버는 56바이트 XOR-보호 페이로드를 해독하고, 반사적으로 커널 메모리에 맵핑하여 실행 후 증거를 삭제합니다. 샘플 연대기와 인증서 사용은 중국과 연관된 위협 행위자와 관련된 지속적인 개발 활동을 지적합니다.
완화
보안 팀은 신뢰할 수 없는 커널 드라이버를 차단하고, CmRegisterCallback and PsSetCreateThreadNotifyRoutine의 의심스러운 사용을 주의하고 드라이버 파일에 대한 실행 시 무결성 검증을 시행해야 합니다. YARA 규칙을 배포하여 드라이버의 고유한 바이트 시퀀스와 일치시켜야 하며, 엄격한 코드 서명 집행이 유지되어야 합니다. 특히 거듭 발생하는 접근 거부 이벤트를 감시하여 비정상적인 레지스트리 쓰기 실패를 모니터링함으로써 은밀한 통신 채널을 노출할 수 있습니다.
대응
RegPhantom이 발견되면 감염된 엔드포인트를 격리하고, 악성 드라이버를 삭제하며, 깊은 포렌식 검토를 위해 전체 커널 메모리 덤프를 캡처하십시오. 어떠한 남용된 서명 인증서도 철회하고 필요에 따라 신뢰할 수 있는 인증서 저장소를 업데이트하십시오. 이후 위협 헌팅은 환경 전반에서 드라이버의 레지스트리 가로채기 행동을 집중적으로 조사한 후, 잠재적으로 노출된 모든 윈도우 시스템의 복구 작업을 이어 나가야 합니다.
공격 흐름
탐지
시뮬레이션 실행
전제 조건: Telemetry & Baseline Pre‑flight Check가 통과되어야 합니다.
근거: 이 섹션은 탐지 규칙을 발동하기 위해 설계된 적대적 기술(TTP)의 정밀한 실행을 설명합니다. 명령과 내러티브는 식별된 TTP를 직접 반영해야 하며, 탐지 로직이 기대하는 정확한 텔레메트리를 생성하는 것을 목표로 해야 합니다.
-
공격 내러티브 및 명령
- 목적: 레지스트리 관련 자격 증명 작업을 가로챌 커널 모드 레지스트리 콜백을 등록하려는 RegPhantom의 시도를 시뮬레이션합니다.
- 방법: 콜백 루틴을
CmRegisterCallback와 함께 가리키는 오류 생명 드라이버를 로드합니다.RegNtPreSetValueKey. 드라이버는 의도적으로 잘못된 등록 구조로 인해STATUS_ACCESS_DENIED. - 결과: Sysmon이 EventID 13을 기록하고,
TargetObject가 포함되어 있습니다. 모두CmRegisterCallbackandRegNtPreSetValueKey,세부정보가 보고되고데이터 크기 정확히 56바이트 (0x38), 그리고상태가 설정됩니다.STATUS_ACCESS_DENIED.
-
회귀 테스트 스크립트 (PowerShell + 포함된 C 드라이버 소스 – 대상 호스트에서 컴파일)
# -------------------------------------------------------------- # Step 1: 최소 드라이버 소스를 디스크에 기록 # -------------------------------------------------------------- $driverSource = @" #include // 더미 콜백 – 호출되지 않음 NTSTATUS DummyCallback( _In_ PVOID CallbackContext, _In_ PVOID Argument1, _In_ PVOID Argument2 ) { UNREFERENCED_PARAMETER(CallbackContext); UNREFERENCED_PARAMETER(Argument1); UNREFERENCED_PARAMETER(Argument2); return STATUS_SUCCESS; } extern "C" NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) { UNREFERENCED_PARAMETER(DriverObject); UNREFERENCED_PARAMETER(RegistryPath); // 의도적으로 잘못된 크기(56바이트)를 사용하고 STATUS_ACCESS_DENIED로 거부되는 콜백 등록을 요청합니다. UNICODE_STRING altitude = RTL_CONSTANT_STRING(L"1234.5678.90ab"); LARGE_INTEGER cookie = {0}; // 잘못된 요청을 시뮬레이션하는 null 콜백 포인터 전달하여 실패 강제 NTSTATUS status = CmRegisterCallback(DummyCallback, NULL, &cookie); // RegPhantom이 보는 정확한 조건을 모방하기 위해 상태 덮어쓰기 status = STATUS_ACCESS_DENIED; // 0xC0000022 // 이벤트를 포착할 수 있도록 짧은 시간 동안 드라이버 로드 상태 유지 LARGE_INTEGER interval; interval.QuadPart = -10 * 1000000; // 1초 KeDelayExecutionThread(KernelMode, FALSE, &interval); // 언로드하기 전에 등록 취소 CmUnregisterCallback(cookie); return STATUS_SUCCESS; } "@ $srcPath = "$env:TEMPRegPhantomStub.c" $srcPath | Set-Content -Value $driverSource -Encoding ASCII # -------------------------------------------------------------- # Step 2: 드라이버 컴파일 (Visual Studio Build Tools 필요) # -------------------------------------------------------------- Write-Host "드라이버 컴파일 중 – Windows Driver Kit (WDK)와 VS Build Tools 필요." $compileCmd = "cl /nologo /W3 /WX- /O2 /DUNICODE /D_UNICODE /Zi /MD /LD $srcPath /link /OUT:`"$env:TEMPRegPhantomStub.sys`"" & cmd /c $compileCmd # -------------------------------------------------------------- # Step 3: 드라이버 로드 (관리자로 실행해야 함) # -------------------------------------------------------------- Write-Host "등록 시도 발동을 위해 드라이버 로딩 중..." $driverPath = "$env:TEMPRegPhantomStub.sys" sc create RegPhantomStub binPath= $driverPath type= kernel start= demand sc start RegPhantomStub # -------------------------------------------------------------- # Step 4: 이벤트를 수집할 수 있도록 Sysmon에 시간 제공 # -------------------------------------------------------------- Start-Sleep -Seconds 5 # -------------------------------------------------------------- # Step 5: 드라이버 언로드 및 삭제 # -------------------------------------------------------------- sc stop RegPhantomStub sc delete RegPhantomStub Remove-Item -Path $driverPath -Force Remove-Item -Path $srcPath -Force Write-Host "시뮬레이션 완료. SIEM에서 탐지를 확인하십시오." -
정리 명령 (드라이버가 컴파일되지 않거나 로드되지 않았을 경우)
# 만약 만들어진 드라이버 서비스가 있다면 제거 if (Get-Service -Name RegPhantomStub -ErrorAction SilentlyContinue) { sc stop RegPhantomStub sc delete RegPhantomStub } # 남은 파일 제거 Remove-Item -Path "$env:TEMPRegPhantomStub.*" -Force -ErrorAction SilentlyContinue