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

NPMのdebugおよびchalkパッケージが侵害されました

概要

  • 2025年9月8日、 npmの人気パッケージ18種 に悪意あるコードが含まれるアップデートが公開
  • これらのパッケージは 週20億回以上ダウンロード されている
  • 悪意あるコードは Web3/暗号資産の操作を乗っ取り、送金先を書き換え
  • ユーザーに気付かれずに 資金や承認が攻撃者に転送
  • Aikido safe-chain などの安全対策の重要性

npm人気パッケージ大量感染事件の概要

  • 2025年9月8日13:16 UTC、 Aikido intel feed がnpm上の異常なパッケージ更新を検知
  • 対象となったパッケージは以下の通り
    • backslash (週26万DL)
    • chalk-template (週390万DL)
    • supports-hyperlinks (週1,920万DL)
    • has-ansi (週1,210万DL)
    • simple-swizzle (週2,626万DL)
    • color-string (週2,748万DL)
    • error-ex (週4,717万DL)
    • color-name (週1億9,171万DL)
    • is-arrayish (週7,380万DL)
    • slice-ansi (週5,980万DL)
    • color-convert (週1億9,350万DL)
    • wrap-ansi (週1億9,799万DL)
    • ansi-regex (週2億4,364万DL)
    • supports-color (週2億8,710万DL)
    • strip-ansi (週2億6,117万DL)
    • chalk (週2億9,999万DL)
    • debug (週3億5,760万DL)
    • ansi-styles (週3億7,141万DL)
  • 合計で 週20億回以上のダウンロード数、広範囲に影響

攻撃の詳細

  • 該当パッケージの index.js など主要ファイルに 難読化された悪意あるコード を追加
    • 例: is-arrayish のindex.jsが改ざん
  • このコードは Webブラウザ内で実行 される
    • ユーザーが暗号資産やWeb3関連の操作を行う際に発動
    • walletの操作や送金先アドレスを攻撃者のものに書き換え
    • 資金や承認が気付かれずに盗み取られる

悪意あるコードの挙動

  • window.ethereum が存在する場合、アカウント取得APIを呼び出し
  • アカウントが存在すれば runmask 等の関数で乗っ取り処理
  • 送金先や承認先のアドレスを 攻撃者の管理するアドレスへ上書き
  • 多数の アドレスリスト(BTC, ETH, 他) がコード内に埋め込まれている

影響範囲

  • 影響を受けたパッケージは Node.js/JavaScriptエコシステムの基盤的存在
    • 多くのプロジェクトやWebサービスが間接的に依存
  • Web3/暗号資産関連のサービス利用者 が特に危険
  • 被害は 資金流出や不正承認 など、直接的な金銭被害に直結

被害を防ぐための対策

  • Aikido safe-chain などの 依存パッケージの安全性検証ツール の活用
  • パッケージの 更新前に公式リポジトリやコード差分の確認
  • npm install時の自動スキャンや監視ツール の導入
  • 依存パッケージのロックファイル(package-lock.json等)の厳守
  • 怪しい挙動や不審なアップデートを検知した場合は 即時利用停止と報告

総括

  • npmエコシステムの信頼性 が大きく揺らぐ重大事件
  • 自動化された監視・スキャン体制 の構築が今後さらに重要
  • ユーザー自身によるセキュリティ意識の向上 も不可欠

Hackerたちの意見

こんにちは、やられちゃったよ。みんなごめん、すごく恥ずかしい。詳しい情報はここね: - https://github.com/chalk/chalk/issues/656 - https://github.com/debug-js/debug/issues/1005#issuecomment-3... 影響を受けたパッケージ(少なくとも俺が知ってるのは): - ansi-styles@6.2.2 - debug@4.4.2(9月8日 18:09 CESTに引き上げられたみたい) - chalk@5.6.1 - supports-color@10.2.1 - strip-ansi@7.1.1 - ansi-regex@6.2.1 - wrap-ansi@9.0.1 - color-convert@3.1.1 - color-name@2.0.1 - is-arrayish@0.3.3 - slice-ansi@7.1.1 - color@5.0.1 - color-string@2.1.1 - simple-swizzle@0.2.3 - supports-hyperlinks@4.1.1 - has-ansi@6.0.1 - chalk-template@1.1.1 - backslash@0.2.1 なんかターゲット攻撃っぽい感じがする。編集期限が切れるまでこのコメントを更新し続けるつもり。 --- Chalkは公開されてるけど、他のはまだ危険な状態(9月8日 17:50 CEST)。NPMからはまだ返事が来てない。俺のNPMアカウントは完全にアクセス不能で、パスワード再設定も機能しない。今は待つしかない。メールはnpmjsのサポートから来たけど、一見すると正当なものに見えた。言い訳するつもりはないけど、長い一週間で、パニックな朝だったから、やることリストの一つを片付けようとしてたんだ。普段なら直接サイトに行くところを、リンクをクリックしちゃったのが間違いだった(モバイルだったから)。影響を受けてるのはNPMだけ。上の/debug-jsリンクに更新を投稿する予定。また、本当にごめん。

