Aikido

npxの混乱:自身の名前を主張し忘れたパッケージたち

Charlie EriksenCharlie Eriksen
|
#
#
#

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日)を記録した。

7か月間で121,539ダウンロード
128個のファントムNPXパッケージ、2025年7月から2026年1月
121,539
総ダウンロード数
3,903
週間平均
4,236
ピーク日(1月16日)
4K 3K 2K 1K 🎄 ホリデーディップ ピーク: 4,236 7月 8月 9月 10月 11月 12月 1月
週間ダウンロード数は2025年7月から2026年1月にかけて着実に増加した
  • 合計: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 ダウンロード (実際のパッケージ: 依存関係巡航者)
ビッグスリー:全トラフィックの79%
121,539件の総ダウンロードのうち、96,103件が3つのファントムパッケージによるものである
openapi-generator-cli → actual:@openapitools/openapi-generator-cli
48,356
23 npm refs650件のGitHub検索結果3,994件(過去7日間)
cucumber-js → 実際:@cucumber/cucumber
32,110
28 npm refs856件のGitHub検索結果
依存関係巡航 → 実際:依存関係巡航艦
15,637
27 npm refs836件のGitHub検索結果

openapi-generator-cli 過去7日間だけで3,994回のダウンロードがありました。これは、存在しないコマンドを実行しようとした試みが1週間でほぼ4,000回あったことを意味します。

ロングテール

ダウンロード数が著しい残りのパッケージ:

  • jsdoc2md: 4,641 ダウンロード
  • gRPCツール・ノードプロトコル: 4,518 ダウンロード
  • ビュー・デミ・スイッチ: 1,166 ダウンロード
  • スタイルガイド: 805 ダウンロード
  • マイクロORM-ESM: 314回のダウンロード
  • pvbase64: 142回のダウンロード
  • クロムウェル: 106回のダウンロード
ロングテール
注目すべきダウンロード数を記録している残りのパッケージ(ビッグスリーを除く)
jsdoc2md
4,641
gRPCツール・ノードプロトコル
4,518
ビュー・デミ・スイッチ
1,166
スタイルガイド
805
マイクロORM-ESM
314
pvbase64
142
クロムウェル
106
📊 ノイズ :各バージョンリリースで60~100件のスキャナーダウンロードが発生します。合計100未満のパッケージ(灰色で表示)は全てノイズである可能性が高いです。それを超えるものは全て実機、実環境、実認証情報を表しています。
1,000回以上のダウンロード100~1,000ダウンロードノイズ

バージョンごとのダウンロードベースラインが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件のパッケージを申請済みです。

完全なパッケージ内訳
npmリファレンス、GitHubコード検索結果、およびすべてのクレーム済みパッケージのダウンロード
npm リファレンスGitHub検索結果ダウンロード
🔴 主な攻撃ベクトル(1万回以上ダウンロード)
パッケージ 参照 GitHub ダウンロード
openapi-generator-cli 23 650 48,356
cucumber-js 28 856 32,110
デプクルーズ 27 836 15,637
🟡 重大な攻撃ベクトル(1,000~10,000ダウンロード)
パッケージ 参照 GitHub ダウンロード
jsdoc2md 92 155 4,641
gRPCツール・ノードプロトコル 83 226 4,518
ビュー・デミ・スイッチ 70 80 1,166
中程度のリスク +ノイズ
パッケージ 参照 GitHub ダウンロード
スタイルガイド ハイ・エクスポージャー 246 286 805
mikro-orm-esm ドキュメントのみ 0 80 314
pvbase64 18 70 142
クロムウェル 31 23 106
git-scripts-pre-push 低コンバージョン 126 133 93
fathym 低コンバージョン 119 9 83
aofl, flatjs-forge 42, 30 30, 2 99, 91
重要な知見:高いnpmリファレンスが必ずしも高いダウンロード数を意味するわけではない。styleguidistは246のリファレンスがあるがダウンロード数は805である一方、mikro-orm-esmはリファレンスが0だが、ドキュメントからのダウンロードだけで314に達している。

注目すべきパターン:

主な攻撃ベクトル(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コマンドを実行します。「便利なデフォルト」と「任意のコード実行」の間の隔たりは、未登録のパッケージ名一つに過ぎません。

4.7/5

今すぐソフトウェアを保護します。

無料で始める
CC不要
デモを予約する
データは共有されない - 読み取り専用アクセス - CC不要

今すぐ安全な状態を実現します

コード、クラウド、ランタイムを1つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要です | スキャン結果は32秒で表示されます。