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

26 Mar 2026 16:14

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

Author Photo
Ruslan Mikhalov Керівник досліджень загроз у 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.

“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[“Крок – Стійкість за допомогою підписаного зловмисного драйвера, завантаженого при запуску за допомогою дійсного сертифікату підпису коду.”] class step_persistence action tech_boot_autostart[“ТехнікаT1547.009 Драйвери та модулі ядра
Завантаження зловмисного драйвера при старті системи для досягнення стійкості та отримання привілей ядра.”] class tech_boot_autostart technique tech_code_signing[“ТехнікаT1553.002 Підрив управління довірою: Підпис коду
Використання законного сертифіката підпису коду для обходу контролю підпису драйвера.”] class tech_code_signing technique tech_priv_esc[“ТехнікаT1068 Експлуатація для підвищення привілеїв
Драйвер ядра надає кодові атакуючого привілеї системного рівня.”] class tech_priv_esc technique step_hook_registration[“Крок – Драйвер реєструє системні зворотні виклики, щоб приховати свою присутність і перехоплювати операції.”] class step_hook_registration action tech_rootkit[“ТехнікаT1014 Rootkit
Встановлення компонентів руткіта режиму ядра і підключення зворотних викликів для приховування зловмисної діяльності.”] class tech_rootkit technique step_registry_channel[“Крок – Прихований канал команд, що використовує запис реєстру, перехоплений і розшифрований драйвером.”] class step_registry_channel action tech_query_registry[“ТехнікаT1012 Питання реєстру
Читання значень реєстру для отримання команд або конфігураційних даних.”] class tech_query_registry technique tech_deobfuscate[“ТехнікаT1140 Деобфускація/Декодування файлів або інформації
Розшифрування XOR-зашифрованого корисного навантаження, отриманого з реєстру.”] class tech_deobfuscate technique step_reflective_load[“Крок – Завантаження відбивного PE корисного навантаження в пам’ять ядра за допомогою спеціального завантажувача.”] class step_reflective_load action tech_reflective_loading[“ТехнікаT1620 Відбивне завантаження коду
Завантаження та виконання коду безпосередньо з пам’яті без дотику до диска.”] class tech_reflective_loading technique step_memory_wipe[“Крок – Очищення виділеної пам’яті та видалення тимчасових артефактів після виконання.”] class step_memory_wipe action tech_clear_persistence[“ТехнікаT1070.009 Очищення стійкості
Видалення слідів завантажених модулів і пов’язаних артефактів стійкості.”] class tech_clear_persistence technique step_hook_hijack[“Крок – Корисне навантаження перехоплює хуки драйверів, щоб підтримувати стійкість і далі приховувати діяльність.”] 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 “

Потік атаки

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

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

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