誰にでも起こりうることだし、迅速に対応してくれてありがとう。

バカな質問でごめんけど、「2FAリセットメール」についてもう少し詳しく教えてもらえる?みんなが何をしないべきか知りたいんだ。

フィッシングメールには何が書いてあって、クリックしてログインしちゃったの?

誰にでも起こりうることだよね。すぐに反応してくれてありがとう!!

迅速かつ率直に対応してくれてありがとう!

みんなが感謝してるのに同意したい。すぐに認めてくれてありがとう。大学の時に酔っ払ってフィッシングにあったことがあって(かなり前だけど)、誰にでも起こりうることだよね。ただ、NPMが返事をするのが遅いのはちょっと驚きだな。それが攻撃をより儲かるものにするだけのように思える。

sindresorhus から: 依存関係ツリーにマルウェアが含まれているか確認するには、以下を実行してみて: rg -u --max-columns=80 _0x112fa8 ripgrep が必要だよ: brew install rg https://github.com/chalk/chalk/issues/656#issuecomment-32668...

警告してくれてありがとう。ドメインを削除してもらうために、porkbun に悪用メールを送ったよ。

よっ、npm の誰かが simple-swizzle@0.2.3 を今すぐにでも公開解除しなきゃダメだ。まだアクティブに侵害されてるから。

あなたのせいじゃないよ。問題を解決するために投稿してくれてありがとう。誰にでも起こり得ることだからね。だからこそ、AI モデルを使って防御を強化するべきなんだ。もしこのコメントを読んでいる人がそのフィッシングメールのソースを見て怪しいと思ったら、AI モデルもそう思えるはずだよ --- おそらくローカルのモデルでもね。こういうことを検出するために、すべてのメールをプライバシーを守るモデルに通すべきだよ。古い脆弱性スキャナーのファミリーはもう機能してない。

npmエコシステムの外から見ると、このパッケージのリストには驚かされる。なんでJSの人たちはちょっとしたことでも他の人のnpmモジュールをインポートするの?

普通はしないよ。でも、インストールする多くのパッケージは、裏でこういう小さなものに依存してるんだ(必ずしも良いわけじゃないし、パッケージ内で特注のコードで処理した方がいいけど、仕方ないよね)。

これらの中で再実装したいのはどれ? Debug、chalk、ansi-styles? --- これがJSエコシステム特有だと思うかもしれないけど、xzは3年間も危険にさらされてたよ。

ちょっとしたトリビアルなことごとにモジュールを持つことで、クライアントに提供するJSバンドルに必要なモジュールだけを持っていけるんだよね。もし一つのトリビアルな関数に問題があっても、他の関係ないトリビアルなものはそのまま使えるから、同じパッケージにまとめられてないからね。包括的なライブラリはもっと整ったDXを提供するかもしれないけど、使わないライブラリのコードも一緒に送らなきゃいけないし。(そう、ツリーシェイキングはあるけど、まだ難しいし普及してないよね。)

いい感じのバッテリー付き標準ライブラリがないのが問題だよね。小さな依存関係をたくさんインポートするか(それがまた他の小さなライブラリに依存してたりする)、それとも基本的な機能を自分でたくさん書かなきゃいけなくなる。

これ、どこでも広がってるよね。RustとかPythonとか…。

この話題は少なくともleftpad事件から続いてるよね。JSエコシステムの仕組みってこうなってるみたい。デフォルトライブラリがちょっと小さすぎるのかな?

NIH症候群に対する極端な嫌悪感かな?確かに変だよね。自分で暗号ライブラリを作ろうとするのはやめた方がいいけど、野良でのrequire('left-pad')の多さはひどいよ。

大きなコード変更の中でイライラするものを見つけるのは、単一行のインポートよりも簡単なんだよね。実行されるコードは同じでも、PRレビューは「信頼できそうな」ものをインポートする方がクリーンで安全に見えるし。安全だとは言ってないけど、疲れた脳にはそう感じることがある。

