JavaScriptの広大なエコシステムに大打撃を与える、史上最大規模のサプライチェーン攻撃が行われたことが明るみに出た。週間ダウンロード数が合計20億回を超える18ものnpmパッケージが、一人の開発者のアカウント乗っ取りを起点として悪意のあるコードに汚染されたのだ。攻撃の目的は、ユーザーの暗号資産ウォレットからの資金窃取。巧妙なフィッシングから始まるこの攻撃は、我々が日常的に依存するオープンソースソフトウェアの信頼性という土台がいかに脆いものであるかを、改めて突きつけるものだ。
静かに始まった史上最悪の汚染
事件が発覚したのは、2025年9月8日(UTC)。セキュリティ企業Aikido Securityの監視システムが、異常なコードを含むパッケージの公開を検知したことから、この大規模な汚染は始まった。汚染されたのは、ターミナルの文字に色をつけるchalk(週間3億ダウンロード)、デバッグ情報を出力するdebug(同3.5億ダウンロード)、ターミナルスタイリングの基盤となるansi-styles(同3.7億ダウンロード)など、現代のWeb開発において欠かすことのできない基本的なライブラリ群だ。
これらのパッケージは、単体で使われるだけでなく、数え切れないほどの他のライブラリやアプリケーションの「依存関係」として組み込まれている。いわば、ソフトウェア界のインフラストラクチャーの一部であり、その影響範囲は計り知れない。Aikido Securityによれば、汚染された18パッケージの週間ダウンロード総数は26億回にも上る。これは、npmの歴史上、単一の攻撃としては紛れもなく最大規模のものである。
攻撃は短時間で検知され、npmチームによる迅速な対応が開始されたものの、悪意のあるバージョンが公開されていた約2時間半の間に、世界中の開発環境やCI/CDパイプラインが汚染された可能性がある。
引き金は一通の「パニックにさせた」フィッシングメール
この巨大なサプライチェーン攻撃の起点となったのは、驚くべきことに、たった一通のフィッシングメールだった。標的とされたのは、今回汚染された多くのパッケージをメンテナンスする、コミュニティで高く評価されていた開発者、Josh Junon(ハンドル名: qix)氏だ。
攻撃者が送りつけたメールは、npmの公式サポートを装い、「support@npmjs.help」という巧妙に偽装されたドメインから送信された。その文面は、受信者の不安を煽るよう計算され尽くしたものだった。
「アカウントセキュリティへの継続的な取り組みの一環として、すべてのユーザーに二要素認証(2FA)情報の更新をお願いしています。あなたの最後の2FA更新から12ヶ月以上が経過していることが記録されています」
「アカウントのセキュリティと完全性を維持するため、可及的速やかにこの更新を完了してください。古い2FA情報を持つアカウントは、不正アクセスを防ぐため、2025年9月10日より一時的にロックされます」
このメールは、緊急性と権威性を装い、受信者に冷静な判断をさせないための典型的なソーシャルエンジニアリングの手法だ。Junon氏自身も、GitHubやBlueskyで「申し訳ない、もっと注意すべきだった。ストレスの多い一週間で、パニックな朝だった」「やるべきことリストの一つを片付けようとして、いつもなら直接サイトに行くのに、リンクをクリックするという過ちを犯してしまった」と述べ、一瞬の油断が招いた結果であることを認めている。
メール内のリンクをクリックした先には、本物そっくりのnpmログインページが待ち構えていた。そこで入力された認証情報は、websocket-api2[.]publicvm.com というURLを通じて、静かに攻撃者の元へと送信された。こうして、数十億ダウンロードを誇るパッケージ群の生殺与奪の権は、攻撃者の手に渡ったのである。
暗号資産を狩るマルウェア「クリプトクリッパー」の解剖
攻撃者がパッケージに注入したのは、「クリプトクリッパー」と呼ばれる、極めて悪質なマルウェアだった。その目的はただ一つ、ユーザーの暗号資産を盗むことだ。このマルウェアは、ブラウザ内で動作し、複数の階層でユーザーの操作を乗っ取るよう設計されている。
ブラウザの神経系を乗っ取る通信ハイジャック
このマルウェアの核心は、ブラウザの基本的な通信機能を乗っ取る点にある。具体的には、JavaScriptにおける主要な通信APIであるfetchとXMLHttpRequestを「モンキーパッチ」する。これは、既存の関数の挙動を、実行時に動的に上書きする手法だ。
- 通信の傍受: マルウェアは、Webサイトが行うすべてのネットワーク通信を監視する。
- 内容のスキャン: 通信データ(レスポンス)の中に、暗号資産のアドレス(Bitcoin, Ethereum, Solana, Tron, Litecoin, Bitcoin Cashなど)に一致する文字列がないかをスキャンする。
- アドレスの置換: もしアドレスが見つかれば、それを攻撃者が用意した、見た目が似ている別のアドレスに密かに置き換える。
これにより、ユーザーがウェブサイト上でコピーした送金先アドレスが、ペーストする際には攻撃者のアドレスにすり替わっている、といった事態を引き起こす。ユーザーは画面上では正しい情報を扱っているつもりでも、その裏ではデータが改ざんされているのだ。
デジタル署名の瞬間を狙うウォレットAPIへの介入
さらに悪質なのは、MetaMaskのようなブラウザ拡張ウォレットとの連携を直接ハイジャックする機能だ。
マルウェアは、ウェブアプリケーションとウォレットを繋ぐwindow.ethereumのようなAPIオブジェクトを乗っ取る。ユーザーが「送金」や「承認」ボタンを押し、ウォレットが署名を求めるポップアップを表示する、その直前のプロセスに介入するのだ。
「このマルウェアが危険なのは、複数のレイヤーで動作する点にある。Webサイトに表示されるコンテンツを改ざんし、API呼び出しに干渉し、ユーザーのアプリが署名していると信じている内容を操作するのだ」
— Aikido Security, Charlie Eriksen氏
ユーザーがウォレットの画面で確認する送金先は、一見すると正しいアドレスに見えるかもしれない。しかし、署名されるトランザクションデータそのものが、裏で攻撃者のアドレスに書き換えられている。つまり、ユーザーは自らの意思で、攻撃者への送金に署名させられてしまうことになる。これは、ハードウェアウォレットを使っていないユーザーにとっては、極めて防御が困難な攻撃と言えるだろう。
この手口の巧妙さは、Ledger社のCTOであるCharles Guillemet氏が「ハードウェアウォレットを使用していない場合、当面はオンチェーン取引を控えるように」と緊急の警告を発したことからも伺える。
迅速な検知とコミュニティの対応
幸いにも、この大規模な攻撃は比較的早期に発見された。Aikido Securityは、インシデント発生からわずか数時間後には問題を特定し、公開した。検知のきっかけは、一部の開発環境でビルドが失敗し始めたことだった。マルウェアがNode.js環境のようなブラウザ以外の環境で実行された際、fetch関数が存在しないためにReferenceError: fetch is not definedというエラーを吐き出したのだ。皮肉にも、マルウェア自身の不完全さが、その存在を暴く手がかりとなった。
報告を受け、npmチームとコミュニティは迅速に対応を開始。悪意のあるバージョンのパッケージは次々と削除(unpublish)された。Junon氏も自身の管理下にあるパッケージのクリーンアップに着手したが、その最中にアカウントへのアクセス権を失ってしまったと報告している。
しかし、攻撃が継続していた約2時間半の間に、npm installやnpm updateを実行した開発者は、意図せずして悪意のあるバージョンを自身のプロジェクトに導入してしまった可能性がある。特に、依存関係を固定するpackage-lock.jsonファイルがない、あるいは無視するような運用をしていたプロジェクトはリスクが高い。
開発者とユーザーが今すぐ取るべき対策
この事件は、ソフトウェア開発者と一般ユーザーの双方に警鐘を鳴らしている。
開発者向けの防御策
- 依存関係の監査:
npm auditコマンドを実行し、プロジェクトに脆弱なパッケージが含まれていないかを確認する。 - 依存関係の固定: CI/CDパイプラインでは
npm installの代わりにnpm ciを使用し、package-lock.jsonに基づいた確定的なインストールを徹底する。 - バージョンの上書き:
package.jsonのoverrides機能を使用し、汚染が確認されたパッケージのバージョンを安全なものに強制的に固定する。json "overrides": { "chalk": "5.6.0", "debug": "4.3.4" } - 汚染ファイルの検索: オープンソース開発者のSindre Sorhus氏が提案するように、
ripgrepツールを使って、マルウェア特有の文字列(例:_0x112fa8)がnode_modules内に存在しないかを確認する。bash rg -u --max-columns=80 _0x112fa8
一般ユーザー向けの注意喚起
- 暗号資産取引の再確認: オンラインで取引を行う際は、送金直前にウォレットアプリで表示される送金先アドレスが、本当に意図したものであるかを一文字ずつ慎重に確認する。
- ハードウェアウォレットの利用: 秘密鍵をオフラインで管理するハードウェアウォレットは、今回のような攻撃に対する強力な防御策となる。トランザクションへの署名は、信頼できるデバイスの物理的な画面で最終確認を行うことが重要だ。
- アプリケーションの更新: 利用しているウェブサービスやアプリケーションからアップデートの通知があった場合は、速やかに適用する。
氷山の一角:深刻化するサプライチェーン攻撃
今回のnpmへの攻撃は、決して孤立した事件ではない。これは、近年ますます巧妙化、大規模化するソフトウェアサプライチェーン攻撃という大きな潮流の一部だ。
2025年8月には、AIを活用してGitHubアカウントを侵害する「s1ngularity」事件が発生したばかりだ。また、過去にもeslint-config-prettierなど、数千万ダウンロードを誇る人気パッケージが乗っ取られる事件が起きている。
ReversingLabsのレポートによれば、2024年に観測された暗号資産関連の悪意のあるキャンペーンのうち、実に61%がnpmを標的としていたという。JavaScriptエコシステムのオープン性と、依存関係の複雑なネットワークが、攻撃者にとって格好の標的となっているのだ。
我々が享受するオープンソースソフトウェアの利便性は、世界中の開発者による善意と信頼の上に成り立っている。しかし、その信頼の連鎖(サプライチェーン)の一箇所でも綻びが生じれば、今回のようにエコシステム全体が深刻なリスクに晒される。
この事件は、開発者一人ひとりが、自らが書くコードだけでなく、利用するコードに対しても責任を持つ必要があることを示している。そして我々ユーザーもまた、デジタルの世界における利便性が、決して無条件の安全を意味するものではないことを、改めて肝に銘じなければならないだろう。信頼が揺らぐ時代において、我々の警戒心こそが、最後の防衛線なのかもしれない。
Sources
- Josh Junon (Bluesky)
- Akido Security: npm debug and chalk packages compromised



