2025年7月、私は新しいプロジェクトのプロトタイプを作成しており、MikroORMを試すことにしました。ドキュメントには、以下を実行するよう記載されていました。 npx mikro-orm-esm マイグレーションのために。そこで、私は実行しました。
npm ERR! code E404
npm ERR! 404 Not Found - GET https://registry.npmjs.org/mikro-orm-esmパッケージが存在しない、これはおかしい!その時、ふと気づきました。もし誰かがこれを登録していたらどうなるだろうか?私はこう見ていたでしょう:
Need to install the following packages:
mikro-orm-esm@1.0.0
Ok to proceed? (y)私はただ入力していたでしょう y。誰もがそうします。そして、そのプロンプトには、マルウェアをインストールしようとしているのか、それとも正規のツールをインストールしようとしているのかを教えてくれるものは何もありません。
ドキュメントは存在しないパッケージを指していました。他にどれくらいのファントムパッケージ参照が存在しているのでしょうか?どれくらいがすでに攻撃者によって登録されているのでしょうか?私はそれを知る必要がありました。
そこで私は調査を開始しました。npmをスキャンし、参照されているパッケージを探すスクリプトを作成しました。 READMEやスクリプト内で参照されているものの、実際には公開されていないパッケージを。 npx の呼び出しを相互参照しました。数十個を発見しました。他の誰かが登録する前に、そのうち14個を登録しました。その後、S1ngularityが発生し、この研究は棚上げされました。
6ヶ月後、同様の調査を行っているコミュニティのおかげで、自分の研究を思い出しました。私はついにダウンロード数を確認しました。121,539件のダウンロードです!
人々はこれらの存在しないコマンドを週に何千回も実行していました。数ヶ月間も。その間、パッケージはただデータを収集していました。
6ヶ月間のデータ
ダウンロード数は横ばいではありませんでした。増加しました。7月下旬にゆっくりと始まりました。最近のピークは、1日(2026年1月16日)で4,236件のダウンロードを記録しました。
- 合計: 128パッケージで121,539ダウンロード
- 週平均: 3,903
- ピーク日: 4,236ダウンロード (2026年1月16日)
ノイズに関する簡単な注意点:パッケージの新しいバージョンを公開するたびに、セキュリティスキャナーやミラーから自動的に60〜100ダウンロードされます。これがリリースごとのベースラインノイズです。複数のバージョンを持つパッケージはノイズが急速に蓄積されます。そのしきい値を一貫して超えるものは、実際の利用と見なされます。
12月下旬頃の落ち込みにお気づきでしょうか?ホリデー期間です。仮想的なパッケージダウンロードでさえ、クリスマスは休みを取ります。
主要3パッケージ
3つのパッケージが全ダウンロードの79%を占めています:
openapi-generator-cli: 48,356ダウンロード (実際のパッケージ: @openapitools/openapi-generator-cli)cucumber-js: 32,110ダウンロード (実際のパッケージ:@cucumber/cucumber)depcruise: 15,637 ダウンロード (実際のパッケージ:dependency-cruiser)
openapi-generator-cli わずか過去7日間で3,994件のダウンロードを記録しました。これは、存在しないコマンドを実行しようとした回数が約4,000回に上ることを意味します。わずか1週間で。
ロングテール
ダウンロード数の多い残りのパッケージ:
jsdoc2md: 4,641 ダウンロードgrpc_tools_node_protoc: 4,518 ダウンロードvue-demi-switch: 1,166 ダウンロードstyleguidist: 805 ダウンロードmikro-orm-esm: 314 ダウンロードpvbase64: 142 ダウンロードcromwell:106ダウンロード
バージョンごとの60~100ダウンロードという基準を覚えていますか?3つのバージョンを持つパッケージは、純粋なノイズとして180~300件のダウンロードを持つ可能性があります。 fathym 合計83ダウンロードでは、おそらくすべてノイズです。しかし、 mikro-orm-esm 314件ではどうでしょうか?複数のバージョンを考慮しても、それは実際の試行です。
styleguidist 805ダウンロードでは、数百件の実際の実行を意味します。CI/CDが繰り返しアクセスしている可能性があります。数十人の異なる開発者が使用している可能性もあります。いずれにせよ、それは存在すべきではないパッケージの実際の使用状況です。
これらをどのように発見したか
Aikidoでは、完全なnpmレジストリミラーを運用しています。すべての package.json そして README レジストリ全体で。抽出しました。 npx コマンドを。実際に登録されているものと相互参照しました。また、GitHubのコード検索で、これらのファントムコマンドがドキュメント、CI設定、スクリプトなど、開発者が参照する可能性のあるあらゆる場所でどれほど広く出現しているかを調査しました。
各パッケージの3つのデータポイント:
- レジストリ参照:このコマンドをpackage.jsonまたはREADMEで言及しているnpmパッケージの数
- GitHub結果:GitHub上でこのコマンドを参照しているコードファイルまたはリポジトリの数
- ダウンロード数:実際に実行しようとした回数
2025年7月に14件を特定しました。1月に調査を再開した際、分析を拡大し、さらに多くのパッケージを発見しました。現時点で、合計128件のパッケージを特定しています。
注目すべきパターンがいくつかあります:
主要な攻撃ベクトル (10,000以上のダウンロード): openapi-generator-cli, cucumber-js、および depcruise これらはすべて、npm参照、GitHubでの言及、実際のダウンロードの間に強い相関関係を示しています。攻撃者の手に渡れば、壊滅的な影響をもたらす可能性があります。
高い露出度、低いコンバージョン: styleguidist npm参照が246件、GitHubの結果が286件ありますが、ダウンロード数はわずか805件です。 git-scripts-pre-push 126件の参照数に対して、ダウンロード数はわずか93件です。可視性が必ずしも実行につながるとは限りません。
ドキュメントのみのベクトル: mikro-orm-esm npmパッケージ参照はゼロですが、GitHubの結果は80件、ダウンロード数は314件です。これは、npmエコシステムの参照がなくても、ドキュメントだけで数百件のインストールを促進できることの証拠です。
これが危険な理由
攻撃は単純です。
攻撃者はパッケージを登録します。そして、 postinstall 環境変数を外部に持ち出すスクリプトを追加します。npmトークン、クラウド認証情報、APIキー、その他そこにあるものすべてです。そして待ちます。
ピーク時には、週あたり約4,000台のマシンが侵害される可能性があります。開発者のワークステーション、CIサーバー、ビルド環境などが含まれます。その多くは、環境変数に認証情報が設定された状態で実行されている可能性があります。フィッシングは不要で、既存パッケージのサプライチェーン侵害もありません。名前を登録し、npxが犠牲者をもたらすのを待つだけです。
誰かがコマンドを実行すると、次のように表示されます:
以下のパッケージをインストールする必要があります:
openapi-generator-cli@1.0.0
続行しますか? (y)このプロンプトは、誰がいつ公開したか、またそれが探しているものかどうかを表示しません。正当なツールに対してもこのプロンプトが頻繁に表示されるため、人間は筋肉の記憶に頼って入力してしまうことがあります。 y誰もがそうするように。それだけです。攻撃はこれだけです。
複数回のラウンドで128のギャップを解消しました。最悪のケースは捕捉しましたが、数千に及ぶロングテールが存在します。
npmの保護機能に関する注意点
npmにはタイポスクワッティング対策があります。特定の名称を登録しようとした際、npmは類似性エラーでそれらを拒否しました。次のような名称は rsbuild, vuedoc, napi, t-ci 既存のパッケージに酷似していました。これは良いことです。npmが明らかなスクワッティングの試みを積極的にブロックしていることを意味します。
しかし、これらのファントムコマンドはタイプミスではありません。それらはそもそも登録されていない名称です。npmの類似性チェックは、「類似するもの」が存在しないため、これらを捕捉しません。
実施すべきこと
npx --no-install を使用する
npx --no-install your-commandこれにより、npxはローカルバイナリのみを使用するよう強制されます。レジストリへのフォールバックはありません。インストールされていない場合、失敗します。これが望ましい動作です。
CLIツールを明示的にインストールする。 に依存しないでください npx をフェッチするために:
{
"devDependencies": {
"@openapitools/openapi-generator-cli": "^2.7.0"
}
}
実行前に検証する。 ドキュメントに実行するよう記載されている場合 npx 何か?まず、パッケージが実際に存在するか確認してください。正しいものであることを確認してください。特にCI/CD環境では。
自身のネームスペースを確保する。 CLIツールを管理している場合、明らかなエイリアスやスペルミスを登録してください。他者が悪意を持ってそれを行うことに対する安価な保険となります。
影響を受けているかを確認する方法
Aikidoユーザーの場合、中央フィードを確認し、マルウェアの問題でフィルタリングしてください。ファントムパッケージの脆弱性は、フィード内で100/100の重大な問題として表示されます。Aikidoはリポジトリを毎晩再スキャンしますが、完全な再スキャンもトリガーすることをお勧めします。
まだAikidoユーザーでない場合は、無料アカウントを設定し、リポジトリを接続してください。当社の独自のマルウェアカバレッジは無料プランに含まれています(クレジットカードは不要です)。
将来的な保護のために、Aikido SafeChain(オープンソース)の利用をご検討ください。これはnpm、npx、yarn、pnpm用のセキュアなラッパーです。SafeChainは現在のワークフローに組み込まれ、パッケージのインストールコマンドを傍受し、マシンに到達する前にAikido Intel(当社のオープンソース脅威インテリジェンス)に対してパッケージを検証します。脅威を入り口で阻止します。
その数字
7ヶ月で121,539ダウンロード。週平均3,903。1日あたりのピークは4,236。合計128パッケージがクレームされました(7月に14、残りは1月に)。
npmエコシステムには数百万のパッケージが存在します。開発者は毎日何千回もnpxコマンドを実行します。「便利なデフォルト」と「任意のコード実行」の間のギャップは、未クレームのパッケージ名一つに過ぎません。

