Когда антивирус ничего не находит, а система ведёт себя странно — тормозит, подозрительно грузит процессор, блокирует доступ к своим же файлам, — скорее всего, вы имеете дело с вирусом, который живёт в памяти и внедрился на уровень ядра. Это один из самых неприятных типов вредоносного кода: он загружается вместе с системой, прячется от стандартных средств проверки и сохраняет контроль над машиной даже после перезагрузки. Разберёмся, как такие вещи обнаружить и что с ними делать.
- Почему memory-resident вирусы в ядре — это отдельная проблема
- Косвенные признаки: когда стоит заподозрить неладное
- Метод 1: анализ загруженных модулей ядра
- На Linux
- На Windows
- Метод 2: поведенческий анализ через системные вызовы
- Проверка на subgroup hooks (Windows)
- Проверка на syscall hooks (Linux)
- Метод 3: проверка целостности ядра
- Linux: IMA/EVM и AIDE
- Windows: проверка подписей и целостности
- Метод 4: дамп памяти и офлайн-анализ
- Снятие дампa
- Анализ дампa
- Метод 5: мониторинг в реальном времени
- Linux: eBPF и bpftrace
- Windows: Event Tracing for Windows
- Метод 6: сравнение с чистой системой
- Сравнение подходов: когда какой метод применять
- Частые ошибки при обнаружении
- Что делать в зависимости от вашей ситуации
- Практические рекомендации
- Итог
Почему memory-resident вирусы в ядре — это отдельная проблема
Обычный вирус живёт на диске — в файле, в загрузочном секторе, в макросе. Его легко найти сигнатурным или эвристическим сканированием. Другое дело — код, который загружается в оперативную память и работает в контексте ядра ОС (ring 0). Он:
- Получает полный контроль над системой, включая доступ к аппаратному обеспечению.
- Может подменять системные функции — под system calls в Windows или syscalls в Linux.
- Перехватывает вызовы файловой системы, сети и драйверов, скрывая свои файлы и трафик.
- Не существует как отдельный файл на диске, поэтому обычный антивирус его не видит.
- Если это руткит уровня ядра — он загружается раньше безопасности и может её отключить.
Поиск таких вещей требует подхода, при котором вы смотрите не на файлы, а на то, что система делает в реальном времени — на аномалии в памяти, поведении, структурах данных ядра.
Косвенные признаки: когда стоит заподозрить неладное
Прежде чем браться за глубокие инструменты, имеет смысл проверить поведенческие признаки. Вот что должно насторожить:
- Система загружается значительно дольше, чем раньше, без видимых причин.
- В автозагрузке появились неизвестные службы или драйверы, особенно с неразборчивыми именами или под видом системных.
- Диспетчер задач или системные мониторы не показывают подозрительный процесс, но нагрузка на CPU или диск держится на высоком уровне при простое.
- Антивирус или средства защиты не запускаются, не обновляются или отключаются без вашего вмешательства.
- Сетевой трафик есть, но вы не можете определить, какая программа его генерирует — соединения привязаны к системным процессам.
- Файлы или папки не удаляются, выдавая ошибку «доступ запрещён», даже если вы администратор.
Если вы наблюдаете несколько признаков одновременно — это серьёзный повод для детального анализа.
Метод 1: анализ загруженных модулей ядра
Любой вирус, работающий в пространстве ядра, зарегистрирован как модуль или драйвер. Ваша задача — найти то, что там быть не должно.
На Linux
Команда lsmod покажет список загруженных модулей. Для каждого из них проверьте:
- Название — оно должно соответствовать известному драйверу или модулю. Подозрительны модули с буквально сгенерированными именами вроде
drv_hid,sys_core_tempилиkernel_mod_2024. - Использующие процессы — если модуль никем не используется, но при этом загружен, это аномалия.
- Путь к файлу —
modinfo <имя_модуля>покажет путь к файлу.ko. Сверьте его с каталогом/lib/modules/$(uname -r)/. Модуль вне стандартного каталога — красный флаг.
Для глубокой проверки загрузите утилиту rkhunter или chkrootkit. Они проверяют известные сигнатуры руткитов и аномалии в системных бинарниках:
rkhunter --check --skip-keypress
На Windows
В Windows kernel-mode драйверы можно посмотреть через:
- Autoruns от Sysinternals — фильтруйте вкладку «Drivers» и ищите неподписанные или подозрительные записи.
- DriverQuery — встроенная утилита командной строки:
driverquery /v /fo csv. Анализируйте список на предмет неизвестных драйверов. - Sigcheck (тоже Sysinternals):
sigcheck -c -h -uпокажет драйверы без валидной цифровой подписи.
Особое внимание — на драйверы без подписи Microsoft или известного производителя. В современной системе их быть не должно, если вы не ставили что-то специфическое (например, драйверы виртуализации).
Метод 2: поведенческий анализ через системные вызовы
Memory-resident вирусы в ядре часто перехватывают системные вызовы — это называется hooking. Вы не увидите сам код, но можете заметить аномалии в работе системы.
Проверка на subgroup hooks (Windows)
Утилита GMER (хотя и старая, до сих пор работает) сканирует SSDT (System Service Dispatch Table), IDT (Interrupt Descriptor Table) и другие ключевые структуры ядра. Если адреса обработчиков системных вызовов не указывают на стандартные модули ntoskrnl.exe или win32k.sys — внедрение есть.
Альтернатива — современный System Informer (бывший Process Hacker): вкладка «Services» показывает драйверы, а раздел «Hooks» позволяет увидеть подмены.
Проверка на syscall hooks (Linux)
Прямой доступ к таблице системных вызовов можно получить через:
sudo cat /proc/kallsyms | grep sys_call_table
Сравните текущие адреса обработчиков с теми, что были при чистой загрузке. Если адрес syscall_open или syscall_write указывает не на модуль ядра, а на подозрительный адрес в памяти — у вас проблему с руткитом.
Более удобный вариант — использовать bpftrace:
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %d\n", comm, pid); }'
Вы увидите, какие процессы вызывают тот или иной syscall. Если системный вызов используется процессом, которого вы не запускали, — разберитесь, кто это.
Метод 3: проверка целостности ядра
Этот подход основан на сравнении текущего состояния системы с эталонным или проверке цифровых подписей критических компонентов.
Linux: IMA/EVM и AIDE
IMA (Integrity Measurement Architecture) — встроенный в ядро механизм проверки целостности файлов. Если он настроен, любое изменение системных бинарников или конфигураций будет зафиксировано.
Если IMA не настроен — используйте AIDE (Advanced Intrusion Detection Environment):
- Установите и инициализируйте базу данных на чистой системе:
aide --init. - После подозрительного инцидента запустите:
aide --check. - Результат покажет, какие файлы были изменены, добавлены или удалены.
Ключевой момент: база данных AIDE должна храниться вне исследуемой системы (на внешнем носителе или удалённом сервере), иначе вирус может её подменить.
Windows: проверка подписей и целостности
- System File Checker:
sfc /scannowпроверяет целостность системных файлов Windows. Если обнаружены изменения, и система не может восстановить оригиналы — это тревожный сигнал. - Windows Defender Offline: запускайте его через «Безопасность Windows» → «Защита от вирусов и угроз». Выберите «Проверка автономного Защитника Windows». Этот режим перезагрузит систему и проверит её до загрузки основной ОС — что важно, потому что memory-resident вирус в ядре может прятаться, пока система работает.
- Device Guard / VBS: если включены, они не дают загрузиться неподписанному коду в ядро. Проверить состояние:
msinfo32→ «Virtualization-based Security».
Метод 4: дамп памяти и офлайн-анализ
Если вирус глубоко в ядре, он может перехватывать запросы на чтение собственных структур — и вы ничего не увидите, анализируя работающую систему. Выход — снять дамп памяти и анализировать его отдельно.
Снятие дампa
- Linux: используйте
LiME(Linux Memory Extractor):sudo insmod lime.ko "path=/tmp/dump.lime format=lime". Дампируется вся физическая память в формате, пригодном для анализа в Volatility. - Windows: утилита
WinPmem(часть Rekall), или встроенный механизм через «Система» → «Дополнительные параметры системы» → «Загрузка и восстановление» → настройки дампа памяти. Для полного дампа выберите «Полный дамп памяти».
Анализ дампa
Для анализа используйте Volatility 3:
- Определите профиль системы:
python3 vol.py -f dump.raw windows.info. - Список процессов:
python3 vol.py -f dump.raw windows.pslist.PsList. Сверьте с тем, что видит система сейчас — некоторые процессы могут быть «скрыты», но присутствовать в дампе. - Загруженные модули:
python3 vol.py -f dump.raw windows.modules.Modules. Ищите модули, которых вам не знакомы. - Проверка на наличие руткитов:
python3 vol.py -f dump.raw windows.ldrmodules.LdrModules— покажет расхождения между видимыми и невидимыми модулями.
Преимущество офлайн-анализа в том, что вирус не может мешать исследованию — вы смотрите «мёртвый» снимок памяти.
Метод 5: мониторинг в реальном времени
Если вы подозрезаете kernel-level заражение, но хотите отследить его динамически — подходит мониторинг с использованием eBPF на Linux или ETW на Windows.
Linux: eBPF и bpftrace
eBPF позволяет безопасно отслеживать события ядра без модификации его кода. Примеры того, что можно отследить:
- Необычные execve-вызовы — запуск процессов из неожиданных мест (например, из /tmp или /dev/shm).
- Подозрительные обращения к сетевым сокетам — исходящие соединения от процессов, которые не должны работать с сетью.
- Изменения прав доступа через chmod или setuid.
Установите bpftrace и смотрите в реальном времени:
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_execve { printf("%s: %s\n", comm, str(args->filename)); }'
Windows: Event Tracing for Windows
Встроенный механизм ETW фиксирует системные события на уровне ядра. Для записи трассировок используйте logman или инструменты вроде Windows Performance Recorder. Анализировать результаты удобно в Windows Performance Analyzer или TraceView.
В ETW обращайте внимание на:
- Image Load — загрузка неподписанных DLL или SYS-файлов в системных процессах.
- Network — подозрительные соединения от ntoskrnl.exe или других ядерных модулей.
- Process Start — новые процессы, которые запускаются из неожиданных путей или с необычными родительскими процессами.
Метод 6: сравнение с чистой системой
Один из самых действенных способов — не искать вирус, а найти отличия между заражённой и заведомо чистой системой.
- Сделайте список загруженных модулей ядра на чистой машине с аналогичной конфигурацией (
lsmodилиdriverquery). - Сравните списки на заражённой машине.
- Также сравните содержимое файлов
/proc/modules(Linux) или ключей реестраHKLM\SYSTEM\CurrentControlSet\Services(Windows).
Любое расхождение — повод для детального изучения нового модуля. Найдите его файл на диске и проверьте:
- Есть ли у него цифровая подпись.
- Кто разработчик (для Windows — смотрите свойства файла → «Цифровые подписи»).
- Что он делает — загуглите имя файла, название компании, путь расположения.
- Совпадает ли хеш-сумма с официальными версиями от производителя.
Сравнение подходов: когда какой метод применять
| Метод | Чувствительность | Требует чистой системы | Сложность | Когда использовать |
|---|---|---|---|---|
| Анализ модулей ядра | Средняя | Нет | Низкая | Первичная диагностика |
| Поведенческий анализ через системные вызовы | Высокая для руткитов с хуками | Нет | Средняя | Если есть подозрение на перехват syscall |
| Проверка целостности ядра | Средняя-высокая | Для AIDE — да | Средняя | Периодический аудит |
| Дамп памяти и офлайн-анализ | Очень высокая | Нет | Высокая | При подозрении на сложный руткит |
| Мониторинг в реальном времени | Высокая | Нет | Средняя-высокая | Для отслеживания активности вируса |
| Сравнение с чистой системой | Средняя (зависит от полноты сравнения) | Да | Низкая | Когда есть эталонная система |
Частые ошибки при обнаружении
- Полагаться только на антивирус. Большинство бытовых антивирусов не видят kernel-mode руткитов. Это не значит, что антивирус бесполезен — но его «чисто» не является доказательством отсутствия заражения.
- Сканировать работающую систему и доверять результату. Глубоко сидящий в ядре код может перехватывать запросы антивируса и показывать «чистоту». Используйте офлайн-проверки.
- Игнорировать неподписанные драйверы. Если вы не устанавливали софт без подписи (а в большинстве случаев не должны были) — любой неподписанный драйвер подозрителен.
- Не обновлять базы для проверки целостности. AIDE, rkhunter и подобные инструменты должны быть настроены на подключённой к интернету системе или иметь актуальные базы вне её.
- Удалять файл, не разобравшись. Kernel-модуль может быть критически важен для работы оборудования или сервисов. Убедитесь, что файл действительно вредоносный, перед удалением.
Что делать в зависимости от вашей ситуации
Если вы сисадмин и подозрезаете заражение сервера: снимите дамп памяти (LiME + Volatility на Linux, WinPmem на Windows), запустите rkhunter/chkrootkit, проверьте все загруженные модули. Перед началnм машину лучше отключить от сети, чтобы остановить возможный трафик управления.
Если это домашний компьютер: воспользуйтесь автономной проверкой Windows Defender Offline или загрузочным антивирусом (Kaspersky Rescue Disk, ESET SysRescue). Они работают вне основной ОС и могут обнаружить kernel-руткиты.
Если нужно быстро оценить масштаб: запустите Autoruns или lsmod, сверьте с результатами на чистой машине или поищите незнакомые модули в интернете. Если найдены подозрительные элементы — переходите к глубокому анализу с дампом памяти.
Если система сильно повреждена и не загружается: загрузитесь с внешнего носителя (Live USB) и проанализируйте файловую систему. Проверьте каталоги автозагрузки, наличие подозрительных .ko или .sys файлов, целостность системных библиотек.
Практические рекомендации
- Всегда используйте несколько методов. Один способ может не обнаружить вирус, а комбинация — с высокой вероятностью выявит даже сложный руткит.
- Делайте эталонные снимки. После установки системы зафиксируйте список модулей ядра, загружаемых драйверов и служб. Это сэкономит время при будущем расследовании.
- Включите защиту загрузчика. Secure Boot на UEFI не даст загрузиться неподписанному ядру или модулям. GRUB password на Linux — аналогично. Это не панацея (существуют bootkits), но значительно повышает порог входа для атакующего.
- Ограничьте загрузку модулей. На Linux можно запретить загрузку модулей после загрузки системы:
sysctl kernel.modules_disabled=1(необратимо до перезагрузки). На Windows — включить Driver Signature Enforcement. - Анализируйте в изолированной среде. Если нашли подозрительный файл или модуль — не исследуйте его на заражённой машине. Перенесите в виртуальный стенд и анализируйте там.
Итог
Memory-resident вирусы в ядре ОС — редкие, но крайне опасные. Они требуют комбинированного подхода: анализ модулей ядра, проверка поведения системы, при необходимости — дамп памяти и офлайн-анализ. Не надейтесь на один антивирус. Используйте автономные инструменты, сверяйте с эталонами и не игнорируйте косвенные признаки. Если не уверены в своих силах — привлеките специалиста по информационной безопасности, а не пытайтесь лечить систему «на удачу» — с ядерным руткитом это не работает.
