数日前、GlassWormが数百のGitHubリポジトリと、npm上の人気のあるReact用電話番号パッケージを 侵害した件について取り上げました。 ペイロードを徹底的に調査した結果、永続的なRATをインストールする多段階フレームワークを発見しました。その第3段階の深部では、Google Docs Offlineを装ったChrome拡張機能を強制インストールします。この拡張機能は、キーストロークを記録し、Cookieやセッショントークンをダンプし、スクリーンショットを撮影し、Solanaブロックチェーンのメモに隠されたC2サーバーからのコマンドを受け取ります。

第1段階:初期感染
乗っ取られたプロジェクト
GlassWormは、npm、PyPI、GitHub、およびOpenVSXマーケットプレイスを通じて公開された悪意のあるパッケージを介して、最初の足場を築きます。この脅威アクターは、(1) 悪意のあるパッケージをゼロから作成すること、および (2)メンテナンス担当者のアカウントを乗っ取り、正規プロジェクトの悪意のあるバージョンをプッシュすること、という2つの手法を同時に用いています。
2種類のローダー
GlassWormは、おそらくその 非表示のUnicodeローダー これについては以前の投稿でも取り上げましたが、これが唯一の配信方法というわけではありません。2つ目の、より直接的な手法では、従来の難読化された preinstall スクリプト(最近の…に見られるように) react-native-country-select のセキュリティ侵害 npm上で。どちらも最終的には同じ結果をもたらし、同じブロックチェーンベースのC2ビーコンを共有していますが、そこに至るまでの道のりは大きく異なります。
どのローダーが被害マシンに到達したかに関わらず、ステージ1の実行ロジックは同じである。10秒間の起動遅延の後、ローダーは処理を進める前に2つのチェックを行う。
ジオフェンシング。 ローダーは5つのロケール信号をチェックします(os.userInfo().username, process.env.LANG, process.env.LANGUAGE, process.env.LC_ALL、および Intl で解決されたロケール)に対して /ru_RU|ru-RU|ロシア語|russian/i、そしてシステムのタイムゾーンとUTCオフセットを、Europe/MoscowからAsia/Anadyrまでを網羅するロシアのタイムゾーンの固定リストと照合します。ロシアのロケールが検出された場合、実行は停止します。
レート制限。 ローダーは読み込みます ~/init.json (または %USERPROFILE%\init.json (Windowsの場合)保存されているタイムスタンプを確認します。ファイルが2時間以内に作成された場合、実行は停止します。そうでない場合は、タイムスタンプが更新されます。
ソラナ・ブロックチェーン C2
最後に、ローダーはSolanaブロックチェーンに対してC2アドレスの照会を行います。攻撃者は、削除される可能性のあるURLをハードコーディングするのではなく、それを メモ Solanaトランザクションのフィールド。ローダーは getSignaturesForAddress ハードコードされたウォレットに対して、9つのパブリックRPCエンドポイントを順に試行し、応答があるまで続ける:
https://api.mainnet-beta.solana.comhttps://solana-mainnet.gateway.tatum.iohttps://go.getblock.us/86aac42ad4484f3c813079afc201451chttps://solana-rpc.publicnode.comhttps://api.blockeden.xyz/solana/KeCh6p22EX5AeRHxMSmchttps://solana.drpc.orghttps://solana.leorpc.com/?api_key=FREEhttps://solana.api.onfinality.io/publichttps://solana.api.pocket.network/
2つのローダーの亜種において、2つのウォレットアドレスが確認されています:
BjVeAjPrSKFiingBn4vZvghsGj9KCE8AJVtbc9S8o8SC(Unicodeローダー)6YGcuyFRJKZtcaYCCFba9fScNUvPkGXodXE1mJiSzqDJ(難読化されたプリインストールローダー)
ローダーは、memoフィールドがnullではないトランザクションが見つかるまで、10秒間隔でポーリングを繰り返します。Solanaのmemo機能は本来、トランザクションに注釈を追加するために設計されましたが、ここでは秘密のデッドドロップとして機能しています。 メモは永続的であり、オンチェーン上で公開され、いかなる単一の当事者によっても削除できないインフラストラクチャ上に保存されます。オペレーターは、新しいメモを含む新しいSolanaトランザクションを送信することで、いつでもステージ2のURLを更新できます。パッケージの修正も、インフラの再デプロイも不要であり、防御側がネットワーク層でブロックすべきものは何もありません。
ウォレットに貼られたメモ 6YGcuyFRJKZtcaYCCFba9fScNUvPkGXodXE1mJiSzqDJ は:
{"link":"aHR0cDovLzQ1LjMyLjE1MC4yNTEvM2U0VGc4ViUyRjhhQ21PSktpcEFTQURnJTNEJTNE"}会社情報 リンク この値はBase64エンコードされたURLです。デコードすると:
http://45.32.150.251/3e4Tg8V%2F8aCmOJKipASADg%3D%3DローダーはこのURLを os ヘッダーは現在のプラットフォームに設定されています(ダーウィン, Linux、または Win32)、これによりC2を 45.32.150[.]251 プラットフォーム固有のペイロードを配信するためです。レスポンス本文は暗号化されたステージ2のペイロードであり、その後復号されて実行されます。執筆時点では、C2はまだ稼働しており、以下のペイロードを返していました。 Win32.
第2段階:秘密裏な情報流出
ステージ2のペイロードは、認証情報の収集、暗号資産ウォレットからの情報流出、ホストのプロファイリング、そして最終的かつ永続的なステージ3に向けた独自のドロッパーロジックを備えた、完全なデータ窃取フレームワークです。収集されたすべてのデータは、 %TEMP%\hJxPxpHP\、zip形式で圧縮し、POSTリクエストで http://217.69.3[.]152/wall.
暗号資産ウォレットの盗難
ペイロードは再帰的に検索します %APPDATA% そして %LOCALAPPDATA% ブラウザ拡張機能のプロファイルおよびスタンドアロン型ウォレットアプリのデータ用です。MetaMask、Phantom、Coinbase、Exodus、Binance、Ronin、Keplrなど、現在利用されているほぼすべての主要なウォレットを含む、71のブラウザ拡張機能ウォレットIDを対象としています。また、以下のデータも収集します .txt 被害者の「ドキュメント」フォルダや「デスクトップ」フォルダ内のファイルを収集し、シードフレーズや暗号資産の保有状況に関連するキーワードと一致するファイル名の画像をコピーします。
開発者の認証情報の盗難
ステージ2では、ソフトウェア開発者のマシン上に存在しそうな認証情報ストアを標的とします。ペイロードの内容は次のとおりです。 ~/.npmrc そして process.env.NPM_TOKEN. 検出されたトークンは、 https://registry.npmjs.org/-/whoami データが外部へ流出する前に。また、以下の方法を通じてトークンを抽出します。 Gitの認証情報 コマンドおよびVS Codeの内部ストレージから。
クラウドシークレット
ステージ2では、AWS、GCP、Azure、Docker、Kubernetes、SSHキー、Herokuの認証情報ファイルもコピーします。 .netrc、DigitalOceanの doctl、およびTerraform。
ホストのプロファイリング
最後に、それは system_info.txt 詳細なハードウェア構成、環境変数、インストール済みのアプリケーション、実行中のプロセス、ディスク構成、およびOSの詳細を含みます。
ステージ3に向けた準備
データの持ち出しが完了した後、2つのコンポーネントをダウンロードすることでステージ3の準備が行われます:
- 3a)ハードウェア暗号資産ウォレット(LedgerおよびTrezor)向けのフィッシング用バイナリ。
- 3b) WebSocketベースの不死身のRAT。保存先:
%APPDATA%\QtCvyfVWKH\index.jsこれにはいくつかのバイナリが付属しています:c_x64.node/f_ex86.node— ブラウザの認証情報を盗むマルウェアデータ— Chromeアプリ限定の暗号化の回避index_ia32.node/index_x64.node— HVNCモジュールw.node(Windows) /m(macOS) — 悪意のあるブラウザ拡張機能をインストールします
RATのペイロードには、単にURLがハードコードされているわけではありません。その代わりに、以下のGoogleカレンダーの公開ページを取得します。 https://calendar.app.google/2NkrcKKj4T6Dn4uK6 そして、招待状のタイトルを抽出します。その値はBase64デコードされ、URLスラグとして http://45.32.150[.]251. ペイロード配信のための間接層としてGoogleカレンダーを利用する これは、2025年3月から追跡している傾向です、そしてこの脅威アクターのツール群において、一貫して確認され続けている。

