一週間で三回。 三回ですよ。この時点で、NPMは「Never-ending Pwning Machine(終わりなき侵入マシン)」の略なんじゃないかと思い始めています。なぜなら、なんてこった、バットマン—また別のサプライチェーン攻撃が発生し、今度のはシェフのキス絶対に悪魔的だからです。
Shai-Hulud(はい、これが実際のコードネーム—デューンの巨大なサンドワームから名付けられました。どうやらハッカーもSF参照に手を出すようになったようです)をご紹介しましょう。これは普通の「うっかり悪意のあるパッケージをダウンロードしちゃった」という状況ではありません。いえいえいえ。これは自己複製するデジタルパンデミックで、「みんなの一日を台無しにする最もクリエイティブな方法」でノーベル賞を取ろうとしているかのように、リポジトリからリポジトリへと拡散するのです。
セキュリティエンジニアを泣かせるプロットツイスト
マルウェアがシンプルだった古き良き時代を覚えていますか?悪いパッケージをダウンロード、マルウェアがトークンを盗む、ゲームオーバー。Shai-Huludは「俺のビールを持っていろ」と言って、最悪の方法でイノベーションを起こすことにしました。
この美しい攻撃は、あなたの認証情報を盗んでそれで終わりということはしません。盗んだトークンを使って他のリポジトリに感染させるのです。これは泥棒があなたの家を盗むだけでなく、あなたの鍵を使ってすべての隣人を盗み、その隣人たちが鍵を盗まれて彼らの隣人を盗み、街全体が巨大な犯罪現場になるまで続くようなものです。
Shai-Hulud攻撃で侵害された主要パッケージには、@ctrl/tinycolor、@crowdstrike/falcon-shoelace、ngx-bootstrapなど180以上が含まれます。この攻撃は複数のメンテナーにわたる人気ライブラリを標的とし、UIコンポーネントからセキュリティツールまで、このサプライチェーン攻撃の巨大な範囲を実証しています。出典: OX Security
攻撃はrxnt-authenticationという、長い間更新が見られなかった、ひっそりとした非推奨パッケージから始まりました。そして突然—プロットツイスト!—バージョン0.0.5と0.0.6がデジタルゴーストのように現れ、悪意のあるペイロードを野生に運び込みました。
デジタルダーウィニズムの解剖
ここが技術的に魅力的(そして恐ろしい)な部分です:
ステップ1: フィッシングの餌 可哀想な開発者が説得力のあるメールを受け取ったのでしょう:「やあ、セキュリティ上の理由でnpmトークンを更新する必要があります!ここをクリック!」*クリック。*ゲームオーバー。
ステップ2: トロイの木馬 攻撃者はパッチアップデートを使って悪意のあるバージョンをプッシュします(明らかに私たちはまだパッチバージョンを自動アップグレードしないことを学んでいない—真面目に、皆さん、バージョンをロックしてください)。
ステップ3: デジタル寄生虫 インストールされると、パッケージは「Truffle Hog」と呼ばれるものをデプロイするポストインストールスクリプトを実行します—これは、余談ですが、素晴らしい名前であり、漏洩した認証情報をスキャンする正当なセキュリティツールです。ただし、今は善ではなく悪に使われています。スーパーマンが銀行強盗に変わるのを見ているようなものです。
ステップ4: ウイルス拡散 ここが傑作です:Shai-Huludは単にあなたのトークンをリモートサーバーに流出させるのではなく、すぐにあなたのGitHubリポジトリで作業を開始します。それは:
- CI/CDパイプラインを更新する
- package.jsonファイルを変更する
- あなたのパッケージの新しい「パッチ」バージョンを公開する
- 新しいバージョンに自分自身を含める
洗い、すすぎ、繰り返し、指数関数的な成長。マルウェアのねずみ講のようなものです。
数字のゲーム(ネタバレ:私たちは負けている)
攻撃は40個の侵害されたパッケージで始まりました。数時間以内に、その数は180個以上に跳ね上がりました。この成長率では、来週までには観測可能な宇宙の原子数よりも多くの感染したパッケージが存在することになるでしょう。(オーケー、これは誇張ですが、指数関数的な成長は本当に恐ろしいです。)

