2025年7月、私は新しいプロジェクトのプロトタイプを作成中で、MikroORMを試してみることにした。ドキュメントには実行方法が記載されていた。 npx mikro-orm-esm 移行のため。だからそうした。
npm ERR! コード E404
npm ERR! 404 見つかりません - GET https://registry.npmjs.org/mikro-orm-esmパッケージが存在しない、おかしいな!すると気づいた:誰かが登録していたら?そうすれば見えたはずなのに:
以下のパッケージをインストールする必要があります:
mikro-orm-esm@1.0.0
続行しますか? (y)ただ打つだけだったのに y誰もがそうする。そしてそのプロンプトには、マルウェアをインストールしようとしているのか、正当なツールをインストールしようとしているのか、何も示されていない。
ドキュメントが存在しないパッケージを指していた。他にどれほどの幻のパッケージ参照が存在するのか? 攻撃者に既に悪用されたものはどれほどあるのか? 私は知る必要があった。
そこで調査を始めた。npmで参照されているパッケージをスキャンするスクリプトを書いた。 READMEスクリプトや台本を書いたが、実際に発表したことは一度もない。数千もの作品を相互参照した。 npx 召喚術。数十個発見。誰よりも先に14個を確保した。その後S1ngularityが発生し、研究は棚上げとなった。
半年後、同じような研究をしているコミュニティのおかげで、自分の研究を思い出した。ついにダウンロード数を確認すると、なんと121,539ダウンロード!
人々は週に何千回も、存在しないコマンドを叩き続けていた。何ヶ月も。その間、パッケージはただそこに置かれたままデータを収集していた。
6か月分のデータ
ダウンロード数は横ばいではなかった。増加した。7月下旬に緩やかに始まり、直近のピークでは1日あたり4,236ダウンロード(2026年1月16日)を記録した。
- 合計:128パッケージで121,539ダウンロード
- 週間平均:3,903
- ピーク日:4,236ダウンロード(2026年1月16日)
ノイズに関する補足: パッケージの新バージョンを公開するたびに、セキュリティスキャナーやミラーサイトから自動的に60~100回のダウンロードが発生します。これがノイズ 。複数バージョンを持つパッケージはノイズ 蓄積します。この閾値を常に上回る数値が実際の使用状況です。
12月下旬の落ち込みに気づいた? 休暇だ。幽霊のようなパッケージダウンロードさえクリスマスは休みを取る。
ビッグスリー
3つのパッケージが全ダウンロードの79%を占めています:
openapi-generator-cli: 48,356 ダウンロード (実際のパッケージ: @openapitools/openapi-generator-cli)cucumber-js: 32,110 ダウンロード (実際のパッケージ:@cucumber/cucumber)デプクルーズ: 15,637 ダウンロード (実際のパッケージ:依存関係巡航者)
openapi-generator-cli 過去7日間だけで3,994回のダウンロードがありました。これは、存在しないコマンドを実行しようとした試みが1週間でほぼ4,000回あったことを意味します。
ロングテール
ダウンロード数が著しい残りのパッケージ:
jsdoc2md: 4,641 ダウンロードgRPCツール・ノードプロトコル: 4,518 ダウンロードビュー・デミ・スイッチ: 1,166 ダウンロードスタイルガイド: 805 ダウンロードマイクロORM-ESM: 314回のダウンロードpvbase64: 142回のダウンロードクロムウェル: 106回のダウンロード
バージョンごとのダウンロードベースラインが60~100だったのを覚えていますか?3つのバージョンを持つパッケージの場合、純粋なノイズとして180~300のダウンロードが発生する可能性があります。 ファシム 合計83回のダウンロードは、おそらく全てノイズでしょう。しかし マイクロORM-ESM 314回も?複数のバージョンを考慮しても、それは実際の試行回数だ。
スタイルガイド 805回のダウンロードは、数百回の実行を意味します。CI/CD 繰り返しCI/CD 可能性もあれば、数十人の異なる開発者がCI/CD 可能性もあります。いずれにせよ、存在すべきでないパッケージが実際に使用されている事実です。
これらの発見の経緯
完全なnpmレジストリミラーを運営しています Aikidoでフルnpmレジストリミラーを運営しています。毎秒パースされています。 package.json そして README レジストリ全体にわたって。抽出済み npx コマンド。実際に登録されている内容との照合を実施。さらにGitHubのコード検索を活用し、これらのファントムコマンドが実環境(ドキュメント、CI設定、スクリプトなど開発者が参照する可能性のあるあらゆる場所)でどれほど広く出現しているかを調査した。
各パッケージにつき3つのデータポイント:
- レジストリ参照: どのくらいの数のnpmパッケージが、そのpackage.jsonまたはREADMEでこのコマンドに言及しているか
- GitHubの結果: GitHub上でこのコマンドを参照しているコードファイルまたはリポジトリの数
- ダウンロード数:実際に実行を試みた回数
2025年7月に14件を申請しました。1月に研究を再開した際、分析範囲を拡大したところさらに多くの事例を発見しました。現時点で合計128件のパッケージを申請済みです。
注目すべきパターン:
主な攻撃ベクトル(1万回以上のダウンロード): openapi-generator-cli, cucumber-js、および デプクルーズ NPM参照、GitHub言及、実際のダウンロード数にはすべて強い相関関係が認められる。これらが攻撃者の手に渡れば壊滅的な被害をもたらすだろう。
露出は高いが、コンバージョンは低い: スタイルガイド 246件のnpm参照と286件のGitHub検索結果があるが、ダウンロード数はわずか805件である。 gitスクリプト-プッシュ前 126件の参照があるが、ダウンロードはわずか93件。認知度と実行力は必ずしも一致しない。
ドキュメント専用ベクター: マイクロ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は類似性エラーで拒否しました。例えば以下のような名前です: rsビルド, ビュードック, napi, t-ci 既存のパッケージとあまりにも似通っていた。それは良いことだ。つまりnpmが明らかな先取り行為を積極的に阻止している証拠だ。
しかし、これらのファントムコマンドはタイプミスではない。そもそも登録されたことのない名前なのだ。npmの類似性チェックはそれらを捕捉しない。なぜなら「類似する対象」が存在しないからだ。
すべきこと
npx --no-install を使用する
npx --no-install あなたのコマンドこれによりnpxはローカルバイナリのみを使用するよう強制されます。レジストリへのフォールバックはありません。インストールされていない場合、失敗します。これが望ましい動作です。
CLIツールを明示的にインストールする。 頼るな npx それらを取りに行くために:
{
"devDependencies": {
"@openapitools/openapi-generator-cli": "^2.7.0"
}
}
実行前に確認してください。 ドキュメントには実行するように記載されている npx 何か?まずパッケージが実際に存在するかどうかを確認してください。正しいものかどうかを確認してください。特にCI/CDでは。
名前空間を確保しましょう。CLIツールを管理しているなら、明らかな別名やスペルミスを登録してください。悪意のある第三者に先を越されるのを防ぐ、安価な保険です。
影響を受けているかどうかの見分け方
もしあなたが Aikido ユーザーの方は、中央フィードとマルウェア問題のフィルターを確認してください。ファントムパッケージの脆弱性は、フィード上で100/100の重大な問題として表示されます。 Aikido はリポジトリを毎晩再スキャンしますが、完全な再スキャンも手動で実行することを推奨します。
まだ Aikido ユーザーでない場合は、 無料アカウントを作成し、リポジトリを接続してください。当社の独自マルウェア対策は無料プランに含まれています(クレジットカード不要)。
将来の保護のため、npm、npx、yarn、pnpm の安全なラッパーである Aikido (オープンソース)の使用をご検討ください。SafeChain は現在のワークフローに組み込まれ、パッケージインストールコマンドをインターセプトし、パッケージを検証します。 Aikido Intel(当社のオープンソース脅威インテリジェンス)に対して検証します。脅威をゲートで阻止します。
数学
7か月間で121,539回のダウンロード。平均週3,903回。1日あたり最大4,236回。合計128パッケージの請求(7月に14件、残りは1月に)。
npmエコシステムには数百万のパッケージが存在します。開発者は毎日何千回もnpxコマンドを実行します。「便利なデフォルト」と「任意のコード実行」の間の隔たりは、未登録のパッケージ名一つに過ぎません。
今すぐソフトウェアを保護します。