ステージ3a:ハードウェアウォレットを標的としたフィッシング
以下のマシンでは %APPDATA%\Ledger Live が存在する場合、ステージ 3 は http://45.32.150[.]251/led-win32、それを %TEMP%\SKuyzYcDD.exe、そして次のように付け加える HKCU\Software\Microsoft\Windows\CurrentVersion\Run\UpdateLedger 永続化のため。このファイルの内部名は Assaac.exe で、自身を「LLC LogicSub」と称する企業に帰属する(SHA-256: 06fab21dc276e3ab9b5d0a1532398979fd377b080c86d74f2c53a04603a43b1d). このバイナリはRATではありません。その唯一の機能は、Ledger LiveやTrezorを装って暗号資産ウォレットを盗み出すことです。

起動時に、次のようにクエリを実行します https://ipapi.co/xml そして、返された国名をCIS地域の9つの除外国(ロシア、カザフスタン、キルギス、アゼルバイジャン、タジキスタン、ウズベキスタン、ベラルーシ、モルドバ、アルメニア)と照合します。被害者がこれらの国のいずれかにいる場合、実行は停止します。これは、ステージ1のジオフェンシングのロジックと同様です。
このバイナリは、USBデバイスの接続を検出するためにWMIイベントのサブスクリプションを登録します:
SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_PnPEntity'LedgerまたはTrezorデバイスが接続されると、それに対応するフィッシング画面が表示されます。LedgerのUIには偽の設定エラーが表示され、24個の番号付きリカバリーフレーズ入力欄が表示されます。TrezorのUIには、「ファームウェアの検証に失敗しました。緊急再起動を開始します」という偽のメッセージと、同じ24語の入力レイアウトが表示されます。どちらの画面にも「ウォレットを復元」ボタンがあります。
1秒間隔で実行されるバックグラウンドループが呼び出す Process.GetProcessesByName 実行中のLedger Liveプロセスをすべて終了させ、被害者がウィンドウを閉じた場合にフィッシングウィンドウを再表示します。 ウィンドウの閉じ ハンドラーは、閉じる操作をインターセプトし、閉じることで暗号資産が失われる可能性があることを警告するダイアログを表示します。
有効なフレーズが送信されると、24語が System.Net.Http.HttpClient to 45.150.34[.]158.
ステージ3b:WebSocketベースのRAT
RATは次のように保存されます %APPDATA%\QtCvyfVWKH\index.js また、再起動後も動作を維持するための2つの永続化メカニズムを備えています。 アプリを更新 起動時に最高の権限で実行され、かつ HKCU\Software\Microsoft\Windows\CurrentVersion\Run key は、以下の場所で PowerShell ランチャーを実行します %LOCALAPPDATA%\QtCvyfVWKH\AghzgY.ps1.
不死性が組み込まれています。スクリプトはフックします 信号情報, SIGTERM, SIGQUIT, SIGHUP, SIGUSR2, 未処理の例外、および 処理されない拒否. これらのシグナルのいずれかが発生した場合、システムはペイロードの再ダウンロードと再起動をスケジュールします。プロセスが強制終了された場合でも、後で自動的に再起動されます。
DHTベースのC2
RATはメインのC2アドレスをハードコードしていません。固定された公開鍵に対してDHT検索を実行します 3c90fa0e84dd76c94b1468f38ed640945d72bc12、ブートストラップによる dht.libtorrent.org, router.bittorrent.com、および router.utorrent.com.
オペレーターは、そのキーのDHT値にライブ設定を保存します。dht.getが即座に失敗した場合、スクリプトは5分後に再試行します。値が返されない場合、スクリプトはSolanaメモのデッドドロップに切り替わります:スクリプトはポーリングを行います getSignaturesForAddress 財布用 BjVeAjPrSKFiingBn4vZvghsGj9KCE8AJVtbc9S8o8SC、メモのリンクフィールドからIPアドレスをデコードし、検索を再実行します。Solanaのメモは、ローダーに手を加えることなく、いつでも新しいIPアドレスで更新でき、DHTの到達性を再構築できます。
攻撃者のインフラから復元された設定:
217.69.0[.]159:10000- DHTブートストラップノード45.32.150[.]251- WebSocket ベースの C2217.69.3[.]152:80- データ流出用サーバー
C2コマンド
DHTの設定が完了すると、スクリプトは Socket.IO 接続を 45.32.150[.]251:4787 また、5つのカテゴリーに分類されるC2コマンドを処理します:
- start_hvnc/stop_hvnc: 隠しリモートデスクトップアクセス用のHVNCネイティブモジュールを展開します。
- start_socks / ストップソックス: WebRTCモジュールを
http://45.32.150[.]251/module/wrtc、それを%APPDATA%\_node_x64\webrtc\wrtc-win32-x64\index.js、そしてそれをSOCKSプロキシとして動作させ、被害者のマシンをプロキシノードに変え、攻撃者が被害者のIPアドレスから他の攻撃を実行するためのインフラとして機能させる。 - reget_log: ブラウザの認証情報を盗み出し、外部へ流出させる一連の処理を実行します。
- get_system_info: OS、CPU、メモリ、ホスト名、稼働時間、ユーザー名、およびホームディレクトリを送信します。
- コマンド:eval() を通じて攻撃者が指定した任意の JavaScript を実行し、攻撃者に完全なリモートコード実行権限を与える。
ブラウザの認証情報の盗難
このスクリプトは、Chrome、Edge、Brave、Opera、Opera GX、Vivaldi、およびFirefoxを対象としています。プロファイルディレクトリを列挙し、Cookieを確認してアクティブなプロファイルを特定した後、 c_x64.node ブラウザのSQLiteデータベース(ログインデータ、Cookie、Webデータ)から認証情報を直接抽出するため。Chrome v127以降では、App-Bound Encryptionを使用してマスターキーを暗号化しており、通常はChrome外部のプロセスがこれを読み取ることを防いでいます。このデータバイナリは、このセキュリティ機能を回避しようとします。結果は、以下のパスにJSONファイルとして保存されます。 %TEMP%\EUXFUxzOVe\、これにはクッキー、保存されたログイン情報、自動入力データ、閲覧履歴、ブックマーク、およびクレジットカード情報が含まれます。このディレクトリはZIP形式で圧縮・暗号化され、 217.69.3[.]152:80/log.
悪意のあるChrome拡張機能RAT
このスクリプトは、さらに、次のように装った拡張機能を強制的にインストールします Google ドキュメントのオフライン機能 (バージョン 1.95.1)。これは、別のSolanaメモからC2を解決し、ポーリングを行います getSignaturesForAddress 財布用 DSRUBTziADDHSik7WQvSMjvwCHFsbsThrbbjWMoJPUiW. そのウォレットのメモには、拡張機能のAPI とgeo-IPヘルパーを指すc2serverフィールドとcheckIpフィールドが含まれています。メモを解析した後、拡張機能は POSTapi、返された agent_id を chrome.storage.local に保存し、ポーリングを開始します GET /api/commands?agent_id=<id> 5~30秒間隔でランダムに。