あなたのpackage-lock.jsonファイルの依存関係をチェックするための超簡単なスクリプトはここにあるよ[0]。 [0]: https://gist.github.com/martypitt/0d50c350aa7f0fc73354754343...

どう?: grep -r "_0x112fa8"

これらはすでに削除されていて、「npm audit」コマンドに表示されるんじゃないの?

このマルウェアのペイロードの中で、あまり注目されていない厄介な部分は、置き換え用のウォレットアドレスの選び方だよ。ランダムにリストから選ぶんじゃなくて、実際には正規のアドレスと自分のリスト内のすべてのアドレスとのレーベンシュタイン距離を計算するんだ。そして、元のアドレスに視覚的に最も似ている攻撃者のアドレスを選ぶ。これは、コードに組み込まれた素晴らしいソーシャルエンジニアリングだね。取引を確認する前にアドレスの最初と最後の数文字だけをチェックするという一般的なセキュリティ習慣を特に打破するように設計されている。ペイロードの完全なデオブフスケーションを行って、この特定の機能を分析したよ。興味のある人のために詳細を書いたから、ここを見てね: https://jdstaerk.substack.com/p/we-just-found-malicious-code... 安全にね!

これは、コードに組み込まれた素晴らしいソーシャルエンジニアリングだね。特に一般的なセキュリティ習慣を打破するように設計されている... この攻撃の素晴らしさに対する熱狂は、少し考えれば正当化されないと思う。ウェブは何十年も前から類似攻撃と戦っているんだから。これはそのダイナミックなバージョンに過ぎない。正直、この投稿全体はAIが書いたように感じるし、慎重な分析とは言えないね。

この手法を特定のグループに帰属させることはできる?

明らかに君を特定して狙ったスピアフィッシングだね。認めてくれてお疲れ様。みんなが言ってるように、残念ながら誰にでも起こりうることだよ。

npm auditを実行すると、GitHubのセキュリティアドバイザリーに誘導されるよ。例えば、debugの場合は https://github.com/advisories/GHSA-8mgj-vmr8-frr6 だ。そのページには影響を受けるバージョンが「>=0」と書いてあるけど、これって合ってるのかな?そのページにはこうも書いてある: > このパッケージがインストールまたは実行されているコンピュータは、完全に侵害されていると見なすべきです。そのコンピュータに保存されているすべての秘密やキーは、別のコンピュータからすぐにローテーションすべきです。このパッケージは削除すべきですが、コンピュータの完全な制御が外部の存在に渡されている可能性があるため、パッケージを削除してもインストールによって生じたすべての悪意のあるソフトウェアが削除される保証はありません。この情報は正確なの?

いや、今は利用できないバージョンの debug@4.4.2 が npm によって公開解除されたんだ。それが問題の唯一の脆弱なバージョンだよ。追記: でも、今のところセキュリティアドバイザリーが全パッケージをマークしている理由は、npm に脆弱性のあるバージョンがインストールされていることをユーザーに通知する仕組みがないからだと思う。npm audit はインストールされたバージョンではなく、設定されたバージョンを見るからね。この警告を引き起こすセキュリティアドバイザリーのせいで、4.4.2 がインストールされていた場合、みんながパッケージを再インストールしなきゃいけなくなったんだ。

npm レジストリを避けるのが大きなメリットだって結論に至ったよ。代わりに、(git)リポジトリから直接パッケージをインポートするのがいいかも。こういう供給チェーン攻撃の主要なベクトルになるだけじゃなくて、プロジェクトのソースと公開されたコードの間にほとんど結びつきがないのも事実だよ。npm publish のステップではローカルのコンテンツをレジストリにプッシュするから、悪意のある人が公開前にコードを簡単に変更できちゃうんだ。

Arch Linux の AUR を絶対に使わないって人を知ってるよ(たまにマルウェアにやられるからね)。そいつらは、使う奴は完全にバカだって誓ってる。でも、そんな奴らが NPM の上にアプリケーションを作ってるんだよね。それってほぼ同じことで、複雑すぎて監査がほぼ不可能になってる。

かなりターゲットを絞った攻撃みたいだね。フィッシングドメインはたった4日前に登録されたばかりだよ。

ブラウザ内で暗号通貨やWeb3の活動を静かに傍受して、ウォレットのやり取りを操作し、支払い先を変更して、資金や承認が攻撃者の管理するアカウントにリダイレクトされるようにするんだ。ユーザーには明らかな兆候がない状態でね。もし大量のNPM依存関係を使って金融取引をしているなら、ユーザーが詐欺に遭ったときには、個人的に責任を負うべきだと思うよ。