SOC Prime Bias: Середній

26 Mar 2026 13:14 UTC

Задній хід RegPhantom: Аналіз загрози та рекомендації з виявлення

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Стежити
Задній хід RegPhantom: Аналіз загрози та рекомендації з виявлення
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Резюме

RegPhantom – це rootkit для ядра Windows, зосереджений на приховуванні, який дозволяє процесам користувацького режиму з низьким привілеєм виконувати будь-який код у просторі ядра через прихований канал команд на основі реєстру. Драйвер підписаний дійсними сертифікатами, використовує відбивне завантаження PE і видаляє артефакти виконання, як тільки його робота завершена. Його архітектура побудована для уникання контролю за підписами драйверів, уникаючи постійних файлів або записів реєстру. Ефективне виявлення, таким чином, залежить від ідентифікації самого двійкового файлу драйвера і характерних шаблонів коду, які він містить.

Розслідування

Дослідження переглянуло кілька підписаних і непідписаних .sys зразків, зібраних між червнем і серпнем 2025 року, які виявили спільну базу коду з обфусцированим CFG і механізм перехоплення реєстру, побудований на CmRegisterCallback. Драйвер розшифровує 56-байтовий навішений XOR корисний навантаження, відбивно відображає його в пам’яті ядра, виконує його, а потім знищує докази. Хронологія зразків і використання сертифікатів вказують на подальшу активність розвитку, пов’язану з загрозою з Китаю.

Пом’якшення

Команди безпеки повинні блокувати недовірені драйвери ядра, слідкувати за підозрілим використанням CmRegisterCallback and PsSetCreateThreadNotifyRoutine, і забезпечити перевірку цілісності під час запуску для файлів драйверів. Слід використовувати правила YARA для відповідності унікальним байтовим послідовностям драйвера, а строгий контроль підпису коду повинен залишатися в силі. Моніторинг незвичних збоїв запису реєстру, особливо повторюваних подій відмови у доступі, також може виявити прихований канал зв’язку.

Відповідь

Якщо виявлено RegPhantom, ізолюйте уражений кінцевий пристрій, видаліть зловмисний драйвер і збережіть повну дампу пам’яті ядра для глибшого судового огляду. Відкличте будь-які зловживані підписні сертифікати та оновіть довірені сертифікати за потребою. Полювання на загрози повинно зосередитись на поведінці перехоплення реєстру драйвера по всьому середовищу, після чого провести відновлення всіх потенційно уражених систем Windows.

Потік атаки

Виконання симуляції

Попередня умова: Перевірка готовності телеметрії та базової лінії повинна бути пройдена.

Обґрунтування: Цей розділ деталізує точне виконання техніки противника (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 вихідний код драйвера – компіляція на цільовому хості)

    # --------------------------------------------------------------
    # Крок 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};
    
        // Примусово викликати провал, подавши порожній вказівник на зворотний виклик (імітує неправильно сформований запит)
        NTSTATUS status = CmRegisterCallback(DummyCallback, NULL, &cookie);
    
        // Перезаписати статус, щоб імітувати точний стан, який бачить RegPhantom
        status = STATUS_ACCESS_DENIED; // 0xC0000022
    
        // Утримувати драйвер завантаженим протягом короткого періоду, щоб дозволити Sysmon зафіксувати подію
        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
    
    # --------------------------------------------------------------
    # Крок 2: Компілювати драйвер (вимагає інструментів складання Visual Studio)
    # --------------------------------------------------------------
    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
    
    # --------------------------------------------------------------
    # Крок 3: Завантажити драйвер (має виконуватись як адміністратор)
    # --------------------------------------------------------------
    Write-Host "Завантаження драйвера для виклику спроби реєстрації..."
    $driverPath = "$env:TEMPRegPhantomStub.sys"
    sc create RegPhantomStub binPath= $driverPath type= kernel start= demand
    sc start RegPhantomStub
    
    # --------------------------------------------------------------
    # Крок 4: Надати Sysmon час поглинути подію
    # --------------------------------------------------------------
    Start-Sleep -Seconds 5
    
    # --------------------------------------------------------------
    # Крок 5: Розвантажити та видалити драйвер
    # --------------------------------------------------------------
    sc stop RegPhantomStub
    sc delete RegPhantomStub
    Remove-Item -Path $driverPath -Force
    Remove-Item -Path $srcPath -Force
    
    Write-Host "Симуляція завершена. Перевірте виявлення у вашій СІЕМ."
  • Команди очищення (якщо драйвер не вдалось компілювати або завантажити)

    # Переконайтеся, що будь-яка частково створена служба драйвера видалена
    if (Get-Service -Name RegPhantomStub -ErrorAction SilentlyContinue) {
        sc stop RegPhantomStub
        sc delete RegPhantomStub
    }
    # Видалити залишкові файли
    Remove-Item -Path "$env:TEMPRegPhantomStub.*" -Force -ErrorAction SilentlyContinue