SOC Prime Bias: 중간

26 3월 2026 16:14

RegPhantom Backdoor: Threat Analysis and Detection Insights

Author Photo
Ruslan Mikhalov SOC Prime에서 위협 연구 책임자 linkedin icon 팔로우
RegPhantom Backdoor: Threat Analysis and Detection Insights
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

RegPhantom은 숨겨진 레지스트리 기반 명령 채널을 통해 커널 공간에서 임의의 코드를 실행할 수 있도록 저권한 사용자 모드 프로세스를 허용하는 은밀한 윈도우 커널 루트킷입니다. 드라이버는 유효한 인증서로 서명되어 있으며, 반사적 PE 로딩을 기반으로 하며 작업이 완료되면 실행 아티팩트를 제거합니다. 이는 파일이나 레지스트리 항목 없이 드라이버 서명 집행 제어를 회피하도록 설계되었습니다. 효과적인 탐지는 따라서 드라이버 바이너리 자체 및 그에 포함된 독특한 코드 패턴을 식별하는 데 의존합니다.

조사

연구는 여러 서명되거나 서명되지 않은 .sys 샘플을 2025년 6월부터 8월까지 수집하여, 공통의 CFG-난독화된 코드 기반과 CmRegisterCallback에 기반한 레지스트리 가로채기 메커니즘을 폭로했습니다. 드라이버는 56바이트 XOR-보호 페이로드를 해독하고, 반사적으로 커널 메모리에 맵핑하여 실행 후 증거를 삭제합니다. 샘플 연대기와 인증서 사용은 중국과 연관된 위협 행위자와 관련된 지속적인 개발 활동을 지적합니다.

완화

보안 팀은 신뢰할 수 없는 커널 드라이버를 차단하고, CmRegisterCallback and PsSetCreateThreadNotifyRoutine의 의심스러운 사용을 주의하고 드라이버 파일에 대한 실행 시 무결성 검증을 시행해야 합니다. YARA 규칙을 배포하여 드라이버의 고유한 바이트 시퀀스와 일치시켜야 하며, 엄격한 코드 서명 집행이 유지되어야 합니다. 특히 거듭 발생하는 접근 거부 이벤트를 감시하여 비정상적인 레지스트리 쓰기 실패를 모니터링함으로써 은밀한 통신 채널을 노출할 수 있습니다.

대응

RegPhantom이 발견되면 감염된 엔드포인트를 격리하고, 악성 드라이버를 삭제하며, 깊은 포렌식 검토를 위해 전체 커널 메모리 덤프를 캡처하십시오. 어떠한 남용된 서명 인증서도 철회하고 필요에 따라 신뢰할 수 있는 인증서 저장소를 업데이트하십시오. 이후 위협 헌팅은 환경 전반에서 드라이버의 레지스트리 가로채기 행동을 집중적으로 조사한 후, 잠재적으로 노출된 모든 윈도우 시스템의 복구 작업을 이어 나가야 합니다.

