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]
ステップ・バイ・ステップの攻撃フロー
ステップ 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": {}}
エンジニアリング&システム堅牢化チェックリスト
- ✓レビュー済みロックファイルと npm ci --ignore-scripts を依存関係の導入作業で必須にし、CI の方針試験でコマンドと認証情報のない環境を確認します。必要なビルド処理は審査後に別の隔離作業で実行します。[3]
- ✓公開資格やクラウド資格を依存関係の導入作業から外し、ホーム内のファイル、マウント、実行者の権限も対象とします。公開資格が得られないことを試験します。[1], [2]
- ✓利用できる場合は信頼された公開方式を使い、認可される処理、ブランチ、環境を制限して変更を審査します。フィッシングに強い MFA を要求し、不要なトークンを廃止します。[1]
- ✓露出が確認されたら実行環境を隔離して作り直し、該当する認証情報を失効させ、パッケージ版と処理の変更を監査します。依存コードを確認してください。ロックファイルや更新猶予だけでは安全性は証明できません。[1], [2]