🚀
ワーム「Shai-Hulud」、npmサプライチェーン攻撃
はじめに
この記事は、2025年10月4日までに公開されている情報に基づき、npmエコシステムを標的とした大規模サプライチェーン攻撃「Shai-Hulud」の全容と対策をまとめたものです。
概要
2025年9月14日、自己増殖型ワーム「Shai-Hulud」によるサプライチェーン攻撃が発生しました。
これは、npmエコシステムを標的とした大規模な攻撃であり、依存関係のパッケージを通じて、連鎖的に感染を拡大させます。
Kasperskyの調査によると、190個のパッケージ、合計530バージョンに感染が確認されています。
詳細
ここでは、Shai-Huludのキャンペーンに至るまでの一連の攻撃を、その前兆となったものから順に3つのフェーズで記載します。
この攻撃に使用された手法が、今回のShai-Huludにも多く使用されています。
第1フェーズ:「s1ngularity/Nx」攻撃(前兆)
- 手口:GitHub Actionsのインジェクション脆弱性を悪用
- 日付:2025年8月26日
- 目的:データ漏洩
-
手順
- GitHub Actionsのワークフローの欠陥を悪用し、npmパッケージを公開するための認証情報を窃取
- 認証情報を使って、悪意のあるバージョンを公開
- 環境変数やGitHubトークンなどを窃取し、自動生成したパブリックリポジトリへ保存。
- 漏洩したGitHubトークンを使用して、被害者のプライベートリポジトリを公開。
第2フェーズ:人気パッケージのトロイの木馬化
- 手口:フィッシング
- 日付:2025年9月8日
- 目的:金銭(暗号資産)を奪取
-
手順
- 偽の「npm support」メッセージを送信し、
npmjs[.]help
(類似サイト)へ誘導。 - このサイトで、メンテナーのユーザー名、パスワード、2FA認証情報を取得。
- 取得した認証情報を
websocket-api2[.]publicvm[.]com
へ送信。 -
chalk
やdebug
などの合計18個の人気パッケージを不正に更新。 - 約2時間(UTC 13:16~15:15)にわたり、トロイの木馬化されたバージョンが公開された
- 偽の「npm support」メッセージを送信し、
-
解説
- 攻撃対象となったパッケージは、合計で毎週約20億回ダウンロードされていると推定されるとても人気なパッケージ。
- パッケージは、暗号通貨の活動を密かに傍受し、悪意のある人物の利益のために取引を操作するように設計されている。
- トロイの木馬化されたパッケージは、npmチームの迅速な対応により2時間で削除されたため、攻撃者が得た利益は限定的でした。
第3フェーズ:「Shai-Hulud」によるサプライチェーン攻撃
第2フェーズのフィッシングで窃取された認証情報の一部が、このワームの初期感染の足がかりになったと考えられています。
- 手口:ワーム
- 日付:2025年9月14日~16日
- 目的:データ漏洩
-
手順
-
ngx-bootstrap
や@ctrl/tinycolor
などが感染。 - 感染されたパッケージがインストールされると、
TruffleHog
などのツールを用いて、GitHubトークンなど奪取 - それらのトークンを送信するGitHub Actionsワークフローを追加
- 盗んだトークンでアクセスできるすべてのパッケージを改ざんして再公開
- このサイクルを繰り返すことで、自己増殖していく
-
-
解説
- 依存関係のパッケージを通じて連鎖的に感染が拡大。
- GitHubトークン以外にもnpmトークン、SSHキー、AWS、GCPなどの認証情報を取得。
-
TruffleHog
は、公開された秘密情報を発見するためのツールであるが、防御技術を攻撃目的で転用された - 盗まれた認証情報は、そのユーザーまたは、チームに新しいリポジトリ「Shai-Hulud」を作成して、公開されてしまう。
GitHub社の対応
今回のShai-Hulud攻撃に対して、同社は、以下の対応をした。
- npmレジストリから500以上の侵害されたパッケージを削除
- マルウェアの侵入痕跡(IOC)を含むアップロードをブロックする措置を導入
- npmパッケージの公開方法を、より安全な3つの方法に限定:
- 2要素認証が必須のローカル公開
- 7日間の有効期限を持つ、権限を絞ったトークンでの公開
- **Trusted Publishing(OIDC)**による信頼された公開
対策方法
早急に対応すべきこと
- npmトークン、GitHubトークン、SSHキー、パスワードなどすべてを無効化し、再発行。
- 再インストールまたは再イメージ化の実施。
- マルウェアは複数の方法で永続化を行うので、クリーンアップはほぼ不可能。
- そのため、セキュリティ専門家は、再インストールまたは再イメージ化を推奨。
- 侵害の痕跡を調査
- GitHub上で「Shai-Hulud」という名前のリポジトリやブランチ
-
shai-hulud*.yml
の存在を探し、削除。
認証とアクセス管理の強化
- 長寿命トークンを廃止
- トークンの寿命を必要最短にする
- 強力な2要素認証(2FA)を必須
ビルドとサプライチェーンのセキュリティ
- ビルドパイプラインの最小権限化
- CI/CD環境のアクセス権を必要最小限に制限
- パッケージ管理
- 意図しないパッケージがインストールされないようにバージョンを指定する
- 成果物(アーティファクト)の出所を証明する
- 署名付きビルド、SBOM、証明書を活用して、信頼性の担保
継続的な監視と監査
-
npm audit
などを用いて依存関係のチェックを行う - 不審なアクティビティを監視
- 予期せぬリポジトリやワークフローの作成、不正なドメインへの通信を監視
- 継続的なセキュリティ検証
- 異常検知などを常時実行できる体制
おわりに
今回の調査を通じて、私たち開発者は日々のセキュリティ意識をこれまで以上に高める必要があると痛感しました。
npmをはじめとするオープンソースソフトウェア(OSS)は、開発者たちのたゆまぬ努力によって維持されています。しかしその一方で、その善意の仕組みが悪用され、常に脆弱性やウイルスの脅威に晒されているという現実も浮き彫りになりました。
この一件は、「人気だから安全だろう」という安易な思い込みがいかに危険であるかを教えてくれます。今後は、一つ一つのパッケージに対して健全な猜疑心を持ち、慎重に利用するべきだと強く感じています。
参考文献
Discussion