Эта страница является переводом. Авторитетным считается текст английской версии. Читать на английском

malware · cryptomining · rootkit · linux · kernel · monero · privilege-escalation · cve-2026-31431 · container-escape

Rootpacket: набор для Linux-криптоджекинга, прячущийся в ядре

Kinryū Labs проанализировала Rootpacket, набор для Linux-криптоджекинга, который несёт руткит уровня ядра, чтобы подделывать загрузку CPU и памяти, повышается до root через CVE-2026-31431 (изъян страничного кэша AF_ALG, который к тому же сбегает из контейнера на хост), маскируется под драйвер Intel и отключает те же открытые сервисы, через которые входят майнеры-конкуренты.

Автор Davis Zheng·

CVE
CVE-2026-31431
CVSS
7.8 (CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)

TLP:CLEAR. Согласовано к публикации. Это только статический анализ: ни один образец не запускался, и каждый вывод получен из извлечения строк, дизассемблирования и разбора исходного кода. Кошелёк Monero, пул и инфраструктура атакующего публикуются как защитные индикаторы.

Краткое резюме

  • ~45%CPU показывает top, пока тот работает у 100%
  • 3механизма закрепления
  • 7.8CVSS, CVE-2026-31431 (AF_ALG page-cache LPE)
  • хостroot из непривилегированного контейнера

Rootpacket представляет собой набор для криптоджекинга под Linux из нескольких компонентов. Он связывает воедино руткит уровня ядра для скрытности, эксплойт повышения привилегий для CVE-2026-31431 в криптоинтерфейсе Linux AF_ALG, UPX-упакованный майнер Monero XMRig 6.26.0, переименованный в xrandom, и скрипт устранения конкурентов. Код написан в основном по-турецки (имена переменных, комментарии, строки состояния), что указывает на оператора, говорящего по-турецки.

Набор работает в одном из двух режимов. В режиме root он загружает руткит, загружаемый модуль ядра (LKM), замаскированный под intel_uncore_freq_aux, устанавливает его через DKMS, чтобы тот пережил обновления ядра, регистрирует systemd-сервис и очищает машину от соперников. Когда получить root не удаётся, он откатывается к пользовательскому режиму, который закрепляется через crontab и запускает майнер как демон. Майнер соединяется с pool.supportxmr.com:443 по stratum+ssl и майнит Monero алгоритмом RandomX.

Компонент, на котором стоит задержаться: руткит. Пока майнер держит процессор у 100 процентов, руткит переписывает /proc/stat так, что top и htop сообщают спокойные 40–50 процентов, и колеблет эту цифру через jiffies, чтобы нагрузка выглядела настоящей, а не застрявшей на постоянном значении. То же он делает с /proc/meminfo и фильтрует листинги каталогов, скрывая собственные процессы и файлы.

Ключевые выводы
  • Цель: криптоджекинг (высокая уверенность). Набор несёт XMRig 6.26.0, жёстко заданный кошелёк Monero и конфигурацию майнинга на pool.supportxmr.com, причём донат разработчику XMRig выключен, так что вся выручка идёт оператору.
  • Повышение привилегий опирается на CVE-2026-31431 («Copy Fail»), детерминированную запись в страничный кэш на пути Linux AF_ALG algif_aead (CVSS 7.8, раскрыта в апреле 2026). Поскольку страничный кэш общий для всего хоста, та же запись сбегает из контейнера, чтобы захватить root на хосте, так что заражённый контейнер означает скомпрометированный хост (высокая уверенность).
  • Оператор заметно выше типичной команды «сбросил-и-майню» (высокая уверенность). Кастомный LKM-руткит с ftrace-хуками, закрепление через DKMS, которое само пересобирается под новые ядра, рабочий эксплойт страничного кэша для CVE-2026-31431 и многослойное закрепление systemd/DKMS/cron показывают уровень инженерии, до которого большинство криптоджекеров никогда не доходит.
  • Оператор, вероятно, говорит по-турецки (средняя уверенность). Турецкие имена переменных, комментарии и сообщения о состоянии вроде ROOT ele gecirildi! проходят через весь набор.
  • Rootpacket создан, чтобы владеть хостом единолично и удерживать его. Его killservice.sh убирает майнеры-конкуренты, а затем отключает выставленные наружу сервисы, которые криптоджекеры используют для первичного доступа, включая Docker API на 2375/2376, тот же вектор, что мы задокументировали в разборе RedTail. Эти команды дерутся за одни и те же неверно настроенные машины.

