npm PyPI 偽装パッケージ 決済SDKの事件が2026年7月に発覚した。決済ブランドPaysafe・Skrill・Netellerの正規SDKを装ったnpm13種・PyPI4種、計17個の悪意あるパッケージが同一キャンペーンとして公開され、Socket.devの自動スキャナが公開からわずか約6分で検出した。狙われたのは環境変数に置かれたAPIキーやトークンで、収集したデータはXOR→文字コード減算→文字列反転という3段階デコードで復元したC2ドメインへ送信される。本記事では手口の全体像と、自分のプロジェクトに該当パッケージが混入していないかを確認する手順を整理する。

偽装SDK導入からC2接続までの4段階。導入で正規SDKと誤認、環境変数収集、3段階デコード、ngrok-free.devのC2へ外部送信
攻撃の4段階。検出までは公開から約6分だった(出典: Socket.dev
30秒でわかる Paysafe/Skrill/Neteller偽装パッケージ事件
  • 何が起きたか:2026年7月7日、決済ブランドPaysafe・Skrill・Netellerを偽装したnpm13種・PyPI4種、計17個の悪意あるパッケージが公開された。
  • 検出の速さ:Socket.devの自動スキャナが公開から約6分で悪意あるコードとして検出。
  • 手口:環境変数(KEY/SECRET/TOKEN等)を収集し、XOR→文字コード減算→文字列反転の3段階デコードで復元したC2ドメインへ送信する。
  • バージョンの体裁:npm側は各パッケージ4バージョン(1.0.0〜1.0.3)を連続公開、PyPI側は各1バージョン(1.0.0)のみ。いずれも「正式リリース」を装う体裁になっている。
  • 継続する攻撃トレンド:2026年7月10日〜17日には別キャンペーンを含め145件以上の悪意あるパッケージがnpm/PyPI全体で確認されており、本件は単発ではなく継続するタイポスクワッティング攻撃の一部。

npm/PyPIのブランドスクワット攻撃はここ数年繰り返し発生している。攻撃手法・防御ツールの全体像は サプライチェーンセキュリティ2026|攻撃手法・防御ツール・実践チェックリスト にまとめている。

タイムラインと全体像——npm13種・PyPI4種、計17個が7月7日に公開

一次ソースであるSocket.devのブログによれば、本キャンペーンは決済処理・送金サービスとして知られるPaysafe・Skrill・Netellerのブランド名を利用したタイポスクワッティング攻撃で、npm・PyPIの2つのレジストリにまたがって展開された。

項目
攻撃対象パッケージ数 npm 13種+PyPI 4種=計17個
公開日 2026年7月7日
検出までの時間 公開から約6分(Socket.devの自動スキャナ)
npm側のバージョン展開 各パッケージ4バージョン(1.0.0〜1.0.3)を連続公開
PyPI側のバージョン展開 各1バージョン(1.0.0)のみ
開発元・攻撃者の帰属 不明(一次ソースに記載なし・未確認)

開発元・攻撃者の身元については、一次ソースに帰属情報の記載がなく本記事執筆時点では未確認である。断定はせず、確認できた事実のみを以下で整理する。

パッケージのバージョンがすべて 1.0.01.0.3 の体裁を取っている点は見落とされやすいが重要だ。バージョン番号だけを見ると「すでに一定の実績を積んだ正式リリース」に見えてしまう。新規パッケージが 0.0.1 のようなプレリリース番号から始まることが多いのに対し、本件はいきなり 1.0.0 を名乗ることで信頼性を偽装している。

手口の中心:環境変数を集めて3段階デコードでC2ドメインを復元する

本キャンペーンの技術的な特徴は、C2(コマンド&コントロール)サーバーのドメインをコード中に平文で書かず、3段階のデコード処理で実行時に復元する点にある。

  1. XORデコード — 難読化された文字列をXOR演算で復号する
  2. 文字コード減算 — 得られた文字列の各文字コードから一定値を減算する
  3. 文字列反転 — 減算後の文字列を反転させ、最終的なC2ドメイン文字列を得る

この3段階を経て初めて caliber-spinner-finishing.ngrok-free.dev というホスト名が組み立てられる。静的解析でパッケージのソースをそのまま眺めても、この文字列は現れない。ngrok-free.devという無料のトンネリングサービスのドメインを使っている点も特徴で、攻撃者は自前のサーバーを用意せずにC2インフラを立てられる。

本文中のC2ドメインはリンク化していません
caliber-spinner-finishing.ngrok-free.dev はブリーフ作成時点で一次ソースに記載された実際のホスト名。読者が誤ってアクセスしないよう、本記事では平文表記のみに留めている。

収集対象となる環境変数は、一次ソースの記述に基づけばKEY・SECRET・TOKENといった名前を含む変数群である。決済SDKという体裁のパッケージをnpm install / pip install した瞬間から、アプリケーションやCI/CDの環境変数がスキャンされる可能性がある。

サンドボックス回避の仕組み——CPU数チェックとホスト名・ユーザー名のパターンマッチ

本キャンペーンのパッケージは、セキュリティ研究者による動的解析環境を検知して動作を止める仕組みも備えている。一次ソースに明記されている範囲で、確認できているのは次の2点だ。

  • CPU数のチェック — 実行環境のCPUコア数が一定数(2未満)であれば、解析用のサンドボックスやコンテナと判断して処理を中断する
  • ホスト名・ユーザー名のパターンマッチ — 既知の解析環境で使われがちなホスト名・ユーザー名のパターンと一致すれば、同様に処理を中断する
flowchart TD A["postinstall / import時に実行開始"] --> B{"CPU数が2未満か?"} B -- "はい" --> Z["実行を中断
サンドボックス回避"] B -- "いいえ" --> C{"hostname / usernameが
既知の解析環境パターンと一致するか"} C -- "はい" --> Z C -- "いいえ" --> D["環境変数の収集を開始"] D --> E["3段階デコードでC2ドメインを復元"] E --> F["収集データをC2へ送信"]

この2点はあくまで一次ソースに明記された事実であり、これをもって「検出を完全に回避できる」わけではない。実際、本件はSocket.devの自動スキャナによって公開から約6分で検出されている。サンドボックス回避策があっても、静的解析ベースの検出網までは回避できなかった、というのが実際の結果だ。

npm・PyPI対象パッケージ一覧——同名パッケージが両レジストリに存在する罠

対象パッケージはnpm側13種、PyPI側4種の計17種類。特に注意が必要なのは、paysafe-api という同じ名前のパッケージがnpmとPyPI両方に別々に存在する点だ。どちらのレジストリを使っているかに関わらず、両方のリストを確認する必要がある。

npm13種とPyPI4種の対象パッケージ一覧の比較。npmは各パッケージ4バージョンを連続公開、PyPIは各1バージョンのみ
npm側とPyPI側でパッケージ公開の粒度が異なる(出典: Socket.dev一次ブログのパッケージ名一覧)
レジストリ パッケージ名 公開バージョン
npm paysafe-checkout 1.0.0〜1.0.3
npm paysafe-vault 1.0.0〜1.0.3
npm paysafe-js 1.0.0〜1.0.3
npm paysafe-api 1.0.0〜1.0.3
npm paysafe-node 1.0.0〜1.0.3
npm paysafe-cards 1.0.0〜1.0.3
npm paysafe-fraud 1.0.0〜1.0.3
npm paysafe-kyc 1.0.0〜1.0.3
npm paysafe-payments 1.0.0〜1.0.3
npm neteller 1.0.0〜1.0.3
npm skrill 1.0.0〜1.0.3
npm skrill-sdk 1.0.0〜1.0.3
npm skrill-payments 1.0.0〜1.0.3
PyPI paysafe-kyc 1.0.0のみ
PyPI paysafe-payments 1.0.0のみ
PyPI paysafe-sdk 1.0.0のみ
PyPI paysafe-api 1.0.0のみ

影響を受ける対象範囲は、上記いずれかのパッケージ名を package-lock.json / requirements.txt 等の依存関係定義、またはインストール済みの node_modules / Pythonの site-packages に持っている環境である。Paysafe・Skrill・Netellerは実在する決済ブランドであり、開発者がこれらの名前を見て正規SDKと誤認しやすい点が本件の実害につながっている。

決済SDKはなぜ狙われたか——継続するnpm/PyPI偽装キャンペーンの中の位置づけ

決済SDKという標的カテゴリは、当サイトがこれまで扱ってきたブランドスクワット事件とは毛色が異なる。過去に扱った類似の攻撃キャンペーンと並べると、標的ブランドの選び方に一貫した傾向が見える。

攻撃キャンペーン 標的レジストリ パッケージ数(確認済み) 特徴
本件(Paysafe/Skrill/Neteller偽装) npm 13種+PyPI 4種 計17(Socket.dev一次ソース) 決済SDKブランドを狙ったタイポスクワッティング。3段階デコードによるC2隠蔽が特徴
偽TanStackパッケージが.env窃取|npmブランドスクワット攻撃の全容と緊急対策 npm 未確認(既報記事側の数値を参照) 開発フレームワークブランドの偽装。.env窃取が主眼
TrapDoor|npm・PyPI・Crates.io横断34パッケージ384バージョンのクリプト窃取サプライチェーン攻撃 npm・PyPI・Crates.io 34パッケージ384バージョン(既報記事の数値) クリプト資産窃取が主眼。マルチレジストリ横断という点で本件よりスケールが大きい
@antv npmに不正コード混入|Mini Shai-HuludがAnt Design可視化323パッケージを22分で汚染 npm 323パッケージ(既報記事の数値) 正規パッケージへの不正コード混入型。公開後22分で汚染が広がった

TanStack・antvは開発フレームワークやUIライブラリのブランドを狙った。TrapDoorはクリプト資産窃取を主眼に複数レジストリを横断した。それに対し本件は、決済処理・送金という「開発者が特に警戒すべきカテゴリ」が標的にされている点で新しい。決済SDKは環境変数にAPIキー・シークレットキーを持つことが前提の構成が多く、攻撃者から見れば「価値の高いシークレットが集まりやすい標的」と言える。

なお、2026年7月10日〜17日の期間には、本件を含む複数のキャンペーン(別途 bingo-ai 等)で145件以上の悪意あるパッケージがnpm/PyPI全体で確認されている。この145件以上という数字は期間全体の集計値であり、本件単体の17件とは別の数字であることに注意が必要だ。両者を混同すると規模感を見誤る。決済SDK偽装は、この期間に継続していた攻撃トレンドの一部として理解するのが正確な位置づけになる。

自分の環境を確認する——lockfileとCI/CDログの点検コマンド

実際に悪意あるパッケージをインストールする必要はない。依存関係の監査コマンドのみで、自分のプロジェクトが該当していないかを確認できる。

# package-lock.json / requirements.txt 等に該当パッケージ名が無いかを確認する
grep -riE "paysafe-(checkout|vault|js|api|node|cards|fraud|kyc|payments)|neteller|skrill(-sdk|-payments)?" package-lock.json 2>/dev/null
pip freeze | grep -iE "paysafe-(kyc|payments|sdk|api)"

# 該当ドメインへの通信履歴(CI/CDログ等)にngrok-free.dev宛のアウトバウンドが無いか確認
grep -i "ngrok-free.dev" /var/log/ci/*.log 2>/dev/null

上記のgrepでヒットが無ければ、少なくとも現時点でその環境に該当パッケージが含まれていないことを確認できたことになる(陰性確認)。ヒットがあった場合は、即座にシークレットのローテーションが必要——AWSキー、DB接続情報、決済処理に関わるAPIキー、CI/CDに登録されたシークレット全般が対象になる。

対策として実務上できることは3点ある。

  • パッケージ名は必ず公式ドキュメントからコピー&ペーストする——npm search paysafe 等で一覧を見ても、パッケージ名が正規SDK名と酷似しているため一見して偽物と判別しにくい。検索結果から名前で選ばない運用に切り替える
  • 依存関係インストール前にレジストリのメタデータを確認する——公開日が極端に新しい、README・リポジトリリンクが存在しない、といった不審な兆候がないかを見る
  • Socket / Aikido / Snyk等のサプライチェーン監視ツールをCIに組み込む——本件はこの種のツールによって公開から約6分で検出されている。同種のスキャナを自分のパイプラインにも組み込むことが、次の同様のキャンペーンへの実効的な備えになる

決済ブランドに限らず、開発者が信頼しがちな「業界の有名ブランド名」を騙るタイポスクワッティングは今後も続く可能性が高い。パッケージ名を目で見て信頼するのではなく、公式ドキュメントの記載と一致しているかを機械的に確認する習慣が、最も確実な防御線になる。

読者の3つの問いへの答え
何が起きたか:決済ブランドPaysafe/Skrill/Netellerを偽装したnpm/PyPIパッケージ17個が公開され、約6分で検出された。 ② 何を狙っているか:環境変数のAPIキー・シークレットを収集し、3段階デコードで復元したC2ドメインへ送信する。 ③ 何をすればよいか:本文のgrepコマンドで自分の依存関係を点検し、該当があれば即シークレットをローテーションする。

参照ソース

Socket.dev — Coordinated npm and PyPI Campaign Typosquats Popular Secure Payment Apps — パッケージ名一覧・攻撃手法・難読化手口の一次情報
GBHackers — npm and PyPI Malware Campaign Exfiltrates CI/CD Secrets Through Fake Payment SDKs — CI/CDシークレット窃取の観点からの解説
Cyberpress — Malicious npm and PyPI Packages Target Payment Developers With Fake SDK Facades — 攻撃対象パッケージの追加解説