オペレーターは、以下のコマンドを実行できます:
- domsnapshot: すべてを外部へ流出させる
document.documentElement.outerHTMLアクティブなタブの - getcookies: クッキーを収集します(オプションでドメインごとにフィルタリング可能)
- ローカルストレージのダンプ: すべてをダンプする
localStorageキーと値のペア - take_screenshot: タブのスクリーンショットをBase64エンコードして取得します
- クリップボードを取得: クリップボードを読み込みます
navigator.clipboard.readText() - 履歴:最大5,000件のブラウザ履歴を取得します(デフォルト期間:7日間)
- ブックマーク:ブックマークツリー全体をエクスポートします
- 列挙: ブラウザ、ハードウェア、WebGL/GPUの詳細情報を特定し、インストールされている拡張機能を調査します。
chrome-extension://<id>/manifest.json - キーロガーを起動 / キーロガーを停止 / キーロガーデータを取得: すべてのページで、keydown、keyup、keypress、input、change、focus、blur イベントをフックします。入力された値、フォームのメタデータ、およびターゲット要素のコンテキストを取得し、
POSTapi5秒ごとに
収集されたすべてのデータは、 POSTapi として { agent_id, action, payload }.
この拡張機能は、対象を絞ったセッション監視も行います。監視対象サイトのルールを api また、Bybit (.bybit.com) がターゲットとして事前設定されており、secure-token および deviceid の Cookie を監視します。これらを検出すると、auth-detected Webhook を発火させて api クッキーのデータやページのメタデータを含んでいます。また、C2は、アクティブなタブを攻撃者が制御するURLへ強制的にリダイレクトさせるルールを提供することも可能です。
検出と保護
目に見えない脅威には、能動的な防御が必要です。目に見えないものを検出するには、視覚的なコードレビューや標準的なリンティングだけに頼ることはできません。 Aikidoでは、Glasswormやその他の脅威アクターの検出機能を、マルウェアスキャンパイプラインに直接組み込んでいます。
すでにAikidoをご利用の場合、これらのパッケージはフィード内で100/100の重大な検出結果としてフラグ付けされます。

