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

Rootpacket:カーネルに潜む Linux クリプトジャッキング・ツールキット

Kinryū Labs は Rootpacket を分析した。これは Linux 向けのクリプトジャッキング・ツールキットで、CPU とメモリの使用率を偽るカーネル・ルートキットを携え、CVE-2026-31431(コンテナからホストへも逃げ出す AF_ALG ページキャッシュの欠陥)で root へ昇格し、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。一般公開を承認済み。これは純粋に静的な分析である。検体は一切実行しておらず、すべての結論は文字列抽出、逆アセンブル、ソース精査から得たものだ。攻撃者のモネロ・ウォレット、プール、インフラは防御指標として公開する。

エグゼクティブサマリー

  • ~45%実際は 100% 近くで動くなか top が表示する CPU
  • 3つの永続化の仕組み
  • 7.8CVSS、CVE-2026-31431(AF_ALG ページキャッシュ LPE)
  • ホスト無特権コンテナから奪う root

Rootpacket は Linux 向けの複数コンポーネントから成るクリプトジャッキング・ツールキットだ。隠密のためのカーネルレベルのルートキット、Linux AF_ALG 暗号インターフェースの CVE-2026-31431 を突く権限昇格エクスプロイト、xrandom に改名された UPX パックの XMRig 6.26.0 モネロ・マイナー、そして競合排除スクリプトを同梱する。コードはほぼトルコ語で書かれており(変数名、コメント、ステータス文字列)、トルコ語話者の操作者を示唆する。

ツールキットは二つのモードのいずれかで動く。root モードでは、intel_uncore_freq_aux に偽装した可搬カーネルモジュール(LKM)ルートキットを読み込み、カーネルのアップグレードを生き延びるよう DKMS 経由でインストールし、systemd サービスを登録し、マシンから対手を一掃する。root を取れないときは、crontab で永続化しマイナーをデーモンとして走らせるユーザーランドモードにフォールバックする。マイナーは stratum+sslpool.supportxmr.com:443 に接続し、RandomX でモネロを掘る。

掘り下げる価値のあるコンポーネントはルートキットだ。マイナーがプロセッサを 100 パーセント近くに張り付けるなか、ルートキットは /proc/stat を書き換え、tophtop が穏やかな 40〜50 パーセントを報告するようにし、jiffies を使ってその数値を上下させ、負荷が一定値に張り付くのではなく本物らしく動くように見せる。/proc/meminfo にも同じことをし、ディレクトリ一覧を絞り込んで自分のプロセスとファイルを隠す。

主要な判断

  • 目的はクリプトジャッキング(高い確度)。ツールキットは XMRig 6.26.0、ハードコードされたモネロ・ウォレット、そして pool.supportxmr.com のマイニング設定を同梱し、XMRig の開発者寄付を切って全収益が操作者に渡るようにしている。
  • 権限昇格は CVE-2026-31431(“Copy Fail”)、Linux AF_ALG algif_aead 経路における確定的なページキャッシュ書き込みだ(CVSS 7.8、2026 年 4 月公表)。ページキャッシュは全ホストで共有されるため、同じ書き込みがコンテナから逃げ出してホストの root を奪う。したがって感染したコンテナは侵害されたホストに等しい(高い確度)。
  • 操作者は典型的な「投下して掘るだけ」の集団より格段に上だ(高い確度)。ftrace フックを備えた独自の LKM ルートキット、新しいカーネル向けに自動で再ビルドする DKMS 永続化、動作する CVE-2026-31431 ページキャッシュ・エクスプロイト、そして systemd/DKMS/cron の多層永続化は、大半のクリプトジャッカーが決して到達しない工学水準だ。
  • 操作者はトルコ語話者の可能性が高い(中程度の確度)。トルコ語の変数名、コメント、そして ROOT ele gecirildi!(「root を奪取した」の意)のようなステータスメッセージがツールキット全体を貫いている。
  • Rootpacket は、ホストを独占し保持するために作られている。その killservice.sh は競合マイナーを排除したうえで、クリプトジャッカーが初期アクセスに使う外部露出サービス——2375/2376 上の Docker API を含む——を無効化する。我々が RedTail の記事 で記録したのと同じ経路だ。これらの集団は同じ設定ミスのマシンを奪い合っている。