Архитектура набора

Rootpacket устроен как модульный дроппер. Его части:

setup.sh         Entry point. Checks privilege level, picks a deployment mode.
getroot          Privilege escalation. Exploits CVE-2026-31431 (AF_ALG) for local root.
xrandom          UPX-packed XMRig 6.26.0, renamed to dodge name-based detection.
kernel/
  stealth.c      LKM rootkit, compiled via DKMS, disguised as an Intel driver.
  install.sh     DKMS persistence engine.
killservice.sh   Competitor elimination and "hardening".
rootpacket.tar.gz  An inner copy of the whole toolkit, packaged for redistribution.

Режим root. setup.sh запускает getroot, если ещё не root, копирует xrandom в /opt/kernel-kd/, создаёт systemd-сервис, запускает kernel/install.sh, чтобы скомпилировать и загрузить руткит через DKMS, запускает killservice.sh, чтобы убрать конкуренцию, и стартует майнер как постоянный сервис.

Откат в пользовательский режим. Когда root недосягаем, setup.sh копирует xrandom в ~/.xrandom/, пишет лаунчер с PID-блокировкой, ставит запись crontab, срабатывающую при перезагрузке и каждую минуту, и запускает майнер через setsid, чтобы тот пережил родительскую оболочку.

СвойствоРежим rootПользовательский режим
Расположение майнера/opt/kernel-kd/xrandom~/.xrandom/xrandom
Закреплениеsystemd (kernel-kd.service)crontab (@reboot + */1 * * * *)
РуткитДа (LKM через DKMS)Нет
Убийство конкурентовДа (killservice.sh)Нет
Работает какroot (systemd)текущий пользователь (демон setsid)

getroot: CVE-2026-31431, root через порчу страничного кэша

getroot представляет собой статически слинкованный, не-stripped бинарник ELF64 x86-64, собранный из getroot.c. Он эксплуатирует CVE-2026-31431 («Copy Fail»), логический изъян в интерфейсе ядра Linux AF_ALG algif_aead, раскрытый 29 апреля 2026 года (CVSS 7.8). Баг даёт детерминированную, управляемую атакующим 4-байтовую запись в страничный кэш ядра, и getroot использует её, чтобы пропатчить SUID-бинарник в памяти и выйти наружу как root.

