世界を動かす技術を、日本語で。

NPMに悪意のあるパッケージが氾濫、86,000回以上ダウンロードされる

2025年10月30日原文(arstechnica.com)

概要

  • NPMリポジトリ で100以上の 認証情報窃取パッケージ が発見
  • 攻撃者は Remote Dynamic Dependencies (RDD) の脆弱性を悪用
  • PhantomRaven キャンペーンで8万回以上ダウンロード実績
  • 多くのパッケージが 未検出・未削除 のまま残存
  • RDDによる 依存関係の不可視化セキュリティツールの盲点

NPMリポジトリの脆弱性と攻撃事例

  • 2023年8月以降、 100以上の認証情報窃取パッケージ がNPMリポジトリで発見
  • セキュリティ企業 Koi が攻撃手法と影響を報告
  • 攻撃者は Remote Dynamic Dependencies (RDD) 機能を悪用
  • RDDにより、 未検証・信頼されていないドメイン から依存パッケージを自動取得
  • PhantomRavenキャンペーンで 126個の悪意あるパッケージ をNPMにアップロード
  • 悪意あるパッケージの 総ダウンロード数8万6,000回超
  • 2024年6月時点で 約80個のパッケージが公開中

Remote Dynamic Dependencies (RDD)の仕組みと問題点

  • RDDは 依存関係の柔軟な取得 を可能にする機能
  • 通常の依存関係は NPM公式インフラ から取得、可視化される
  • RDDは HTTP経由の非暗号化通信 も許可
  • 攻撃者は http://packages.storeartifact.com/npm/unused-imports などのURLから悪意ある依存関係をダウンロード
  • RDD経由の依存関係は 開発者やセキュリティスキャナーから不可視
  • NPMの表示上、「 依存関係0件」と誤認されやすい
  • パッケージインストール時、 毎回攻撃者サーバーから“新鮮な”依存関係を取得
  • 依存関係は キャッシュ・バージョン管理・静的化されず、検知困難

セキュリティ上の盲点とリスク

  • RDDの仕組みにより 従来の静的解析ツールが無効化
  • 攻撃者は セキュリティ監視の抜け穴 を突いて侵入
  • 開発者や利用者は 気付かぬうちに悪意あるコードを実行
  • NPMエコシステム全体 への信頼性低下リスク
  • 今後さらなる攻撃手法の高度化 が懸念

Hackerたちの意見

詳細な説明が載ってる別の記事はこちら: https://www.bleepingcomputer.com/news/security/phantomraven-...

「npm installを実行すると、npmは単にパッケージをダウンロードするだけじゃない。コードを実行するんだ。具体的には、package.jsonに定義されたライフサイクルスクリプト、つまりpreinstall、install、postinstallフックを実行する。パッケージのインストールが、なぜあなたのコンピュータ上で任意のコマンドを実行することを許される正当な理由があるのか?」これは研究者のレポートからの引用だよ。 https://www.koi.ai/blog/phantomraven-npm-malware-hidden-in-i... 編集: 他にもターミナルを起動するケースを考えてたけど、質問はそのままだね: https://socket.dev/blog/10-npm-typosquatted-packages-deploy-...

知ってる簡単な例だと、Mediasoupプロジェクトがある。これはインターネットで動画をストリーミングするためのC++で書かれたライブラリだよ。Nodeパッケージとして公開されていて、JS APIを提供してる。インストールすると、適切なC++ソースをダウンロードして、その場でコンパイルするんだ。プロジェクトのメンテナはコードを書きたかっただけで、プリコンパイルされたビルドを管理したくなかったから、これが一番論理的なインストール方法だったんだ。ちなみに、しばらく前に最も一般的なプラットフォーム用のダウンロード可能なビルドを追加したけど、それ以外はインストール時にソースをビルドすることが期待されてた(今でもそうだと思う)。

pnpm v10はデフォルトで全てのライフサイクルスクリプトを無効にして、ユーザーにパッケージをホワイトリストに登録させる必要があるよ。 https://github.com/orgs/pnpm/discussions/8945

一つのユースケースはバイナリのダウンロードだね。例えば、mongo-memory-server [0]はインストール後にmongoDBのバイナリをダウンロードするよ。[0] https://www.npmjs.com/package/mongodb-memory-server

確か、Huskyがライフサイクルフックを使って、NPMインストール時にリポジトリに設定されたgitフックをインストールするってことをやってた気がする。

これで痛い目にあったのは、gulp用の画像圧縮ツールや古いバージョンのsassをコンパイルした時、あとopensslの時が特に印象に残ってる。npmパッケージをダウンロードするのに、Cコンパイルツールをいじる必要があるなんて理想的じゃないよね。

パッケージをダウンロードするだけじゃなくて、コードも実行するんだよね。特に、LLMがこういう書き方をするのは、トレーニングデータに多くの人間がそう書いてたからだと思うと、ちょっと辛いな。

Swift Package ManagerはSwiftスクリプトを実行するんだ。Package.swiftファイル(マニフェスト)は実際には実行されるソースファイルなんだと思う。ただ、かなりサンドボックス化されてるだろうから、利用するのは難しいかもね。

でも、公式のインストール手順がcurl | bashの形になってるプロジェクトがどれだけあるか見たことある?

趣味でやってるんだけど、こういう侵害からどうやって守られて、情報をキャッチアップすればいいのかな? 人気のあるガイドをよくフォローしてるし、信頼できる著者が書いたものも多いけど、依存関係をインストールする時にちょっと軽率になってるかも。元のプロジェクトが脱線しちゃったから、痛点を解決しようとしてるんだ。関連するかもしれないけど、ローカルサービスを動かしてる小さなホームラボもあって、たまに新しい技術を試してる。時々、ちょっと面白いものを作って、誰かの役に立つかもしれないけど、逆に自分がボットの標的になっちゃうんじゃないかって心配になる。どう始めればいい?

「趣味でやってるんだけど、こういう侵害からどうやって守られて、情報をキャッチアップすればいいのかな?」一般的なソフトウェアのケースでは、「Nodeを使わない方がいい」ってアドバイスするかな。それに加えて、外部監査や検証なしのパッケージバックエンドは避けた方がいい。PyPIにも問題があるし、Cargoも理論的には同じくらい悪いけど、実際には安全だよ。ゴールドスタンダードは、Debianが提供するソフトウェアを使うこと(Fedoraもいいし、Archはちょっと下だけど、Linuxの外のユーザー提出の混乱ほどひどくはない)。でも、君の質問はフロントエンドのウェブ開発についてのようだね。そこは私の領域じゃないから、同情以外のアドバイスはできない。>「時々、ちょっと面白いものを作って、誰かの役に立つかもしれないけど、逆に自分がボットの標的になっちゃうんじゃないかって心配になる。」まさにその通りだね。ソフトウェアを配布するのは難しい。プロセスのいろんなレベルでたくさんの作業が必要だし、誰かがそれをやることにコミットしないといけない。時間やリソースをコミットするつもりがないなら、消費可能な形で配布しない方がいいよ(もちろん、自分が作ったものを配布するのはいいけど、適切にライセンスされていれば、誰かがそれを商品化してくれるかもしれない)。NPMはそのオーバーヘッドをうまくやれると思ってたけど、振り返ってみると、早すぎて壊れた状況だったね。

Hacker Newsで議論の続きを見る