ツールキットの構成

Rootpacket はモジュール式の投下器だ。各部品。

setup.sh         入口点。権限レベルを確認し、配備モードを選ぶ。
getroot          権限昇格。CVE-2026-31431(AF_ALG)を突いてローカル root を得る。
xrandom          UPX パックの XMRig 6.26.0。名前ベースの検知を躱すため改名。
kernel/
  stealth.c      LKM ルートキット。DKMS でコンパイルし、Intel ドライバに偽装。
  install.sh     DKMS 永続化エンジン。
killservice.sh   競合排除と「堅牢化」。
rootpacket.tar.gz  ツールキット全体の内層コピー。再配布用にパッケージ化。

root モード。 setup.sh は、まだ root でなければ getroot を実行し、xrandom/opt/kernel-kd/ にコピーし、systemd サービスを作成し、kernel/install.sh を実行して DKMS 経由でルートキットをコンパイル・ロードし、killservice.sh を実行して競合を一掃し、マイナーを永続的なサービスとして起動する。

ユーザーランドフォールバック。 root が手の届かないところにあるとき、setup.shxrandom~/.xrandom/ にコピーし、PID ロック付きのランチャーを書き込み、再起動時および毎分に発火する crontab エントリをインストールし、親 shell が終了しても生き延びるよう setsid でマイナーを起動する。

