--ignore-scripts では防げない?npm連続侵害から考えるサプライチェーン攻撃の恐怖
正規のnpmパッケージに攻撃コードが仕込まれるサプライチェーン攻撃が相次いで発生した。
これまでのマルウェアといえば、インストール時に自動で走るスクリプト(preinstall や postinstall など)に仕込まれるのが主流だった。
そのため、npm install --ignore-scripts を指定しておけば安全だという認識が一般的だったはずだ。
しかし、今回確認された手法ではパッケージ本体のコード(dist/index.js など)の先頭に攻撃コードが埋め込まれていた。
これによって、インストール時には何事も起きず、アプリやCI環境でモジュールが import や require によって読み込まれた瞬間、あるいはCLIが実行されたタイミングで初めてマルウェアが起動する仕組みになっている。
インストールスクリプトをブロックする --ignore-scripts や、依存パッケージのスクリプトをデフォルトで停止する npm v12 の防御策も、コードが読み込まれた時点で発動する攻撃には一切効果がないという点が非常に恐ろしい。
一連の事例(Microsoft Security Blog などで解説されている AsyncAPI の侵害など)を見ると、攻撃者がセキュリティの抜け道を巧みに突いてきていることがよく分かる。
「スクリプトの実行を防げば安心」という従来の前提は見直さざるを得ない。
lockfile の厳格な管理はもちろん、min-release-age を活用して公開直後のパッケージを自動で取り込まないように工夫することや、CI環境で渡す環境変数・認証情報の権限を最小限に抑えるといった多層的な防御策を導入していく必要性を強く感じた。