Задній хід RegPhantom: Аналіз загрози та рекомендації з виявлення
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
“
Потік атаки
Детектування
Можлива атака BYOVD – Внесення власного уразливого драйвера (за допомогою аудиту)
Перегляд
Можлива атака BYOVD – Внесення власного уразливого драйвера (за допомогою file_event)
Перегляд
IOC (HashSha256) для виявлення: Аналіз загрози задньої двері RegPhantom Частина 1
Перегляд
IOC (HashSha256) для виявлення: Аналіз загрози задньої двері RegPhantom Частина 2
Перегляд
Виявлення реєстрації зворотного виклику RegPhantom [Подія реєстру Windows]
Перегляд
Виконання симуляції
Попередня умова: Перевірка готовності телеметрії та базової лінії повинна бути пройдена.
Обґрунтування: Цей розділ деталізує точне виконання техніки противника (TTP), розробленої для виклику правила виявлення. Команди та наративи МАЮТЬ безпосередньо відображати ідентифіковані TTP і прагнути генерувати точну телеметрію, яку очікує логіка виявлення.
-
Барвиста опис та команди атаки
- Ціль: Емулювати спробу RegPhantom зареєструвати зворотний виклик реєстру на рівні ядра, який буде перехоплювати операції з реєстром, що пов’язані з обліковими даними.
- Метод: Завантажити мінімальний драйвер, що навмисно провалюється, який викликає
CmRegisterCallbackіз зворотнім викликом, що вказує наRegNtPreSetValueKey. Драйвер навмисно передає невірну структуру реєстрації, яка призводить доSTATUS_ACCESS_DENIED. - Результат: Системний монітор (Sysmon) фіксує EventID 13 з
TargetObjectвміщує обидваCmRegisterCallbackandRegNtPreSetValueKey,ДеталізвітуючиРозмір даних точно 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