PhantomSync: npmの暗号通貨パッケージがウォレット窃盗を隠蔽する

PhantomSync: 8 つの暗号開発者向け npm パッケージが、遅延型で自己永続的なドロッパーを隠蔽している

TL; DR

あるnpmパブリッシャーは、ブロックチェーンやウォレット開発のための日常的な構成要素のような名前の8つの小さなパッケージを出荷しました。 base58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-libそれぞれのモジュールには、動作するユーティリティが含まれています。ただし、そのユーティリティの後に、モジュールがインポートされた瞬間に実行される自己実行型のコードブロックが付加されています。

インポート後約37秒そのブロックは、テストフィクスチャとして偽装されたパッケージ内のペイロードをデコードし、それをユーザーのホームディレクトリの下にある隠しファイルに書き込み、毎回再起動するように自身を登録します。 login Windows、macOS、Linux の各プラットフォームに対応し、デコードされたスクリプトを独立したプロセスとして起動します。npm install の実行中にこの処理が実行されることはなく、コードのインポートと実行を待機します。これはインストール時よりも静かな処理です。

ペイロードは不透明ではありません。プレーンな base64 として出荷されるため、「テスト フィクスチャ」をデコードすると、第 2 段階が完全に復元されます。 暗号通貨ウォレットと秘密窃盗犯 これは、マシンがアイドル状態になるのを待ち、秘密鍵とシードフレーズを収集し、ハードコードされたRSA-4096鍵でそれぞれを暗号化し、それを公開IPFSストレージに固定して外部に持ち出し、12時間ごとにビーコンを送信します。

クラスターを追跡します ファントムシンク分析時点で、8つのパッケージすべてがnpmレジストリに登録されており、単一のアカウントで公開されていた。

生態系npm
エクストラbase58-utils, abi-encode, eth-dev, arb-kit, layer2-sdk, solana-key-utils, eth-wallet-helpers, crypto-validate-lib
対象となるプラットフォームWindows、macOS、Linux
コア行動遅延インポート時ドロッパーはテストフィクスチャとして隠蔽され、クロスプラットフォームの永続性をインストールします
ペイロード暗号通貨ウォレットと秘密情報の窃盗、RSA-4096暗号化、公開IPFSピンニングを介したデータ流出

攻撃の解剖学

どのパッケージも、一見すると特に目立った特徴はないように見える。 base58ユーティリティ例えば、は数キロバイトの依存関係のないBase58 / Bitcoin-WIFヘルパーコードであり、まさにその名前が示す通りのものです。関連するコードは、 After モジュールの モジュール.エクスポートファイルの先頭をざっと読む読者がまず見ないような場所、つまりタイマーを使って自身をスケジュールする自己実行関数。

パッケージのソースコードから再構築された一連の操作は、次のようになります。

1. Package is required() by the host project 2. A self-invoking function schedules a callback ~37,000 ms later (setTimeout) 3. On fire, the callback reads test/fixtures/keypairs.dat (a base64 blob) 4. It base64-decodes that blob into a Node.js script 5. It writes the script to ~/.cache-db/.node-sync/syncd.js (mode 0o700) 6. It installs login-persistence for that script (see below) 7. It spawns "node syncd.js" as a detached process

特に際立ったデザイン上の選択肢が2つある。

ペイロードは試験治具として輸送される。 第2段階は、明白なコードとして記述されていません。 test/fixtures/keypairs.dat、キーペアを処理すると主張するパッケージに紛れ込む名前のbase64ファイル。tarballをざっと見た人間にはサンプルデータのように見えるが、付加されたコードにとってはデコードして実行するスクリプトである。ドロッパー自体にはネットワークアドレスは含まれていない(それらは第2段階に存在する)が、追加の難読化はない。フィクスチャはbase64の単一レイヤーなので、それをデコードすると(base64 -d) 完全な syncd.js そしてそのネットワーク動作についても説明します。次のセクションでは、回復した段階で何が行われるのかを詳しく解説します。

