FlawOpen

flawopen.com/Incidents/shai-hulud-npm-worm-september-2025

● npm ecosystem · CWE-506 / CWE-829 · September 2025 · 緊急
セキュリティ研究 · FlawOpen

Shai-Hulud:2025年9月の npm ワームとインストール時の信頼

2025年9月の Shai-Hulud は、侵害された npm 保守者アカウントと悪意のある postinstall フックを使い、認証情報を盗んで感染パッケージを追加公開しました。[1]

💡 わかりやすい解説 (ELI5)

工場に届いた部品箱に、自動で動く開封手順が付いていると想像してください。その手順は工場の発送用の認証札を複製し、別の工場へ改ざんした箱を送ります。自動手順を止めればこの入口は閉じますが、部品自体は使用前に調べなければなりません。[1]

主要な概念と専門用語

Lifecycle hook
九月の攻撃では npm の postinstall がインストール時に悪意のあるコードを実行しました。これはパッケージの動作であり、CVE の付いた npm のメモリ欠陥ではありません。
Publishing credential
npm トークンにはアカウントまたはパッケージに設定された権限があります。盗まれた公開権限が拡散に使われ、期限、範囲、MFA は設定次第です。
Trusted publishing / OIDC
OIDC では認可された CI の処理が保存済み npm トークンなしで短命の公開資格を得られます。ただし侵害された認可済み処理は危険です。

フレームワーク対応

インシデントのタイムライン

2025-09-14

GitHub は Shai-Hulud の通知を受けたと述べています。[1]

2025-09-22

GitHub は汚染されたパッケージを500件以上除去し、悪意のある指標に一致するアップロードを止めたと報告しました。[1]

ステップ・バイ・ステップの攻撃フロー

ステップ 1

侵害された公開版

保守者アカウントから変更済みパッケージが公開されました。フィッシングは初期侵入の仮説で、全アカウントで実証されたわけではありません。[1], [2]

ステップ 2

インストール時の実行

九月の postinstall は開発者または CI の権限で実行されました。十一月の preinstall をこの波にさかのぼって当てはめてはいけません。[1], [3], [2]

ステップ 3

認証情報の露出

コードは設定や環境から npm、GitHub、クラウドの認証情報を探しました。公開トークンだけが対象ではありません。[1], [2]

ステップ 4

複製

盗んだ公開権限で被害者が保守する他のパッケージも変更、公開でき、感染が広がりました。[1], [2]

ソースコード比較:脆弱 vs 堅牢化

安全な Python のインストール計画の比較です。どちらの関数も npm を実行せず、認証情報を読まず、レジストリに接続しません。npm v10 の文書に従っています。改善版はレビュー済みのロックファイルを必要とし、ライフサイクルスクリプトを抑止して環境を引き継ぎません。実際の実行環境は既知の npm と隔離されたホームや設定を用意し、秘密情報や機密のマウントを持たせないでください。--ignore-scripts は後から読み込むコードや明示的に起動したスクリプトを安全にしません。ロックファイルもコードの安全性を証明しません。

脆弱な実装
def install_plan(reviewed_lockfile, inherited_env):
    # 計画のみを返す。パッケージのインストールやコマンドの実行は行わない。
    return {"argv": ["npm", "ci"],
            "env": dict(inherited_env)}
堅牢化されたセキュアパッチ
def install_plan(reviewed_lockfile, inherited_env):
    # 計画のみを返す。パッケージのインストールやコマンドの実行は行わない。
    if reviewed_lockfile is not True:
        raise ValueError("Review the lockfile before installation")
    return {"argv": ["npm", "ci", "--ignore-scripts"],
            "env": {}}

エンジニアリング&システム堅牢化チェックリスト

参考資料