でも待って—まだあります!被害者の中には、皮肉の王冠の宝石があります:CrowdStrike!
そうです、読んだ通りです。セキュリティソリューションを販売し、今年初めに大ブルースクリーンオブデス事件を起こした同じCrowdStrikeが今—ドラムロールお願いします—npmパッケージを通じて誤ってワーム攻撃を配布しているのです。具体的には、攻撃は以下を侵害しました:
@crowdstrike/commitlint(バージョン8.1.1、8.1.2)@crowdstrike/falcon-shoelace(バージョン0.4.1、0.4.2)@crowdstrike/foundry-js(バージョン0.19.1、0.19.2)@crowdstrike/glide-core(バージョン0.34.2、0.34.3)@crowdstrike/logscale-dashboard(バージョン1.205.1、1.205.2)@crowdstrike/tailwind-toucan-base(バージョン5.0.1、5.0.2)
これは文字通り作り話にできません。宇宙にはユーモアのセンスがあり、そのユーモアのセンスは明らかに非常に、非常にダークです。
「Tiny Color」の悲劇
言及する価値のあるもう一つの被害者は、人気のtiny-colorパッケージで、メンテナーの侵害された認証情報を通じてヒットしました。バージョン4.11と4.12が感染しましたが、反抗的なユーモアの美しい行為で、安全なバージョンは… 4.20としてリリースされました。
そのバージョン番号の決定をした人にシェフのキス。混沌の最中でも、誰かがジョークの時間を見つけていました。
私たちが作った依存関係地獄
この攻撃は私たちが意図的に無視してきた何かを浮き彫りにします:私たちの依存関係ツリーは狂気じみています。単一の関数を使用するために全体のライブラリをインポートしています。文字列をパディングする必要がある?left-padをインポート。何かが数字かどうかチェックする必要がある?is-numberをインポート。HSVをRGBに変換する必要がある?47個の推移的依存関係を持つ別のパッケージをインポート。
ChatGPTに「left-pad関数を書いて」と文字通り尋ねて3秒で動作する実装を得ることができるAIの時代に、なぜ私たちはまだ依存関係ロシアンルーレットをプレイしているのでしょうか?
自動更新中毒
パッチバージョンの自動更新について話せますか?**やめてください。**ただ…やめて。これは今年、自動パッチバージョン更新に依存した3回目の大きな攻撃のようなものです。2025年で、私たちはまだ何度も何度も同じ間違いを犯しています。
バージョンをロックしてください。はい、より多くの作業が必要です。はい、いくつかのバグ修正を見逃すでしょう。でも見逃さないものを知っていますか?誤って自己複製マルウェアをインストールすること。
問題は:あなたが良い市民でバージョンをロックしていても、パッケージマネージャーが再帰的悪夢だから、まだ脆弱だということです。あなたはパッケージAに依存し、それはパッケージBに依存し、それはマルウェアを含むように自動更新され、それからとにかくあなたのプロジェクトに感染します。
それは終始依存関係であり、すべてのレベルが潜在的な攻撃ベクトルです。
現実世界への影響
これは単なる理論ではありません。実際の企業、実際のプロジェクト、実際の本番環境がヒットしました。攻撃の対象:
- 露出されたGitHubトークンを持つ開発環境
- 公開認証情報を持つCI/CDパイプライン
- キャッシュされた認証を持つローカル開発者マシン
npmトークンがどこかに転がっていた場合—環境変数、CI設定、ブラウザの保存されたパスワードに—Shai-Huludがそれらを狙っていました。
防御戦略(または:ハックされない方法)
1. すべてをロックダウン
{
"dependencies": {
"some-package": "1.2.3", // 正確なバージョン、チルダなし、キャレットなし
"another-package": "4.5.6"
}
}
2. 命がかかっているように監査
npm auditを宗教的に実行してください。自動化された依存関係スキャンを設定してください。package.jsonを核ミサイル発射コードが含まれているかのように扱ってください。
3. 依存関係を最小化 自分に尋ねてください:「数字が奇数かどうかチェックするためのパッケージが本当に必要?」答えはおそらくノーです。
4. トークンをローテーション 最近npmトークンをローテーションしていない場合は、今すぐやってください。2019年からのトークンがまだ浮いている場合は、昨日削除してください。
5. パッケージを監視 パッケージを維持している場合は、予期しない公開のアラートを設定してください。バージョン3.1.4が突然現れて、あなたが公開していない場合、それはテキサス州サイズの赤い旗です。
より大きな絵
Shai-Huludはサプライチェーン攻撃の進化を表しています。それは単なるマルウェアではありません—自己伝播マルウェアです。攻撃者がネットワーク効果を研究し、それらをサイバー犯罪に適用するときに起こることです。
この攻撃は、いくつかのシステミックな問題を悪用することで成功しました:
- 自動化された依存関係更新への過度の依存
- エコシステム全体での貧弱なトークン衛生
- 現代のパッケージ管理の相互接続された性質
- パッチ更新を暗黙的に信頼する開発者の傾向
これが未来にとって何を意味するか
私たちは変曲点にいます。集合的にサプライチェーンセキュリティに真剣になるか、このような攻撃をもっと見ることになるでしょう。Shai-Huludは、npmのエコシステムが分散攻撃プラットフォームに武器化できることを証明しました。
次の攻撃はもっと悪いかもしれません。Dockerイメージ、またはPythonパッケージ、またはRustクレートをターゲットにするかもしれません。より長く持続し、より速く拡散し、またはより多くの損害を引き起こすかもしれません。
明るい兆し
良いニュースもあります:この攻撃は比較的迅速に捕捉され、影響を受けたパッケージがクリーンアップされており、セキュリティコミュニティはより良い検出ツールと実践で迅速に対応しています。
また、私たちは望んでいたかどうかに関係なく、サプライチェーンセキュリティのクラッシュコースを受けています。自己複製パッケージウイルスによってエコシステム全体が所有されるのを見ることほど、防御的プログラミングを教えるものはありません。
学んだ教訓(難しい方法で)
- 自動更新は破滅的になるまで便利
- すべての依存関係は潜在的な攻撃ベクトル
- トークンローテーションはオプションではない—必須
- 独自のユーティリティ関数を書くコストは、それらをインポートするリスクよりも今や低い
- セキュリティは他の誰かの問題ではない—みんなの問題
最終的な考え
これを書いている間、Shai-Huludのクリーンアップは進行中です。パッケージがパッチされ、トークンがローテーションされ、世界中の開発者が依存関係管理の実践について不快な会話をしています。
攻撃はそのシンプルさにおいて素晴らしく、その効果において恐ろしいものでした。npmの最大の強み—その相互接続されたエコシステム—をその最大の脆弱性に変えました。
でも、ここで一つ:私たちはこれから学ぶことができます。より良いツールを構築し、より良い実践を実装し、より弾力性のあるシステムを作ることができます。または教訓を無視してShai-Hulud 2.0を待つことができます。
選択は私たちのものです。良い選択をしましょう。
警戒を怠らず、依存関係をロックし続け、そして覚えておいてください:パッケージ管理の世界では、パラノイアはバグではありません—特徴です。
リソース:
責任を持ってパッケージを更新してください、友達。エコシステムはそれにかかっています。