Aikido

npxの混乱: 自らの名前を確保していなかったパッケージ

執筆者
Charlie Eriksen

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件のダウンロードを記録しました。

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パッケージ

3つのパッケージが全ダウンロードの79%を占めています:

  • openapi-generator-cli: 48,356ダウンロード (実際のパッケージ: @openapitools/openapi-generator-cli)
  • cucumber-js: 32,110ダウンロード (実際のパッケージ: @cucumber/cucumber)
  • depcruise: 15,637 ダウンロード (実際のパッケージ: dependency-cruiser)
ビッグスリー: 全トラフィックの79%
3つのファントムパッケージが総ダウンロード数121,539件中96,103件を占める
openapi-generator-cli → 実際: @openapitools/openapi-generator-cli
48,356
23 npm 参照650 GitHub 結果過去7日間で3,994
cucumber-js → 実際: @cucumber/cucumber
32,110
28 npm 参照856 GitHub 結果
depcruise → 実際: dependency-cruiser
15,637
27 npm 参照836 GitHub 結果

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ダウンロード
ロングテール
注目すべきダウンロード数を記録している残りのパッケージ(上位3つを除く)
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件のスキャナーダウンロードが発生します。合計約100件未満のパッケージ(灰色で表示)は、おそらくすべてノイズです。それ以上のものはすべて、実際のマシン、実際の環境、実際の認証情報を表しています。
1K+ダウンロード100~1Kダウンロードノイズしきい値

バージョンごとの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件のパッケージを特定しています。

完全なパッケージの内訳
特定されたすべてのパッケージにおけるnpm参照、GitHubコード検索結果、およびダウンロード数
npm参照GitHub結果ダウンロード数
🔴 主要な攻撃ベクトル(10K+ダウンロード)
パッケージ 参照 GitHub ダウンロード数
openapi-generator-cli 23 650 48,356
cucumber-js 28 856 32,110
depcruise 27 836 15,637
🟡 重要な攻撃ベクトル (1,000~10,000ダウンロード)
パッケージ 参照 GitHub ダウンロード数
jsdoc2md 92 155 4,641
grpc_tools_node_protoc 83 226 4,518
vue-demi-switch 70 80 1,166
中程度のリスク + ノイズしきい値
パッケージ 参照 GitHub ダウンロード数
styleguidist 高い露出度 246 286 805
mikro-orm-esm ドキュメントのみ 0 80 314
pvbase64 18 70 142
cromwell 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のダウンロード数があります。

注目すべきパターンがいくつかあります:

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

共有:

https://www.aikido.dev/blog/npx-confusion-unclaimed-package-names

脅威ニュースをサブスクライブ

本日より無料で開始いただけます。

無料で始める
CC不要
4.7/5
誤検知にうんざりしていませんか?
10万人以上のユーザーと同様に Aikido をお試しください。
今すぐ始める
パーソナライズされたウォークスルーを受ける

10万以上のチームに信頼されています

今すぐ予約
アプリをスキャンして IDORs と実際の攻撃パスを検出します

10万以上のチームに信頼されています

スキャンを開始
AI がどのようにアプリをペンテストするかをご覧ください

10万以上のチームに信頼されています

テストを開始

今すぐ、安全な環境へ。

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

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