Задній хід RegPhantom: Аналіз загрози та рекомендації з виявлення
Detection stack
- AIDR
- Alert
- ETL
- Query
Резюме
RegPhantom – це rootkit для ядра Windows, зосереджений на приховуванні, який дозволяє процесам користувацького режиму з низьким привілеєм виконувати будь-який код у просторі ядра через прихований канал команд на основі реєстру. Драйвер підписаний дійсними сертифікатами, використовує відбивне завантаження PE і видаляє артефакти виконання, як тільки його робота завершена. Його архітектура побудована для уникання контролю за підписами драйверів, уникаючи постійних файлів або записів реєстру. Ефективне виявлення, таким чином, залежить від ідентифікації самого двійкового файлу драйвера і характерних шаблонів коду, які він містить.
Розслідування
Дослідження переглянуло кілька підписаних і непідписаних .sys зразків, зібраних між червнем і серпнем 2025 року, які виявили спільну базу коду з обфусцированим CFG і механізм перехоплення реєстру, побудований на CmRegisterCallback. Драйвер розшифровує 56-байтовий навішений XOR корисний навантаження, відбивно відображає його в пам’яті ядра, виконує його, а потім знищує докази. Хронологія зразків і використання сертифікатів вказують на подальшу активність розвитку, пов’язану з загрозою з Китаю.
Пом’якшення
Команди безпеки повинні блокувати недовірені драйвери ядра, слідкувати за підозрілим використанням CmRegisterCallback and PsSetCreateThreadNotifyRoutine, і забезпечити перевірку цілісності під час запуску для файлів драйверів. Слід використовувати правила YARA для відповідності унікальним байтовим послідовностям драйвера, а строгий контроль підпису коду повинен залишатися в силі. Моніторинг незвичних збоїв запису реєстру, особливо повторюваних подій відмови у доступі, також може виявити прихований канал зв’язку.
Відповідь
Якщо виявлено RegPhantom, ізолюйте уражений кінцевий пристрій, видаліть зловмисний драйвер і збережіть повну дампу пам’яті ядра для глибшого судового огляду. Відкличте будь-які зловживані підписні сертифікати та оновіть довірені сертифікати за потребою. Полювання на загрози повинно зосередитись на поведінці перехоплення реєстру драйвера по всьому середовищу, після чого провести відновлення всіх потенційно уражених систем Windows.
Потік атаки
Детектування
Можлива атака 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