“graph TB %% Class Definitions Section classDef technique fill:#ffcc99 classDef action fill:#99ccff classDef operator fill:#ff9900 classDef builtin fill:#cccccc %% Node definitions step_persistence[“<b>단계</b> – 유효한 코드 서명 인증서를 사용하여 부팅 시 로드되는 서명된 악성 드라이버를 통한 지속성 유지.”] class step_persistence action tech_boot_autostart[“<b>기술</b> – <b>T1547.009 커널 드라이버 및 모듈</b><br/>시스템 시작 시 악성 드라이버를 로드하여 지속성을 확보하고 커널 모드 권한을 얻기.”] class tech_boot_autostart technique tech_code_signing[“<b>기술</b> – <b>T1553.002 신뢰 제어 굴복: 코드 서명</b><br/>운전 서명 집행을 우회하도록 정당한 코드 서명 인증서를 활용합니다.”] class tech_code_signing technique tech_priv_esc[“<b>기술</b> – <b>T1068 권한 상승용 착취</b><br/>커널 드라이버가 공격자 코드에 시스템 수준 권한을 부여합니다.”] class tech_priv_esc technique step_hook_registration[“<b>단계</b> – 드라이버는 시스템 콜백을 등록하여 자신의 존재를 숨기고 작업을 가로챕니다.”] class step_hook_registration action tech_rootkit[“<b>기술</b> – <b>T1014 루트킷</b><br/>커널 모드 루트킷 구성 요소를 설치하고 악성 활동을 은폐하기 위한 콜백을 훅 합니다.”] class tech_rootkit technique step_registry_channel[“<b>단계</b> – 드라이버가 가로채고 해독하는 레지스트리 쓰기를 사용하는 은밀한 명령 채널.”] class step_registry_channel action tech_query_registry[“<b>기술</b> – <b>T1012 레지스트리 쿼리</b><br/>명령 또는 구성 데이터를 받기 위해 레지스트리 값을 읽습니다.”] class tech_query_registry technique tech_deobfuscate[“<b>기술</b> – <b>T1140 파일이나 정보 복호화/디코드</b><br/>레지스트리에서 가져온 XOR 암호화된 페이로드를 해독합니다.”] class tech_deobfuscate technique step_reflective_load[“<b>단계</b> – 커스텀 로더를 사용하여 커널 메모리로 반사적 PE 페이로드 로드.”] class step_reflective_load action tech_reflective_loading[“<b>기술</b> – <b>T1620 반사적 코드 로딩</b><br/>디스크에 손대지 않고 메모리에서 직접 코드 로드 및 실행.”] class tech_reflective_loading technique step_memory_wipe[“<b>단계</b> – 할당된 메모리를 지우고 실행 후 임시 아티팩트 제거.”] class step_memory_wipe action tech_clear_persistence[“<b>기술</b> – <b>T1070.009 지속성 제거</b><br/>로드된 모듈 및 관련 지속성 아티팩트의 흔적 삭제.”] class tech_clear_persistence technique step_hook_hijack[“<b>단계</b> – 페이로드가 드라이버 훅 포인터를 하이재킹하여 지속성을 유지하고 활동을 추가로 숨깁니다.”] class step_hook_hijack action %% Connections showing flow step_persistence –>|사용하는| tech_boot_autostart step_persistence –>|굴복시키는| tech_code_signing step_persistence –>|가능하게 하는| tech_priv_esc step_persistence –>|이끄는| step_hook_registration step_hook_registration –>|적용하는| tech_rootkit step_hook_registration –>|이끄는| step_registry_channel step_registry_channel –>|접근하는| tech_query_registry step_registry_channel –>|수행하는| tech_deobfuscate step_registry_channel –>|이끄는| step_reflective_load step_reflective_load –>|실행하는| tech_reflective_loading step_reflective_load –>|이끄는| step_memory_wipe step_memory_wipe –>|지우는| tech_clear_persistence step_memory_wipe –>|이끄는| step_hook_hijack step_hook_hijack –>|유지하는| tech_rootkit “

공격 흐름

시뮬레이션 실행

전제 조건: Telemetry & Baseline Pre‑flight Check가 통과되어야 합니다.

근거: 이 섹션은 탐지 규칙을 발동하기 위해 설계된 적대적 기술(TTP)의 정밀한 실행을 설명합니다. 명령과 내러티브는 식별된 TTP를 직접 반영해야 하며, 탐지 로직이 기대하는 정확한 텔레메트리를 생성하는 것을 목표로 해야 합니다.

  • 공격 내러티브 및 명령

    1. 목적: 레지스트리 관련 자격 증명 작업을 가로챌 커널 모드 레지스트리 콜백을 등록하려는 RegPhantom의 시도를 시뮬레이션합니다.
    2. 방법: 콜백 루틴을 CmRegisterCallback 와 함께 가리키는 오류 생명 드라이버를 로드합니다. RegNtPreSetValueKey. 드라이버는 의도적으로 잘못된 등록 구조로 인해 STATUS_ACCESS_DENIED.
    3. 결과: Sysmon이 EventID 13을 기록하고, TargetObject 가 포함되어 있습니다. 모두 CmRegisterCallback and RegNtPreSetValueKey, 세부정보 가 보고되고 데이터 크기 정확히 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