Kernel Pool Forensics: обнаружение DKOM и скрытых модулей в ядре Windows
Техника DKOM (Direct Kernel Object Manipulation, T1014) позволяет руткитам скрывать присутствие в Ring 0 путем исключения элементов из двусвязных списков ядра без вызова документированных API деинициализации.
При скрытии драйвера вредоносный код удаляет запись LDR_DATA_TABLE_ENTRY из циклического списка PsLoadedModuleList (nt!PsLoadedModuleList), модифицируя указатели Flink и Blink. Аналогично скрытие потоков или процессов обходит ActiveProcessLinks в структуре EPROCESS. Поскольку стандартные системные утилиты и EDR-сенсоры верхнего уровня полагаются на обход активных структур списка, модуль исчезает из выдачи EnumDeviceDrivers и NtQuerySystemInformation.
// Модификация указателей в LDR_DATA_TABLE_ENTRY (DKOM)
Entry->InLoadOrderLinks.Blink->Flink = Entry->InLoadOrderLinks.Flink;
Entry->InLoadOrderLinks.Flink->Blink = Entry->InLoadOrderLinks.Blink;
Для выявления таких аномалий в дампах памяти применяется сканирование пулов памяти (NonPagedPool / PagedPool) по пуловым тегам (Pool Tags) и сигнатурам структур без привязки к активным спискам. В старых версиях Windows валидация опиралась на 4-байтные теги заголовков _POOL_HEADER. Начиная с Windows 10 (версии 1903+) и в Windows 11 за счет Segment Heap и Pool Quota структура _POOL_HEADER для пулов больших страниц упразднена, что требует поиска по паттернам самих объектов — в частности, сигнатурам структур _DRIVER_OBJECT (тип объекта IoDriverObjectType) и таблицам MajorFunction.
Для Blue Team
сверяйте результаты сканирования объектов в Volatility/Rekall (плагины windows.driverscan, windows.modscan) со списком windows.modules. Несовпадение адреса базы драйвера в пуле со связным списком PsLoadedModuleList однозначно указывает на раслинковку. Дополнительные векторы верификации: анализ целостности цепочек DriverObject->DriverInit, перехваты в MajorFunction[], проверка IRP-хуков и сопоставление страниц памяти исполняемого пула с диапазонами легитимно загруженных PE-образов (VAD/ System PTEs).
@poxek | @poxek_ai | MAX
Техника DKOM (Direct Kernel Object Manipulation, T1014) позволяет руткитам скрывать присутствие в Ring 0 путем исключения элементов из двусвязных списков ядра без вызова документированных API деинициализации.
При скрытии драйвера вредоносный код удаляет запись LDR_DATA_TABLE_ENTRY из циклического списка PsLoadedModuleList (nt!PsLoadedModuleList), модифицируя указатели Flink и Blink. Аналогично скрытие потоков или процессов обходит ActiveProcessLinks в структуре EPROCESS. Поскольку стандартные системные утилиты и EDR-сенсоры верхнего уровня полагаются на обход активных структур списка, модуль исчезает из выдачи EnumDeviceDrivers и NtQuerySystemInformation.
// Модификация указателей в LDR_DATA_TABLE_ENTRY (DKOM)
Entry->InLoadOrderLinks.Blink->Flink = Entry->InLoadOrderLinks.Flink;
Entry->InLoadOrderLinks.Flink->Blink = Entry->InLoadOrderLinks.Blink;
Для выявления таких аномалий в дампах памяти применяется сканирование пулов памяти (NonPagedPool / PagedPool) по пуловым тегам (Pool Tags) и сигнатурам структур без привязки к активным спискам. В старых версиях Windows валидация опиралась на 4-байтные теги заголовков _POOL_HEADER. Начиная с Windows 10 (версии 1903+) и в Windows 11 за счет Segment Heap и Pool Quota структура _POOL_HEADER для пулов больших страниц упразднена, что требует поиска по паттернам самих объектов — в частности, сигнатурам структур _DRIVER_OBJECT (тип объекта IoDriverObjectType) и таблицам MajorFunction.
Для Blue Team
сверяйте результаты сканирования объектов в Volatility/Rekall (плагины windows.driverscan, windows.modscan) со списком windows.modules. Несовпадение адреса базы драйвера в пуле со связным списком PsLoadedModuleList однозначно указывает на раслинковку. Дополнительные векторы верификации: анализ целостности цепочек DriverObject->DriverInit, перехваты в MajorFunction[], проверка IRP-хуков и сопоставление страниц памяти исполняемого пула с диапазонами легитимно загруженных PE-образов (VAD/ System PTEs).
@poxek | @poxek_ai | MAX