爆発は遅延され、設置ではなく輸入と関連付けられており、 トリガーは ()が必要です さらに、インストールフックではなく約37秒のタイマーを使用することで、動作は、 npmインストール このステップでは、多くの短時間で完了するサンドボックスやCIの実行よりも長い遅延が発生します。何かが実行される頃には、パッケージを取り込んだインストールはとっくに完了しています。

デコードされたスクリプトがディスクに保存されたら ~/.cache-db/.node-sync/syncd.js — 通常のキャッシュディレクトリのように読み取れるように選択されたパス — ドロッパーにより、3つの主要プラットフォームすべてで再起動後も保持されます。

  • Linux: スクリプトを再起動する cron エントリ。エントリは、既存の crontab をフィルタリングすることによってインストールされます。 grep -v syncdこれは、同じ名前をgrepで検索する通常のリストから新しいエントリを除外するという副作用をもたらします。
  • Windows: スケジュールされたタスク名 WinNodeSync12分間隔で再放送されるように設定されています。
  • MacOSの: ラベル付けされた launchd ジョブ com.apple.syncdいくつかのパッケージには、正規のAppleシステムサービスを模倣したラベルが含まれている。

その後、スクリプトはすぐに独立したプロセスとして起動されるため、インポートプログラムが終了した後も実行が継続されます。

第2段階が行うこと

