Bitdefenderの研究者は、Solanaブロックチェーンをペイロードインフラストラクチャとして使用してマルチステージのNodeJSスティーラーをデプロイする悪意あるWindsurf IDE(統合開発環境)拡張機能を発見しました。
Visual Studio CodeのR言語サポート拡張機能に偽装された拡張機能は、ブロックチェーンのトランザクションから暗号化されたJavaScriptを取得し、NodeJSランタイムプリミティブを使用して実行し、コンパイルされたアドオンをドロップしてChromiumデータを抽出し、同時に隠されたPowerShellスケジュール済みタスクの助けを借りて永続性を確立します。
公式で正規のREditorSupportという拡張機能があります。これは攻撃者が潜在的な被害者を混乱させるために非常に類似した名前を使用した理由と思われます。
この攻撃は特にロシアのシステムを除外し、開発者環境をターゲットにしており、脅威アクターが高価値の認証情報を収集できるようにします。
重要なポイント
- Windsurf IDE内にインストールされた偽のR言語開発拡張機能がマルウェア感染をトリガーします。
- 悪意あるWindsurf拡張機能はその真の機能を隠し、検出を避けるためにインストール後にのみペイロードを復号化しました。
- 従来のコマンドアンドコントロールサーバーを使用する代わりに、攻撃者がSolanaブロックチェーンから悪意あるコードを取得しました。これは削除作業を大幅に困難にします。
- 攻撃を開始する前に、マルウェアは被害者がロシアにいるかどうかをチェックし、そうだった場合は自動的にシャットダウンしました。
- マルウェアの目的は、Chromiumベースのブラウザからのデータ流出(保存されたブラウザパスワード、セッションクッキー、その他の機密データ)です。
- 永続性を確立するために、マルウェアは、バンドルされたNodeJSランタイムを通じて自身を再起動する隠されたWindowsスケジュール済みタスクを作成します。
- このキャンペーンは、特権付きアクセス、APIキー、およびその他の高価値の認証情報を頻繁に持つ開発者を意図的にターゲットにしています。
インシデント発見と初期アラート
調査は、Bitdefender EDRがコーポレートワークステーション上のwindsurf.exeに関する複数の検出を生成した後に開始されました。
ユーザーはR開発に役立つようにWindsurf拡張機能をインストールしていました。MATLABに相当する環境です。拡張機能の名前は:
reditorsupporter.r-vscode-2.8.8-universal
感染はスタンドアロン実行可能ファイルに依存していません。代わりに、IDEの信頼できる拡張機能エコシステム内で動作し、メインアプリケーションプロセスに関連するエンドポイント検出にもかかわらず、悪意あるロジックが永続化できました。
Windsurf内の悪意ある拡張機能
調査人員はWindsurf拡張機能ディレクトリを手動で調査しました:
.windsurf/
すべてのIDE拡張機能を保存するこの場所内で、疑わしいパッケージを特定しました。拡張機能には、埋め込まれたペイロードを復号化する奇妙なJavaScriptブロックが含まれていました。このコードは最終的な悪意ある機能を直接含んでいません。代わりに、ローダーとして機能しました。
復号化されると、ペイロードは、さらに進む前に環境チェックを開始する2番目段階のJavaScriptコンポーネントを明らかにしました。
復号化されたローダーとシステムプロファイリング
復号化されたペイロードの最初のアクションは、システムをプロファイルすることでした。現在のユーザー名を収集し、環境変数を検査し、ロケールとタイムゾーン情報を検査し、UTC時間を計算しました。
スクリプトはロシアのインジケータを明示的に検索しました。言語マーカーまたは「Russian」を探し、システムタイムゾーンをEurope/Moscow、Europe/Kaliningrad、Europe/Samara、Asia/Yekaterinburg、Asia/Omsk、Asia/Krasnoyarsk、Asia/Irkutsk、Asia/Yakutsk、Asia/Vladivostok、Asia/Magadan、Asia/Kamchatka、Asia/Anadyr、およびMSKを含む既知のロシア地域と比較し、UTCオフセットが+2から+12の間に該当するかどうかを検証しました。
function _isRussianSystem() {
let isRussianLanguage = [os.userInfo().username, process.env.LANG, process.env.LANGUAGE, process.env.LC_ALL, Intl.DateTimeFormat().resolvedOptions().locale].some(info => info && /ru_RU|ru-RU|Russian|russian/i.test(info)),
timezoneInfo = [Intl.DateTimeFormat().resolvedOptions().timeZone, new Date().toString()],
russianTimezones = ["Europe/Moscow", "Europe/Kaliningrad", "Europe/Samara", "Asia/Yekaterinburg", "Asia/Omsk",
"Asia/Krasnoyarsk", "Asia/Irkutsk", "Asia/Yakutsk", "Asia/Vladivostok", "Asia/Magadan", "Asia/Kamchatka", "Asia/Anadyr", "MSK"
],
isRussianTimezone = timezoneInfo.some(info => info && russianTimezones.some(tz => info.toLowerCase().includes(tz.toLowerCase()))),
utcOffset = -new Date().getTimezoneOffset() / 60,
isRussianOffset = utcOffset >= 2 && utcOffset <= 12;
return isRussianLanguage && (isRussianTimezone || isRussianOffset)
}
name(_isRussianSystem, "_isRussianSystem");
システムがこれらの基準に一致した場合、実行は直ちに停止しました。
ロシアのシステムのこの意図的な除外は、国内の精査を避けようとしている経済的動機のあるサイバー犯罪グループに通常関連付けられた運用セーフガードを示しています。
Solana RPC悪用とリモートペイロード取得
拡張機能はNodeJS環境内で実行され、サンドボックスされていないため、オペレーティングシステムとネットワークスタックと自由に対話できます。
システムプロファイリングチェックに合格した後、マルウェアはPOSTリクエストを以下に開始しました:
https://api.mainnet-beta.solana[.]com
Solana JSON-RPCメソッドを呼び出しました:
getSignaturesForAddress
従来のコマンドアンドコントロール(C2)サーバーに接触する代わりに、マルウェアはSolanaを分散インフラストラクチャとして使用しました。ブロックチェーンのトランザクションをクエリし、トランザクションメタデータ内に埋め込まれたエンコードされたデータを取得しました。
リクエストが完了すると、マルウェアはJavaScriptペイロードフラグメントを含むバッファを受け取りました。デコードして実行の準備をしました。
サンドボックスされていないNodeJS環境での動的実行
取得されたコンテンツは、AES暗号化ペイロードコンポーネント層を持つBase64エンコードされたJavaScriptで構成されていました。ローダーは悪意あるランタイムを動的に再構築しました。