まだAikidoをご利用ではありませんか? 無料アカウントを作成し、リポジトリを連携してください。無料プランには、マルウェア検出機能が含まれています(クレジットカードは不要です)。
最後に、サプライチェーンマルウェアが出現した瞬間にリアルタイムで阻止できるツールがあれば、深刻な感染を防ぐことができます。これがAikido Chain」のコンセプトです。この無料のオープンソースツールは、npm、npx、yarn、pnpm、pnpxをラップし、AIと人間のマルウェア研究者の両方を活用して、最新のサプライチェーンリスクが環境内に侵入する前に検知・ブロックします。
侵害の痕跡
ネットワーク — IPアドレス
45.32.150[.]251— 第2段階のペイロード送信、第3段階のWebSocket RAT (:4787)217.69.3[.]152— データ流出用サーバー:ステージ2(/wall)、ステージ3(/log)217.69.0[.]159— DHT ブートストラップノード (:10000)45.150.34[.]158— Ledger/Trezorのシードフレーズの流出
ネットワーク — C2 URL
http://45.32.150[.]251/3e4Tg8V%2F8aCmOJKipASADg%3D%3D— ステージ2の暗号化ペイロードhttp://45.32.150[.]251/led-win32— Ledger/Trezorのフィッシング用バイナリのダウンロードhttp://45.32.150[.]251/get_arhive_npm/nt70c2J3PG%2BfPBSFHJKoWQ%3D%3D— ネイティブモジュールアーカイブhttp://45.32.150[.]251/get_encrypt_file_exe/E/E%2BT9tEjmURMwNnCCY2CA%3D%3D— HVNCの運用ペイロードhttp://45.32.150[.]251/module/wrtc— SOCKSプロキシWebRTCモジュールhttp://45.32.150[.]251:4787— WebSocket RAT チャネル (Socket.IO)http://217.69.3[.]152/wall— ステージ2:エンドポイントからのデータ流出http://217.69.3[.]152:80/log— ステージ3:ブラウザ認証情報の流出エンドポイントhttps://calendar.app[.]google/2NkrcKKj4T6Dn4uK6— ステージ3:Googleカレンダーの招待状を利用したURLの迂回
ソラナウォレット
BjVeAjPrSKFiingBn4vZvghsGj9KCE8AJVtbc9S8o8SC— ステージ1:UnicodeローダーによるC2デッドドロップ;ステージ3:DHTフォールバック6YGcuyFRJKZtcaYCCFba9fScNUvPkGXodXE1mJiSzqDJ— ステージ1の難読化済みプレインストールローダー C2 デッドドロップDSRUBTziADDHSik7WQvSMjvwCHFsbsThrbbjWMoJPUiW— ブラウザ拡張機能 C2 デッドドロップ
ファイルのハッシュ値(SHA-256)
06fab21dc276e3ab9b5d0a1532398979fd377b080c86d74f2c53a04603a43b1d— Assaac.exe / SKuyzYcDD.exe(Ledger/Trezorフィッシング用バイナリ)f171c383e21243ac85b5ee69821d16f10e8d718089a5c090c41efeaa42e81fca— c_x64.node(ブラウザ認証情報窃取型マルウェア、Windows x64)9df62cefd87784c7ee1ca8b4e6fc49737a90492fa6c23901e3b7981b18c6c988— f_ex86.node(ブラウザ認証情報窃取型マルウェア、Windows x86)43253a888417dfab034f781527e08fb58e929096cb4ef69456c3e13550cb4e9e— データ(Chromeアプリ限定暗号化の回避)4a60afa085fe5a847aef164578537bc33b9b58954143381e0c65c6354e4501e3— index_ia32.node (HVNC モジュール、Windows x86)de81eacd045a88598f16680ce01bf99837b1d8170c7fc38a18747ef10e930776— index_x64.node (HVNC モジュール、Windows x64)fdba5be3da2467e642bd8710f971e6b266b30ac15f5f413982fd719d7e0bffd9— w.node(Chrome拡張機能の強制インストーラー、Windows x64)ee3e4dd5c1e073b8805f4107ccc7bc7e6e3c209fe13ea04ff3f2173c8dbe74a6— m (Chrome拡張機能の強制インストーラー、macOSユニバーサルバイナリ)
ファイル名
~/init.json/%USERPROFILE%\init.json— レート制限用のタイムスタンプ。uuid、バージョン、日付が含まれる%TEMP%\hJxPxpHP\— ステージ 2 クレデンシャル一時保存ディレクトリ%TEMP%\EUXFUxzOVe\— ステージ3のブラウザ認証情報一時保存ディレクトリ%TEMP%\SKuyzYcDD.exe— Ledger/Trezorを標的としたフィッシング用バイナリ%APPDATA%\QtCvyfVWKH\index.js— ステージ3のメインRATスクリプト%LOCALAPPDATA%\QtCvyfVWKH\AghzgY.ps1— ステージ3 PowerShell 持続化ランチャー%APPDATA%\_node_x86\node\node.exe— Node.js v22.9.0 x86 ランタイムが自動的にダウンロードされました%APPDATA%\_node_x64\node\node.exe— Node.js v22.9.0 x64 ランタイムが自動的にダウンロードされました%APPDATA%\_node_x64\webrtc\wrtc-win32-x64\index.js— SOCKSプロキシモジュール%LOCALAPPDATA%\Google\Chrome\jucku\— 悪意のあるChrome拡張機能のディレクトリ(Windows)/Library/Application Support/Google/Chrome/myextension/— 悪意のあるChrome拡張機能ディレクトリ(macOS)
レジストリ
HKCU\Software\Microsoft\Windows\CurrentVersion\Run\UpdateApp— ステージ3のRATの持続感染HKCU\Software\Microsoft\Windows\CurrentVersion\Run\UpdateLedger→%TEMP%\SKuyzYcDD.exe— レジャー・フィッシングによるバイナリの永続化
スケジュールされたタスク
アプリを更新— ランAghzgY.ps1(ステージ3)起動時、最高権限で
WMI
SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_PnPEntity'— USBハードウェアウォレット検出トリガー(Ledgerフィッシングバイナリ)
ブラウザ拡張機能
- 表示名:Google ドキュメント オフライン (バージョン 1.95.1)
- 拡張機能ディレクトリ名(Windows):jucku
- 拡張機能ディレクトリ名(macOS):myextension
プロセス名
アサック— Ledger/Trezor フィッシングバイナリの内部プロセス名