СвойствоЗначение
ТипELF 64-bit LSB executable, x86-64, статически слинкован, не stripped
CVECVE-2026-31431 «Copy Fail» (CVSS 7.8, AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
ПодсистемаAF_ALG algif_aead, AEAD-шаблон authencesn(hmac(sha256),cbc(aes))
ЗатронутоLinux с 4.14 по 6.19.11 (изъян появился в 2017, коммит 72548b093ee3); исправлено в 6.18.22, 6.19.12, 7.0+
Цель/usr/bin/su, его .text в памяти патчится в страничном кэше
НадёжностьДетерминированно, без состояния гонки
Использование / откат./getroot <cmd> [args...]; если эксплойт не сработал, всё равно выполняет команду с текущими привилегиями

Механизм. Внутренняя оптимизация AEAD-кода 2017 года оставила прошедшие через splice страницы страничного кэша лежать одновременно и в исходном, и в целевом scatterlist. Когда шаблон authencesn пишет своё 4-байтовое временное значение ESN по выбранному атакующим смещению assoclen + cryptlen, эта запись приземляется внутри страницы страничного кэша файла, читаемого пользователем. Затем проверка HMAC проваливается и recvmsg() возвращает EBADMSG, но ядро никогда не откатывает запись. getroot разбирает ELF-заголовки /usr/bin/su, чтобы вычислить файловое смещение его точки входа, затем зацикливает splice → sendmsg (неся в AAD 4 байта для записи) → recvmsg, по разу на каждый 4-байтовый кусок шелл-кода, патча /usr/bin/su в страничном кэше. Затем он делает execve для /usr/bin/su: ядро загружает теперь уже испорченную страницу, шелл-код выполняется как SUID-root, и getroot подтверждает getuid() == 0, прежде чем выполнить команду оператора (печатая турецкое [+] ROOT ele gecirildi!). Файл на диске не трогается, так что мониторинг целостности файлов ничего не видит.

Побег из контейнера на хост. Страничный кэш Linux глобален для хоста; у контейнеров своего нет. Процесс внутри непривилегированного контейнера, сплайснувший хостовый /usr/bin/su, портит хостовую кэшированную копию, так что execve даёт root на хосте, а не только в контейнере. Поэтому заражённый контейнер равносилен скомпрометированному хосту, и setup.sh дальше загружает руткит ядра в хост. Остановить и удалить контейнер недостаточно; хост придётся пересобрать.

Мы запустили getroot один раз в изолированной ВМ (Kali, ядро 6.6.15). Он выполнил полную последовательность AF_ALG, но не получил root на этой сборке и откатился к выполнению команды без привилегий, что соответствует эксплойту, нацеленному на конкретные раскладки ядра. Майнер мы не запускали.

xrandom: майнер

xrandom представляет собой переименованную, UPX-упакованную копию XMRig 6.26.0, опенсорсного майнера Monero.

СвойствоЗначение
Реальная личностьXMRig 6.26.0
УпаковкаUPX 4.2.4 (2.8 МБ упакован, 10.1 МБ распакован)
АлгоритмRandomX (rx/0)
Пулpool.supportxmr.com:443 по stratum+ssl
Кошелёк46NVDFL6v5STw5Qw4j77PoBSHRTYnHZGZ8WRoGvHmpaMX7ZyhNUP2u24TLV9pNgncz1bZF2Vm8KkaNTzU7SXqrnFUx5zgHQ
Уровень доната0 (донат разработчику XMRig отключён)

Майнинг по порту 443 с TLS позволяет трафику с первого взгляда сливаться с обычным HTTPS, хотя у stratum-рукопожатия иной TLS-отпечаток для всякого, кто присматривается.

stealth.c: руткит ядра

Это наиболее проработанная часть набора. Это LKM-руткит, который использует перехват функций через ftrace, чтобы вклиниваться в функции ядра и стирать след малвари, и который повсюду маскируется под аппаратный драйвер Intel.

СвойствоЗначение
Имя модуляintel_uncore_freq_aux
Поддельные метаданныеMODULE_AUTHOR("Intel Corporation"), MODULE_DESCRIPTION("Intel Uncore Frequency Control Driver"), MODULE_VERSION("1.2.0")
Перехватftrace через kallsyms_lookup_name (на ядрах 5.7 и новее разрешается через kprobe)
Управлениеsysfs по /sys/kernel/intel_uncore_freq/ (enabled, cpu_lo, cpu_hi, mem_lo, mem_hi, hide_tag)

Что он перехватывает и зачем:

  • Маскировка CPU. Он перехватывает show_stat, чтобы переписывать /proc/stat, подделывая загрузку между настраиваемыми границами (по умолчанию 40–50 процентов) и колебля её через jiffies, чтобы число двигалось как настоящая нагрузка, а не стояло ровно.
  • Маскировка памяти. Он перехватывает meminfo_proc_show, чтобы переписывать /proc/meminfo, подделывая MemFree, MemAvailable, Buffers, Cached, Active и Inactive.
  • Скрытие процессов. Он перехватывает iterate_dir, чтобы фильтровать листинги /proc, скрывая PID, чьи имена совпадают с жёстко заданным набором: stealth, masscan, sshruns, ransomx, cpumask, xrandom, cpm_, kcpm, mask_helper, ftrhook, kintel_aux. Оператор может добавить новые имена во время выполнения через /sys/kernel/intel_uncore_freq/hide_tag.
  • Скрытие файлов. Он скрывает пути, совпадающие с stealth, cpumask, kintel_aux, intel_uncore_freq_aux, и сам каталог sysfs.
  • Самоскрытие. При загрузке он убирает себя из /proc/modules и /sys/module/ через list_del_init, удаляет свой kobject в sysfs и увеличивает собственный счётчик ссылок через try_module_get, чтобы rmmod не смог его выгрузить.

Этот список скрываемого тоже служит уликой: рядом с майнером он прячет masscan, sshruns и ransomx, так что оператор, вероятно, гоняет сканер, и в наборе может быть не только майнер.

Практический эффект таков: администратор, смотрящий в top, видит занятую, но нормальную машину, не находит постороннего процесса и не видит модуль ядра, который и занимается ложью. Улики здесь физические и внеполосные: машина греется, раскручиваются вентиляторы, растёт энергопотребление, и ничего из этого руткит подделать не может.

Закрепление: три механизма, разделённые по режимам

Закрепление Rootpacket зависит от режима, в котором он приземлился. В режиме root он наслаивает два взаимоусиливающих механизма; в пользовательском режиме откатывается к третьему.

#МеханизмРежимДеталь
1systemd-сервисrootkernel-kd.service, Type=simple, Restart=always, RestartSec=3
2DKMS-модульrootСтавит руткит под /lib/modules/$(uname -r)/extra/; переживает обновления ядра
3crontabuser@reboot плюс каждую минуту (* * * * *), с PID-блокировкой и setsid

Запись DKMS самая упрямая: она ставит руткит через собственную систему сборки модулей ядра, так что рутинное обновление ядра пересобирает и перевооружает его, а не удаляет.

killservice.sh: зачистка и запирание машины

Скрипт в своём баннере зовёт себя «cryptojacker hardening» («закаливание криптоджекера»), и с точки зрения оператора это описание точно. Он работает в три фазы.

Фаза 1: погасить открытые сервисы. Он нацеливается на сервисы, слушающие на 0.0.0.0, которые являются типичными точками входа криптоджекинга, останавливая, отключая и маскируя каждый, ставя chmod 000 на бинарники и добавляя правила iptables DROP:

СервисПорт
Redis6379
Docker2375/2376
PostgreSQL5432
MongoDB27017
Elasticsearch9200/9300
Memcached11211
Hadoop YARN8088
Jenkins8080
Confluence8090

Строка Docker служит связующей тканью с нашим отчётом по RedTail: Rootpacket закрывает ровно ту дверь 2375/2376, через которую входит RedTail. Оператор, приземлившийся первым, майнит на хосте, а затем запирает следующую команду снаружи, закаляя машину против техник, которые они бы использовали.

Фаза 2: убрать майнеры-конкуренты. Он убивает процессы, удаляет файлы, чистит cron-задания и вычищает SSH-ключи, привязанные к известным семействам криптоджекинга, включая XMRig, Kinsing (kdevtmpfsi), TeamTNT (tntrecht, mdrfckr), sustes, watchdogs и minerd, а также сканеры вроде masscan, pnscan и zgrab.

Фаза 3: убрать пользовательские руткиты. Он срезает известные вредоносные записи LD_PRELOAD (libprocesshider.so, libjdk.so, libpamx.so, поддельный libselinux.so.3 и xhide) из /etc/ld.so.preload и удаляет библиотеки, вычищая пользовательские руткиты конкурентов, которые могли бы мешать его собственному.

Атрибуция

Турецкие имена переменных, комментарии и строки состояния набора (например ROOT ele gecirildi!, «root получен») указывают на оператора, говорящего по-турецки, со средней уверенностью. Мы нашли URL распространения или стейджинга по адресу linuxutil5.pages[.]dev, размещённый на Cloudflare Pages, что укладывается в шаблон стейджинга полезных нагрузок на бесплатной, авторитетной инфраструктуре для слияния с фоном. Внутренний rootpacket.tar.gz, самодостаточная копия всего набора, даёт оператору готовый пакет, чтобы отправить его на следующий хост.

Индикаторы компрометации

Сеть

ИндикаторКонтекст
pool.supportxmr.com / pool.supportxmr.com:443Основной майнинг-пул Monero, stratum+ssl
linuxutil5.pages[.]devРаспространение / стейджинг (Cloudflare Pages)
api.xmrig.com, randomx.xmrig.com:443Эндпоинты API и бенчмарка XMRig
donate.v2.xmrig.com, donate.ssl.xmrig.comПулы доната разработчику XMRig (присутствуют, донат отключён)
stratum+ssl:// на порт 443Исходящий TLS-трафик майнинга

Кошелёк Monero: 46NVDFL6v5STw5Qw4j77PoBSHRTYnHZGZ8WRoGvHmpaMX7ZyhNUP2u24TLV9pNgncz1bZF2Vm8KkaNTzU7SXqrnFUx5zgHQ

Файлы (SHA-256)

ФайлSHA-256MD5
rootpacket.tar.gz (внешний)e2d0dab6b29df89d123fe8581047a03ac9b89ae8fa0d1f334b5aefbb93152857
getrootdda96d8a4bcc39dc7679347a4386bf1024152d2ccc46d333725ad0cda855d952
xrandom (упакован)ec3ef3dce99fa6cbc480f0f0b0c292676afed68704c44396271c7dc6afea2937

Build ID: getroot 148d8d902efd93ed892a541972fbcea3a99d05a3, xrandom d7a91225bdd2e3ab67cabded9d7809bcc724401f.

Артефакты на хосте

ПутьКонтекст
/opt/kernel-kd/xrandomБинарник майнера (режим root)
~/.xrandom/xrandom, ~/.xrandom/run.shМайнер и лаунчер (пользовательский режим)
/tmp/.xrandom.lockPID-блокировка (пользовательский режим)
/etc/systemd/system/kernel-kd.serviceВредоносный systemd-юнит
/usr/src/intel_uncore_freq_aux-1.2.0/Исходники DKMS для руткита
/sys/kernel/intel_uncore_freq/Интерфейс управления руткитом в sysfs
/lib/modules/*/extra/intel_uncore_freq_aux.koСкомпилированный модуль руткита

Поведенческие

  • Процесс с именем xrandom, работающий как root или как текущий пользователь.
  • Цифры CPU в /proc/stat, расходящиеся с аппаратными счётчиками производительности (perf stat) или со скоростью вентиляторов и энергопотреблением.
  • systemd-сервис kernel-kd (включён, Type=simple, Restart=always).
  • Запись cron с тегом # xrandom-userland-autostart.
  • Модуль ядра intel_uncore_freq_aux, загружающийся при старте, но отсутствующий в lsmod.

Обнаружение

Если руткит не загружен

systemctl status kernel-kd.service
ls -la /opt/kernel-kd/ ~/.xrandom/
dkms status | grep intel_uncore_freq
crontab -l | grep xrandom
lsmod | grep intel_uncore

Если руткит загружен

Пользовательские представления скомпрометированы, так что обнаружение должно идти снизу или сбоку от руткита:

  • Сравните CPU из /proc/stat с аппаратными счётчиками через perf stat. Большой разрыв сам по себе улика.
  • Следите за ftrace-хуками на show_stat, meminfo_proc_show и iterate_dir.
  • Считайте расхождение между сообщаемым CPU и реальной мощностью, теплом или скоростью вентиляторов сильным сигналом.

Поймать повышение привилегий

  • Сокет AF_ALG, SOCK_SEQPACKET, открытый процессом, который не является известным криптоинструментом (cryptsetup, openssl, gpg, systemd-cryptsetup), служит главной уликой. Полный порядок таков: socket(AF_ALG) → bind → setsockopt(SOL_ALG) → accept → pipe → splice → sendmsg → splice → recvmsg (повторно), затем execve(/usr/bin/su).
  • Сравните дисковые байты каждого SUID-бинарника с его представлением в страничном кэше. sha256sum читает через кэш и показывает испорченную копию, так что читайте диск напрямую через dd if=<file> iflag=direct и хешируйте это, затем сравните. Несовпадение на SUID-бинарнике означает порчу страничного кэша.

Кандидатное YARA

rule Rootpacket_Cryptojacker
{
    meta:
        description = "Rootpacket Linux cryptojacking toolkit"
        reference   = "Kinryu Labs CTI 2026-06-16"
    strings:
        $wallet = "46NVDFL6v5STw5Qw4j77PoBSHRTYnHZGZ8WRoGvHmpaMX7ZyhNUP2u24TLV9pNgncz1bZF2Vm8KkaNTzU7SXqrnFUx5zgHQ" ascii
        $svc    = "kernel-kd" ascii
        $cron   = "xrandom-userland-autostart" ascii
        $mod    = "intel_uncore_freq_aux" ascii
    condition:
        $wallet or 2 of ($svc, $cron, $mod)
}

Устранение

  1. Уберите руткит из заведомо чистого состояния. Загрузитесь с live- или recovery-носителя. Удалите /lib/modules/*/extra/intel_uncore_freq_aux.ko* и выполните dkms remove intel_uncore_freq_aux/1.2.0 --all, затем удалите /usr/src/intel_uncore_freq_aux-1.2.0/ и пересоберите initramfs (update-initramfs -u, dracut -f или mkinitcpio -P). Запись DKMS должна уйти, иначе она пересоберётся.
  2. Уберите сервис: systemctl stop kernel-kd; systemctl disable kernel-kd; rm /etc/systemd/system/kernel-kd.service; systemctl daemon-reload.
  3. Уберите майнер: rm -rf /opt/kernel-kd/ ~/.xrandom/ /tmp/.xrandom.lock, затем pkill -9 -f xrandom.
  4. Почистите cron от строк # xrandom-userland-autostart.
  5. Восстановите то, что сломал killservice.sh. Он ставит chmod 000 на Redis, Docker, PostgreSQL, MongoDB и другие бинарники и добавляет правила iptables DROP. Переустановите затронутые пакеты и пересмотрите файрвол.
  6. Ищите вширь. Внутренний rootpacket.tar.gz создан для перераспространения, так что проверьте другие хосты на те же индикаторы и просмотрите журналы на эксплуатацию сервисов из killservice.sh, чтобы найти точку входа.
  7. Закройте CVE-2026-31431. Обновитесь до исправленного ядра (6.18.22, 6.19.12, 7.0+ или бэкпорт вашего дистрибутива). Где нельзя пропатчить сразу, отключите уязвимый интерфейс: echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf, затем rmmod algif_aead. Для контейнеров заблокируйте AF_ALG (family 38) в профиле seccomp.
  8. Исходите из компрометации хоста из контейнера. Поскольку запись в страничный кэш пересекает границу контейнера, считайте любой хост, на котором запускался setup.sh (даже изнутри контейнера), полностью скомпрометированным. Пересоберите хост, а не просто удалите контейнер.

Сопоставление с MITRE ATT&CK

ТактикаТехника
Initial AccessT1190 Exploit Public-Facing Application (Redis, Docker, MongoDB, Elasticsearch, Jenkins, Hadoop YARN, подразумевается)
ExecutionT1059.004 Unix Shell
Privilege EscalationT1068 Exploitation for Privilege Escalation (CVE-2026-31431, AF_ALG algif_aead); T1611 Escape to Host (общий страничный кэш)
PersistenceT1543.002 Systemd Service; T1053.003 Cron; T1547.006 Kernel Modules (DKMS)
Defense EvasionT1014 Rootkit; T1036.005 Masquerading: Match Legitimate Name; T1027.002 Software Packing (UPX); T1070.004 File Deletion; T1564.001 Hidden Files
DiscoveryT1057 Process Discovery (охота на соперников)
Lateral MovementT1570 Lateral Tool Transfer (внутренний пакет перераспространения)
ImpactT1496 Resource Hijacking (майнинг Monero)

Методология и заметки аналитика

  • Анализ был преимущественно статическим (извлечение строк, дизассемблирование, разбор исходного кода, структурный анализ) на Kali Linux x86-64. Мы также запустили getroot один раз в изолированной ВМ (ядро 6.6.15), чтобы посмотреть на его поведение: он попытался выполнить последовательность AF_ALG, не получил root на этой сборке и откатился к выполнению команды без привилегий. Майнер не запускался, и ничего не выгружалось.
  • Компонент повышения привилегий: CVE-2026-31431, опознанный по шаблону authencesn(hmac(sha256),cbc(aes)), привязанному к сокету AF_ALG, по цели в страничном кэше /usr/bin/su и по циклу записи splice/sendmsg/recvmsg в бинарнике.
  • Образцы (набор и его компоненты) доступны другим исследователям и защитникам по запросу. Напишите на contact@kinryu.sh с короткой запиской о том, кто вы и зачем они вам.
Sample
rootpacket · e2d0dab6b29df89d…
How to cite
Kinryū Labs (2026). Rootpacket: набор для Linux-криптоджекинга, прячущийся в ядре. https://kinryu.sh/ru/reports/rootpacket-linux-cryptojacking-rootkit/