Windsurf拡張機能はNodeJS環境で動作し、厳密なサンドボックス分離がないため、マルウェアは直接ファイルシステムアクセスを取得し、制限なしにネイティブモジュールをロードできました。

ネイティブ.nodeアドオンとChromiumデータ抽出
動的実行後、マルウェアはファイルをドロップしました:
AppData\Local\Temp\<random_string>\
これらのファイルはDLLであり、NodeJSによって.nodeファイルとしてロードされます。
const addon = require('C:/Users/<USER>/AppData/Local/Temp/<Random_String>/c_x64.node');
const result = addon.extractBrowserData(browser, outputFile, showAll, decryptedData, profile);
研究者は、これらのコンポーネントが認証情報スティーラーとして機能することを確認しました。
これらのネイティブモジュールは以下を有効にします:
- ブラウザプロファイルとの直接的な相互作用
- 保存された認証情報の抽出
- クッキーおよびセッショントークンの取得
- 暗号化されたChromiumシークレットへのアクセス
PowerShell実行とスケジュール済みタスク永続性
ネイティブスティーラーモジュールをデプロイした後、マルウェアは永続性を達成するためにPowerShellを呼び出しました。
PowerShellコンポーネントはコンソールウィンドウを隠し、Add-Typeを通じてWin32 APIコールを活用し、以下の名前のスケジュール済みタスクを作成しました:
UpdateApp
タスクは以下を実行しました:

最高の特権で起動時に実行するようにタスクを構成し、実行ポリシー制限をバイパスしました。
スクリプトはまた、以下のレジストリエントリとやり取りし、それが存在することの証拠を削除しました:
HKCU:\Software\Microsoft\Windows\CurrentVersion\Run
特定の実行パターンに一致するレジストリエントリを削除し、永続性メカニズムを再確立しました。
これにより、IDEが閉じた場合でも、悪意あるワークフローが続行されることが保証されました。
永続性の確立における最終ステップとして、スクリプトは以下を起動しました:
C:\Users\<user>\AppData\Roaming\node_x86\node\node.exe
以下で:
C:\Users\<user>\AppData\Roaming\zplnUtG\index.js
感染はシステムの再起動全体で自己維持されるようになりました。
完全な感染シーケンス
→ Windsurf拡張機能をダウンロード
→ 悪意あるNodeJSパッケージを実行
→ PowerShell実行
→ スケジュール済みタスク作成(永続性)
→ Base64 JavaScript
→ AES暗号化ペイロード
→ 動的実行
→ Solanaからのリモート取得
→ ネイティブ.node DLLを介したブラウザ相互作用
結論
このインシデントは、攻撃者が従来のデリバリー方法に依存する代わりに、信頼できる開発ツール内に自身を埋め込む傾向がますます高まっていることを示しています。
一見合法的なR拡張機能として認証情報盗難操作を偽装することにより、オペレーターは開発者のIDE内で実行を取得し、Solanaブロックチェーンから暗号化されたペイロードを取得し、機密ブラウザデータを抽出できるネイティブモジュールをデプロイしました。
ロシアのシステムのこの意図的な除外はさらに、運用セーフガード付きで構築された経済的動機のあるキャンペーンを示唆しています。
翻訳元: https://www.bitdefender.com/en-us/blog/labs/windsurf-extension-malware-solana