注目

脅威動向 / THREAT / SUPPLY CHAIN

npmに約800個の悪性パッケージ — require()で読み込んだ瞬間に始まる「WEL1DROPPER」感染

ライフサイクルフックを一切使わないのに、import/requireしただけで実行されるダウンローダー。Windows・macOS・Linuxすべてにペイロードを届けるこのキャンペーンの仕組みと、サプライチェーン対策の要点を整理する。

2026年8月上旬、npmレジストリに約800個の悪性パッケージが公開され、Windows・macOS・Linux向けのRAT(遠隔操作ツール)と情報窃取マルウェアを配布するキャンペーンが確認された。検出したOpenSourceMalwareの研究者Paul McCartyによると、パッケージ名はAIスロップスクワッティング(AI生成風のランダムなタイポスクワッティング)で、すべて同じペイロードを届ける。Sonatypeはこのキャンペーンを「Flooding Dropper」として追跡している。

WEL1DROPPERキャンペーンの概念図(出典: OpenSourceMalware)
図1:WEL1DROPPERキャンペーンの概要。原典(OpenSourceMalware Blog)

フックなしで実行される仕掛け

これまでのnpmを狙ったサプライチェーン攻撃の多くは、preinstallpostinstallといったライフサイクルフックを使って悪性コードを実行してきた。今回のパッケージはフックを一切使わない。代わりに、READMEに「このライブラリを require() で読み込んでください」と書いて開発者自身に実行させさせる。

例として分析された checkout-mobile-bnpl(モバイルSDKを装うBNPL=後払い決済風のパッケージ)では、index.js の末尾に次のようなコードが仕込まれていた。

module.exports = { CheckoutMobileBnpl, create: (opts) => new CheckoutMobileBnpl(opts), VERSION };
try { require("./_helpers"); } catch (_) {}

最後の行が _helpers.js を読み込み、その中の run() が即座に実行される。開発者がSDKを初期化したり、怪しいメソッドを呼んだりする必要はない。importした瞬間に感染が始まる。これは「インストールスクリプトの監査だけでは防げない」ことを示す典型的な例だ。

ダウンローダーWEL1DROPPERの動き

読み込まれると、ダウンローダーのWEL1DROPPERが次の流れで動作する。

  1. 環境の判別 — ホストOSとCPUアーキテクチャを特定し、ペイロードの取得先を切り替える(Linux x64は/pkg/package、Linux ARM64は/pkg/package-arm64、macOSは/pkg/loader_mac、Windowsは/pkg/package.exe
  2. HTTPSでの取得 — 攻撃者管理下の3つのCloudflare Workersホスト(oob-worker.cf103-070cf102-bafcf99-9b3.workers[.]dev)を順に試す。IPv4強制、15秒のタイムアウト、node-fetch/2.6のUser-Agentを使う
  3. DNS TXTフォールバック — HTTPSでの取得に失敗すると、wel1[.]ru のDNS TXTレコードからペイロードを復元する。TXTレコードの数を1〜2,000の範囲で受け取り、番号付きレコードを結合してBase64デコードする
  4. 実行 — 取得したペイロードを一時フォルダに書き出し、Linux/macOSでは/bin/sh、Windowsではcmd.exeで実行する

Cloudflare Workersのドメインを3つローテーションしている点と、DNS TXTという第2の配布経路を持っている点が、防御を難しくしている。HTTPS側をブロックしても、TXTレコード経由で同じ実行ファイルが届くからだ。

OSごとのペイロードと永続化

最終ステージの挙動はOSごとに異なる。

  • Windows — Event Tracing for Windows(ETW)とAntimalware Scan Interface(AMSI)をパッチして監視を妨害し、サンドボックスや仮想環境の検知を行ったうえで、レジストリのRunキーとスケジュールタスクで永続化する。暗号化された/pkg/update_win.exeを追加取得して実行する
  • macOS — デバッガや解析環境の痕跡を探した後、/pkg/beacon_mac.binを取得し、LaunchAgentで永続化して分離プロセスとして起動する。失敗時はDNS TXT経由の配布に切り替える
  • Linux — UPXパックされたELFバイナリで、Cloudflare WorkersのURLから補助ペイロードを取得し、最終的にオープンソースのC2フレームワークSliverへ接続する

また、パッケージにはlib/telemetry.jsという、それらしいテレメトリSDKを装ったファイルも含まれている。エントリポイントからは読み込まれず、追加の固定インフラも含まれていない。「一見するとネイティブのプロファイリングや分析機能に見せかけて、素早いレビューをすり抜けるためのノイズ混入」が目的だとMcCartyは分析している。

標的と背景

macOSペイロードに含まれるtcsbank[.]rucloudpayments[.]ruといったドメインは、ロシアの金融機関とモバイル決済サービスを示唆しており、ロシア国内の金融機関を標的にしている可能性がある。また、このキャンペーンは、4月に観測された依存関係混乱(dependency confusion)型のキャンペーンMoika(250以上のパッケージで環境情報を窃取し、OS別の第2ステージを配布)の進化形とみられている。

対策 — 依存関係を「実行されるもの」として扱う

今回のキャンペーンが示すのは、npmパッケージの悪性コードはインストール時にだけ動くわけではない、ということだ。依存関係の監査と実行時の両面で対策が必要になる。

  • 依存関係の自動監査npm audit やOSVスキャナーをCIに組み込み、新規依存の追加時に悪性パッケージの指標(不自然なパッケージ名、短期間の大量公開、メンテナの新規性)を確認する
  • タイポスクワッティングへの警戒 — よく使うパッケージ名の綴り違いを意図的にチェックする。AI生成風のランダム名は、そもそも「既知のパッケージを装っていない」点に注意する
  • 実行時の検知require()だけで動くため、開発・テスト・本番の起動時にも実行される。プロセス起動の監視、workers.devへの異常な通信、DNS TXTレコードの大量取得などにアラートを張る
  • 検証の仕組み — 未知のパッケージの読み込みをポリシーで制限する(社内レジストリのプロキシ利用や、署名・ハッシュの固定など)

依存関係は「インストールすれば終わり」ではない。importした瞬間から、そのコードはあなたのプロセス内で動いている。サプライチェーン対策は、インストール時点の検査と実行時点の監視の両方が要る。

出典: The Hacker News — Nearly 800 Malicious npm Packages Deliver Cross-Platform RAT and Infostealer / OpenSourceMalware — Russian AI Slopsquatting Publishes 700+ Malicious NPM Packages / Unit 42 — 公開IOC(GitHub)

この記事は、公開情報と編集部の調査・知見をもとに構成しています。内容は公開時点の情報に基づく解説であり、個別の環境への診断・対応を保証するものではありません。重要な判断では、記事内の出典や各提供元の最新情報もご確認ください。