フィクスチャは単一の base64 レイヤーであるため、第 2 ステージはきれいにデコードされ、完全に読み取ることができます。 8 つのパッケージすべてに、同じスクリプトの 3 つのバリアントのいずれかが含まれており、ヘッダー コメントで次のように識別されます。 ファントム syncd v3 — トポ ドゥルミエンテ (「スリーピングモール」)。その役割は、暗号通貨ウォレットの情報と開発者の秘密情報を盗み出し、マシンから外部に送信することです。実行手順は以下のとおりです。

  • 1. 機械がアイドル状態になるまで待ってください。 何かをする前に、 syncd.js ユーザーが非アクティブ状態だった時間をチェックし、一定のしきい値(約15分)を超えた場合にのみ処理を進めます。 エクスプリントアイドル Linux では、 イオレグ macOS では HIDIdleTime、Windows では PowerShell のアイドル時間クエリを使用します。そのため、データ収集は誰もキーボードを使用していないときに発生する傾向があります。
  • 2. 遠隔操作可能な起動スイッチを取得するスクリプトは、動作する前にデッドドロップから小さな設定を取得します。主なソースは GitHub gist の生の URL (gist.githubusercontent.com/juang55/…/cfg.txt); このスクリプトは、その設定が読み取られた場合にのみアクティブになります。 アクティブ=1要約が利用できない場合は、パブリックゲートウェイ経由で取得した3つのハードコードされたIPFSコンテンツ識別子にフォールバックします。 ゲートウェイ.ピナタクラウド, ipfs.io, cloudflare-ipfs.comこれにより、オペレーターは事後的に武装/解除制御とテイクダウン耐性のあるフォールバックが可能になります。(最小のバリアントは出荷時に crypto-validate-lib, ethウォレットヘルパー, ソラナキーユーティリティ(gistレイヤーが削除され、IPFS識別子のみに依存している。)
  • 3. 財布の中身と秘密を収集する。 スクリプトはユーザーのホームディレクトリを走査します。 ~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.hardhat, ~ / .ssh, デスクトップ/ドキュメント/ダウンロード (スペイン語のフォルダ名を含む)さらに ~/.env シェルrcファイル、および同等のもの AppData Windows 上の場所。イーサリアムの秘密鍵、ビットコイン WIF キー、BIP-39 シードフレーズ、ソラナのキーペア、イーサリアムのキーストア JSON、SSH キー、および秘密情報を含む環境変数をターゲットとしています。より大きなバージョン ( アビエンコード, base58ユーティリティ, eth-dev) は 2048 語の BIP-39 辞書全体を保持し、正規表現を使用して エキス 個々のキーと検証済みのシードフレーズを、読み取ったテキストから取得します。2 つの小型バリアントは、代わりにキーワードでファイルを照合します (シード, ニモニック, 財布, メタマスク, ファントム, 元帳, 振戦、…)そしてファイル全体をアップロードします。
  • 4. 公開されているピンニングサービスを利用して暗号化し、データを外部に持ち出す。 各発見にはホストの指紋が付属しています(ユーザー名@ホスト名プラットフォーム、タイムスタンプ)を取得し、スクリプトに埋め込まれたハードコードされたRSA-4096公開鍵で暗号化します。暗号化されたレコードは、IPFSにピン留めすることでアップロードされます。 api.pinata.cloud/pinning/pinJSONToIPFSハードコードされた Pinata API 認証情報で認証されます。押収できる専用の C2 サーバーはありません。盗まれたデータはパブリックな分散ストレージに保存され、オペレーターは結果として得られるコンテンツハッシュを使用して取得できます。アップロードは数秒のランダムなジッターで間隔を空けて行われ、ローカルログには タイムスタンプ | キータイプ | 返されるハッシュ 保管場所 ~/.cache-db/.node-sync/.sl.
  • 5. 12時間周期で継続的にビーコンを発信する。 第 2 段階では、Linux の cron エントリ、 com.apple.syncd macOS 上で launchd ジョブ、およびスケジュールされたタスク名 WindowsNodeSync Windows では、12 時間ごとに再実行するように設定されています。これは 今とは異なる ドロッパーがインストールするWindowsタスク名(WinNodeSyncどちらも探す価値がある。

タイムライン

これら8つのパッケージは、2026年7月13日と2026年7月14日に立て続けに公開されました。いくつかのパッケージには複数のバージョンが含まれていますが、ドロッパーはバージョン間で同一であり、その上にある無害なユーティリティコードのサイズが変わるにつれて、行のオフセットのみがずれます。

日付 イベント
2026-07-13 クラスター内の最初のパッケージは、1 つのパブリッシャーの下に表示されます (solana-key-utils, eth-wallet-helpers, crypto-validate-lib (残りの初期バージョン)
2026-07-13 → 07-14 残りの名前とフォローアップ版が公開されました。各バージョンに同じドロッパーシップが付加されています。
2026-07-14 8つすべてがフラグ付けされ、分析されました。すべてのパッケージはレジストリからインストール可能です。

この急増に伴い、パブリッシャーのレジストリの評判は、クラスター発生当初はほぼ中立だったものの、検出件数が増加するにつれて著しく悪化した。これは、パッケージがフラグ付けされたことによる目に見える副作用であり、意図的な機能ではない。

侵害の兆候

以下の指標はすべて分析時に存在が確認されました。「第2段階」の表に記載されている指標は、解読によって確認されました。 test/fixtures/keypairs.dat 回復されたデータを読み取って syncd.js.

ファイルとパス

インジケータ 職種
~/.cache-db/.node-sync/syncd.js 復号された第2段階、モード0o700で書き込まれた
~/.cache-db/.node-sync/.sl ローカルデータ漏洩ログ(タイムスタンプ|キータイプ|IPFSハッシュ)
test/fixtures/keypairs.dat Base64エンコードされたペイロードが「テストフィクスチャ」としてtarball内に配置されています。

第2段階のネットワークインフラストラクチャ(syncd.jsから復元)

インジケータ 職種
gist.githubusercontent.com/juang55/b298754cb72942b1cdcf02ccd45cde2f/raw/cfg.txt アクティベーションデッドドロップ。スクリプトは、設定が読み込まれた場合にのみ実行されます。 active=1
Qmcqz3w8j4qFQXDAXAxnrdc2oSX3nzBT4NqtpTqL8mr1ga IPFS設定フォールバック(CID)
QmdTXoqVmTHY1i4ZWLdLkoQ9YChp5TXPh5cWXwnAYZt5iF IPFS設定フォールバック(CID)
QmfJkLU5gdCpqbbqEjWYC2anXW9FmuEeSLLeLiHVJKYUjp IPFS設定フォールバック(CID)
gateway.pinata.cloud, ipfs.io, cloudflare-ipfs.com 設定フォールバックを取得するために使用されるIPFSゲートウェイ
api.pinata.cloud/pinning/pinJSONToIPFS 流出エンドポイント、盗まれたデータはパブリックIPFSに固定される
Pinata APIキー 13c766575b9270a9825dハードコードされたデータ漏洩認証情報

第2段階の収集対象(syncd.jsから取得)

インジケータ 職種
~/.config/solana, ~/.ethereum/keystore, ~/.foundry, ~/.hardhat, ~/.ssh, ~/.envシェルrcファイル 鍵と秘密情報を検索したディレクトリ/ファイル
AppData\Roaming\Solana, AppData\Local\ethereum\keystore Windows版を検索
採取された遺物の種類 ETH秘密鍵、Bitcoin WIF、BIP-39シードフレーズ、Solanaキーペア、EthereumキーストアJSON、SSHキー、秘密環境変数

永続化アーティファクト

Platform インジケータ
Linux cronエントリの起動 syncd.js; crontab でインストールされ、フィルタリングされています grep -v syncd
Windows スケジュールされたタスク WinNodeSync (スポイト)と WindowsNodeSync (第二段階)
macOS launchdラベル com.apple.syncd
事例一覧 第2段階は12時間周期で繰り返される。

行動の

  • 自己呼び出し関数が後に付加されます モジュール.エクスポート、スケジュール setTimeout インポート時に約37,000ミリ秒かかります。
  • 子プロセス spawn(“node”, ) 分離オプションセット付き。
  • 第2段階でのアイドルゲート活性化(エクスプリントアイドル / イオレグ HIDIdleTime / PowerShellのアイドル時間(約15分のしきい値)。
  • RSA-4096暗号化、次にHTTPS POST 公開されているIPFSピンニングAPIへ。

パッケージとバージョン(npm、発行元:solbuilder_io)

パッケージ バージョン
base58-utils 1.0.0、1.0.1、1.0.3
abi-encode 1.0.0、1.0.1、1.0.2
eth-dev 1.0.0、1.0.1、1.0.2
arb-kit 1.0.0、1.0.1
layer2-sdk 1.0.0、1.0.1
solana-key-utils 1.0.0
eth-wallet-helpers 1.0.0
crypto-validate-lib 1.0.0

Publisher

  • solbuilder_io - angel_lopez89[@]proton[.]meメールアドレスが未確認、ソースコード管理アカウントが認証されていない、リポジトリへのリンクがない。

帰属と観察された行動

8 つのパッケージは、1 つのパブリッシャー アカウントと 1 つのペイロードを共有しています。それぞれは、数キロバイトの実際のユーティリティ コードに同じドロッパーが付加された、ごく小さなパッケージで、リンクされたリポジトリなしで、検証されていない使い捨てスタイルの電子メールで公開されています。この均一性、共有のドロップ パス、共有の永続性ラベル、そして共有の keypairs.dat ステージングファイルは、クラスターを繋ぎ合わせる役割を果たします。

これらのパッケージは、自分たちの行動について異例なほど率直だ。 ソラナキーユーティリティ 追加されたブロックを平易な言葉で説明するインラインコメントが含まれています。 ファントム:目に見えない持続性もう一つ(スペイン語)にはこう書かれている。 背景でトポを実行する「バックグラウンドでモグラを実行する」。これらはコード自身の動作に関する注釈です。この投稿のキャンペーン名は、最初のラベルと偽のノード「同期デーモン」から取られています。同期済み)永続化機構が模倣するもの。

コードが実際に行っていることだけを説明します。パッケージ名(すべて暗号、ウォレット、ブロックチェーンツール用語)は、名前でプルする可能性が最も高い開発者層を示していますが、それ自体で発行者が誰であるかを特定するものではありません。第2段階はbase64フィクスチャをデコードすることで完全に復元可能であり、その動作は上記のとおりです。ウォレットキー、シードフレーズ、シークレットを収集し、RSA暗号化してPinata経由でパブリックIPFSストレージに流出します。注目すべき設計上の選択は、プライベートC2サーバーがないことです。構成はGitHub gistとIPFSから取得され、盗まれたデータはコンテンツハッシュでキー付けされたパブリック分散ストレージに保存されます。どちらも、攻撃者が制御する単一のホストよりも奪取が困難です。執筆時点で、このクラスターに一致する以前の公開報告は見つかりませんでした。

誰が暴露されるのか。 これらのパッケージのいずれかを Node プロジェクトに追加し、それをインポートするコードを実行した人は誰でも対象となります。デトネーションはインストール時ではなくインポート時に行われるため、パッケージが存在するだけでは不十分ですが、モジュールをロードする通常の使用であればペイロードに到達します。この誘引名は、Ethereum、Solana、Arbitrum、Layer-2、および一般的なウォレット/エンコード ツール上で構築する開発者をターゲットにしています。これは、第 2 段階で探し出す資産をまさに持っている可能性が最も高い層です。ウォレット キー、シード フレーズ、キー ストア、SSH キー、または .env 機密情報管理者は、それらの認証情報が漏洩したとみなし、定期的に更新する必要があります。

身につけておくべき2つのパターン。 まず、 ペイロードを固定具として使用: 2 番目のステージを、もっともらしい名前のデータ ファイル内に base64 として出荷します (test/fixtures/keypairs.dat) パッケージの目に見えるソースをクリーンに見せ、悪意のあるコンテンツを、レビューツールや人間の目視では不活性データとして扱われることが多いファイルに押し込みます。第二に、 インポート時の遅延実行とクロスプラットフォーム永続化インストールフックからトリガーを外し、タイマーを追加し、cron、スケジュールされたタスク、launchd 全体に継続させることは、自動レジストリスキャンが最も注意深く監視する、ノイズの多いインストールスクリプトの手法から意図的に離れるステップです。

防御担当者および保守担当者向けのガイダンス:

  • 追加されたコードを処理します モジュール.エクスポート レビューの優先事項として――ドロッパーのロジックは、しばしば「実際の」モジュールの表面の下に隠れている。
  • データファイルが不活性であると想定しないでください。 テスト/フィクスチャ/ 実行時に読み込まれ、デコードされるものは実行可能ファイルに隣接しています。実行時にフィクスチャ ファイルの読み取りをフラグ付けします。 演算/評価する/書き込み後-スポーン チェーン。
  • ドロップパスを探す ~/.cache-db/.node-sync/ 持続性ユニットについては WinNodeSync (スケジュールされたタスク) com.apple.syncd これらの名前を取得した開発者マシン上で (launchd) が起動しました。
  • cronエントリ、スケジュールされたタスク、またはlaunchdジョブを作成するNodeプロセスについて警告します。正当なライブラリはインポート時にこのようなことを行うことはほとんどありません。
  • ロックファイルと固定バージョンを優先し、新しい小さな「ユーティリティ」依存関係の差分を確認してください。 依存関係のないパッケージが公開されました リンクされたリポジトリのない、認証されていないアカウントによるものです。

レジストリの防御担当者にとって重要なのは、インストールフックの監視は必要ではあるが十分ではないということだ。データファイル内にステージングされた、インポート時にタイマーで遅延されるドロッパーは、インストール時のみのチェックを通過してしまう可能性があり、永続化ステップは、多くの場合、捕捉すべき最も目立つシグナルとなる。

sca-tools-ソフトウェア構成分析ツール
ソフトウェアのリスクを優先順位付けし、修復し、保護する
無料アカウントを作成しましょう。
いいえ、クレジットカードは必要ありません。

ソフトウェア開発と納品を安全に

Xygeni製品スイートと共に