2025年9月、StepSecurityはJavaScript/Node.jsエコシステムで、人気パッケージ @ctrl/tinycolor(週2百万超DL) を含む 40本以上 が改ざんされる
サプライチェーン攻撃「Shai-Hulud」が確認されました。
関連記事
・ハッカーがサプライチェーン攻撃でnpmパッケージを乗っ取り、週20億ダウンロードを達成
・GitHubがnpm サプライチェーン攻撃の防御を強化-二要素認証の必須化やトークンを7日に
概要
NPMエコシステムは、新たな重大なサプライチェーン攻撃に直面しています。
毎週200万回以上ダウンロードされている人気の高い@ctrl/tinycolorパッケージが、複数のメンテナーにまたがる40以上のパッケージとともに侵害を受けました。この攻撃は、サプライチェーンの脅威の懸念すべき進化を示しています。
このマルウェアには、下流のパッケージに自動的に感染する自己増殖メカニズムが含まれており、エコシステム全体に連鎖的な侵害を引き起こします。侵害されたバージョンはnpmから削除されました。
影響を受けやすい環境
最も影響を受けやすいのは、日常的にクラウドCLIや個人トークンを保持しがちなLinux/macOSの開発端末と、GITHUB_TOKENや各種シークレットが常駐するGitHub ActionsなどのCI/CDランナーです。
npm installという日常作業やビルドの一工程だけでペイロードが動き、環境変数や資格情報ストアから横断的に秘密情報が持ち去られるため、開発者・ビルド用のマシンは侵入口と集約点の両方になり得ます。
加えて、複数パッケージを維持・公開するnpmメンテナ/組織アカウントは自己伝播機構の“起点”にされやすく、1つの侵害が他の所有パッケージ群へと連鎖するリスクが高い立場です。
結果として、個々の端末や単一のリポジトリに留まらず、組織全体の多数リポジトリとクラウド環境に影響が波及するため、一般的なマルウェア感染よりもはるかに復旧コストと範囲が大きくなります。
攻撃者はnpmパッケージへペイロードを紛れ込ませる
攻撃者は、複数のnpmパッケージ(代表例:@ctrl/tinycolor)にpostinstallで起動する約3.6MBのminify済みbundle.jsを紛れ込ませ、npm installの実行と同時に開発端末やCIランナー上で不正コードを走らせました。
Webpackで分割されたこのペイロードは、まずprocess.envの内容を丸ごと収集してAWS_ACCESS_KEY_IDやGITHUB_TOKEN、npmトークンなどの機密値を吸い上げます。
次に、TruffleHogを子プロセスとして起動してファイルシステム全体を高エントロピー文字列で走査し、~/.aws/credentials等の定番パスを含む秘匿情報を掘り起こします。
並行してAWS Secrets ManagerやGCP Secret ManagerにSDK経由でアクセスし、ページネーションも使いながらシークレットの一覧化と内容取得を試みます。
最大の特徴は自己伝播機構にあり、npmレジストリAPIから“同じメンテナが所有する他パッケージ”を検索して強制的にパッチ版を公開することで、維持者が抱える全パッケージへ感染を連鎖的に拡大します。
さらにGitHub APIを用いて各リポジトリに.github/workflows/shai-hulud-workflow.ymlというワークフローを直接追加し、secretsをtoJSON(secrets)で丸ごと取り出して外部へ送信する永続化バックドアを仕込みます。
収集したデータはShai-Huludという公開リポジトリを新規作成してアップロードする、あるいはwebhook.siteへPOSTするなど、正規の開発トラフィックに紛れやすい経路で外部流出されます。例外は黙殺され、ログ出力は極力抑えられ、TruffleHogの実行も“セキュリティスキャン風”に偽装されます。実行対象はlinuxとdarwin(macOS)が優先され、Windows環境は意図的に回避される挙動が確認されています。
主要IoC(侵害の痕跡)
-
悪性バンドルのハッシュ:
bundle.jsSHA-25646faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09 -
悪性ワークフロー:
.github/workflows/shai-hulud-workflow.yml -
悪性ブランチ:
shai-hulud -
送出先の一例:
webhook.site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7 -
不審なAPI・実行:
-
api.github.com(/user/repos、/repos/*/contents、/git/refsなど) -
AWS
secretsmanager.*.amazonaws.com(ListSecrets/GetSecretValueなど) -
GCP
secretmanager.googleapis.com -
trufflehog filesystem / --json -
npm version patch --force && npm publish --access public ...
-
出典