機能root モードユーザーランドモード
マイナーの場所/opt/kernel-kd/xrandom~/.xrandom/xrandom
永続化systemd(kernel-kd.servicecrontab(@reboot + */1 * * * *
ルートキットあり(DKMS 経由の LKM)なし
競合の killあり(killservice.shなし
実行主体root(systemd)現在のユーザー(setsid デーモン)

getroot:CVE-2026-31431、ページキャッシュ破壊による root 奪取

getrootgetroot.c からビルドされた、静的リンクで未 strip の ELF64 x86-64 バイナリだ。CVE-2026-31431(“Copy Fail”)を突く。これは 2026 年 4 月 29 日に公表された、Linux カーネルの AF_ALG algif_aead インターフェースの論理欠陥である(CVSS 7.8)。このバグは、攻撃者が制御する確定的な 4 バイト書き込みをカーネルのページキャッシュへ与え、getroot はそれを使って SUID バイナリをメモリ上でパッチし、root として歩き出す。

属性
種類ELF 64-bit LSB executable、x86-64、静的リンク、未 strip
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...];エクスプロイトが命中しなければ、現在の権限のままコマンドを実行する

仕組み。 2017 年の AEAD コードのその場最適化により、splice されたページキャッシュのページが、ソース側と宛先側の両方の scatterlist に残ってしまった。authencesn テンプレートが、攻撃者の選んだオフセット assoclen + cryptlen に 4 バイトの ESN 一時値を書き込むと、その書き込みはユーザーが読めるファイルのページキャッシュページの内側に着地する。すると HMAC チェックが失敗し recvmsg()EBADMSG を返すが、カーネルはその書き込みを決してロールバックしない。getroot/usr/bin/su の ELF ヘッダーを解析してエントリポイントのファイルオフセットを計算し、splicesendmsg(書き込む 4 バイトを AAD に載せる)→ recvmsg を、シェルコードの 4 バイトごとに 1 回ループし、ページキャッシュ内で /usr/bin/su をパッチする。続いて /usr/bin/suexecve する。カーネルが破壊済みのページを読み込み、シェルコードが SUID-root で走り、getroot は操作者のコマンドを実行する前に getuid() == 0 を確認する(そしてトルコ語の [+] ROOT ele gecirildi! を出力する)。ディスク上のファイルは一切触れられないため、ファイル完全性監視には何も見えない。

ホストへのコンテナ脱出。 Linux のページキャッシュは全ホスト共有であり、コンテナは自分専用のものを持たない。無特権コンテナ内のプロセスがホストの /usr/bin/su を splice すると、破壊するのはホストのキャッシュ済みコピーであり、execve はコンテナ内だけでなくホスト上で root をもたらす。したがって感染したコンテナは侵害されたホストであり、setup.sh はさらにカーネル・ルートキットをホストに読み込む。コンテナを止めて削除するだけでは足りない。ホストを再構築せねばならない。

我々は隔離した VM(Kali、カーネル 6.6.15)で getroot を一度実行した。完全な AF_ALG シーケンスを実行したが、そのビルドでは root を得られず、非特権でコマンドを実行するフォールバックに落ちた。これは特定のカーネルレイアウトを狙うエクスプロイトと整合する。マイナーは実行していない。

xrandom:マイナー

xrandom は、オープンソースのモネロ・マイナー XMRig 6.26.0 を改名し UPX でパックしたコピーだ。

属性
実体XMRig 6.26.0
パッキングUPX 4.2.4(パック時 2.8 MB、解凍時 10.1 MB)
アルゴリズムRandomX(rx/0
プールstratum+ssl 経由の pool.supportxmr.com:443
ウォレット46NVDFL6v5STw5Qw4j77PoBSHRTYnHZGZ8WRoGvHmpaMX7ZyhNUP2u24TLV9pNgncz1bZF2Vm8KkaNTzU7SXqrnFUx5zgHQ
寄付レベル0(XMRig 開発者寄付を無効化)

443 番ポート + TLS でのマイニングは、一見すると通信を普通の HTTPS に紛れ込ませる。もっとも、stratum のハンドシェイクは、細かく見る者には異なる TLS 指紋を持つ。

stealth.c:カーネル・ルートキット

これはツールキットの中で最も作り込まれた部分だ。ftrace の関数フックを使ってカーネル関数を横取りし、マルウェアの痕跡を消す LKM ルートキットで、終始 Intel のハードウェアドライバに偽装する。

属性
モジュール名intel_uncore_freq_aux
偽造メタデータMODULE_AUTHOR("Intel Corporation")MODULE_DESCRIPTION("Intel Uncore Frequency Control Driver")MODULE_VERSION("1.2.0")
フック方式kallsyms_lookup_name 経由の ftrace(5.7 以降のカーネルでは kprobe で解決)
制御/sys/kernel/intel_uncore_freq/ の sysfs(enabledcpu_locpu_himem_lomem_hihide_tag

何をフックし、なぜか。

  • CPU の偽装。 show_stat をフックして /proc/stat を書き換え、設定可能な範囲(既定で 40〜50 パーセント)で利用率を偽り、jiffies で揺らして数値が平坦に座るのではなく本物の負荷のように動くようにする。
  • メモリの偽装。 meminfo_proc_show をフックして /proc/meminfo を書き換え、MemFreeMemAvailableBuffersCachedActiveInactive を偽る。
  • プロセスの隠蔽。 iterate_dir をフックして /proc 一覧を絞り込み、名前がハードコードされた集合に一致する PID を隠す:stealthmasscansshrunsransomxcpumaskxrandomcpm_kcpmmask_helperftrhookkintel_aux。操作者は /sys/kernel/intel_uncore_freq/hide_tag を通じて実行時に名前を追加できる。
  • ファイルの隠蔽。 stealthcpumaskkintel_auxintel_uncore_freq_aux に一致するパス、そして sysfs ディレクトリそのものを隠す。
  • 自己隠蔽。 ロード時に list_del_init で自分を /proc/modules/sys/module/ から取り除き、自分の sysfs kobject を削除し、try_module_get で自身の参照カウントを増やして rmmod がアンロードできないようにする。

その隠蔽リスト自体も手掛かりだ。マイナーと並んで masscansshrunsransomx を隠しているので、操作者はおそらくスキャナーを走らせており、キットにはマイナー以上のものがあるかもしれない。

実際の効果はこうだ。top を見ている管理者には、忙しいが正常なマシンが見え、不正なプロセスは見つからず、嘘をついているカーネルモジュールも見えない。手掛かりは物理的で帯域外のものだ。マシンが熱を持ち、ファンが回り、消費電力が上がる——そのどれもルートキットは偽れない。

永続化:モード別の三つの仕組み

Rootpacket の永続化は、着地したモードによる。root モードでは互いを補強する二つの仕組みを重ね、ユーザーランドモードでは三つ目にフォールバックする。

#仕組みモード詳細
1systemd サービスrootkernel-kd.serviceType=simpleRestart=alwaysRestartSec=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 は、RedTail が通り抜けるまさにその 2375/2376 の扉を閉ざす。先に着地した操作者はホストを掘り、次の集団を締め出し、彼らが使ったであろう手法に対してマシンを堅牢化する。

第 2 段階:競合マイナーを排除。 プロセスを kill し、ファイルを削除し、cron ジョブを掃除し、既知のクリプトジャッキング一族に紐づく SSH 鍵を一掃する。対象には XMRig、Kinsing(kdevtmpfsi)、TeamTNT(tntrechtmdrfckr)、susteswatchdogsminerd、そして masscanpnscanzgrab のようなスキャナーが含まれる。

第 3 段階:ユーザーランドルートキットを排除。 既知の悪性 LD_PRELOAD エントリ(libprocesshider.solibjdk.solibpamx.so、偽の libselinux.so.3、そして xhide)を /etc/ld.so.preload から剥ぎ取り、そのライブラリを削除して、自分に干渉しうる競合のユーザーランドルートキットを片付ける。

帰属

ツールキットのトルコ語の変数名、コメント、ステータス文字列(例えば ROOT ele gecirildi!、「root を奪取した」)は、中程度の確度でトルコ語話者の操作者を指す。我々は linuxutil5.pages[.]dev に配布またはステージングの URL を見つけた。Cloudflare Pages 上にホストされており、無料で信用のあるインフラにペイロードをステージングして紛れ込むという定石に合致する。内層の rootpacket.tar.gz——ツールキット全体の自己完結コピー——は、操作者に次のホストへ送り込むための既成パッケージを与える。

侵害指標

ネットワーク

指標説明
pool.supportxmr.com / pool.supportxmr.com:443主モネロ・マイニングプール、stratum+ssl
linuxutil5.pages[.]dev配布 / ステージング(Cloudflare Pages)
api.xmrig.comrandomx.xmrig.com:443XMRig API とベンチマークのエンドポイント
donate.v2.xmrig.comdonate.ssl.xmrig.comXMRig 開発者寄付プール(存在、寄付は無効化)
443 番ポートへの stratum+ssl://外向きの TLS マイニング通信

モネロ・ウォレット: 46NVDFL6v5STw5Qw4j77PoBSHRTYnHZGZ8WRoGvHmpaMX7ZyhNUP2u24TLV9pNgncz1bZF2Vm8KkaNTzU7SXqrnFUx5zgHQ

ファイル(SHA-256)

ファイルSHA-256MD5
rootpacket.tar.gz(外層)e2d0dab6b29df89d123fe8581047a03ac9b89ae8fa0d1f334b5aefbb93152857
getrootdda96d8a4bcc39dc7679347a4386bf1024152d2ccc46d333725ad0cda855d952
xrandom(パック済み)ec3ef3dce99fa6cbc480f0f0b0c292676afed68704c44396271c7dc6afea2937

Build ID:getroot 148d8d902efd93ed892a541972fbcea3a99d05a3xrandom 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コンパイル済みルートキットモジュール

挙動

  • root または現在のユーザーとして走る xrandom という名のプロセス。
  • ハードウェア性能カウンタ(perf stat)、あるいはファン速度や消費電力と食い違う /proc/stat の CPU 数値。
  • systemd サービス kernel-kd(有効、Type=simpleRestart=always)。
  • # xrandom-userland-autostart とタグ付けされた cron エントリ。
  • 起動時にロードされるのに lsmod には現れないカーネルモジュール intel_uncore_freq_aux

検知

ルートキットが未ロードの場合

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

ルートキットがロード済みの場合

ユーザーランドのビューは侵害されているため、検知はルートキットの下か脇から来なければならない。

  • perf stat/proc/stat の CPU をハードウェアカウンタと比較する。大きな差が手掛かりだ。
  • show_statmeminfo_proc_showiterate_dir への ftrace フックに注意する。
  • 報告された CPU と、実際の電力・熱・ファン速度との不一致を、強いシグナルとして扱う。

権限昇格を捕捉する

  • 既知の暗号ツール(cryptsetupopensslgpgsystemd-cryptsetup)ではないプロセスが開く AF_ALGSOCK_SEQPACKET ソケットが、中核の手掛かりだ。完全な順序は socket(AF_ALG)bindsetsockopt(SOL_ALG)acceptpipesplicesendmsgsplicerecvmsg(繰り返し)、続いて 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. 既知のクリーンな状態からルートキットを取り除く。 ライブまたはリカバリ媒体から起動する。/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 -udracut -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 が壊したものを復元する。 それは Redis、Docker、PostgreSQL、MongoDB などのバイナリに chmod 000 を設定し、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。コンテナについては、seccomp プロファイルで AF_ALG(family 38)を封じること。
  8. コンテナからのホスト侵害を前提とする。 ページキャッシュの書き込みがコンテナ境界を越えるため、setup.sh を実行したホストは——たとえコンテナ内部からであっても——完全に侵害されたものとして扱うこと。コンテナを削除するだけでなく、ホストを再構築すること。

MITRE ATT&CK マッピング

戦術技術
初期アクセスT1190 Exploit Public-Facing Application(Redis、Docker、MongoDB、Elasticsearch、Jenkins、Hadoop YARN、暗黙的に)
実行T1059.004 Unix Shell
権限昇格T1068 Exploitation for Privilege Escalation(CVE-2026-31431、AF_ALG algif_aead);T1611 Escape to Host(共有ページキャッシュ)
永続化T1543.002 Systemd Service;T1053.003 Cron;T1547.006 Kernel Modules(DKMS)
防御回避T1014 Rootkit;T1036.005 Masquerading: Match Legitimate Name;T1027.002 Software Packing(UPX);T1070.004 File Deletion;T1564.001 Hidden Files
探索T1057 Process Discovery(対手の狩り)
横展開T1570 Lateral Tool Transfer(内層の再配布パッケージ)
影響T1496 Resource Hijacking(モネロ・マイニング)

手法とアナリストノート

  • 分析は主に静的(文字列抽出、逆アセンブル、ソース精査、構造分析)で、Kali Linux x86-64 上で行った。挙動を観察するため、隔離した VM(カーネル 6.6.15)で getroot を一度実行もした。AF_ALG シーケンスを試みたが、そのビルドでは root を得られず、非特権でコマンドを実行するフォールバックに落ちた。マイナーは実行せず、何もアップロードしていない。
  • 権限昇格コンポーネントは CVE-2026-31431 と判定した。根拠は、AF_ALG ソケットに紐づけられた authencesn(hmac(sha256),cbc(aes)) テンプレート、/usr/bin/su というページキャッシュ標的、そしてバイナリ内の splice/sendmsg/recvmsg 書き込みループだ。
  • 検体(ツールキットとその各コンポーネント)は、他の研究者や防御側の求めに応じて提供可能。[email protected] まで、あなたが誰で何のために必要かを添えてメールを。
How to cite
Kinryū Labs (2026). Rootpacket:カーネルに潜む Linux クリプトジャッキング・ツールキット. https://kinryu.sh/ja/reports/rootpacket-linux-cryptojacking-rootkit/