GitHubは、来月リリース予定のnpm v12において、「npm install」コマンド実行時の動作を悪用したサプライチェーン攻撃をブロックすることを目的とした、セキュリティ重視の複数の変更を導入すると発表しました。
「npm install」は、プロジェクトの依存関係をダウンロード・インストールし、各パッケージが定義したインストール関連スクリプトを実行するためのコマンドです。
開発者はプロジェクトのクローン後、アップデートの取得後、またはCI/CDビルド時にこのコマンドを実行します。攻撃者がこのコマンドを標的にする理由は、パッケージのインストール中にコードが自動実行される可能性があるためです。
今回の発表の核心は、現在「npm install」実行時に自動でトリガーされるコード実行や非レジストリの依存関係ソースが、今後はデフォルトで信頼されるのではなく、明示的な承認が必要になるという点です。
具体的には、GitHubは以下の変更を発表しました。
- バージョン12以降、npm installは明示的に承認されていない限り、依存関係のpreinstall・install・postinstallスクリプトを実行しなくなります。これはnode-gypを通じてトリガーされるネイティブモジュールのビルド、およびGit・ローカルファイル・リンクされた依存関係のprepareスクリプトにも適用されます。
- 明示的に許可されていない限り、npm installはGitリポジトリからの依存関係(直接・推移的を問わず)を取得しなくなります。GitHubによると、インストールスクリプトが無効化されている場合でも、Git依存関係の.npmrcファイルによって使用するGit実行ファイルが変更される可能性があるコード実行経路が、この変更によって排除されるとのことです。
- HTTPSのtarballなどリモートURLからインストールされる依存関係は、明示的に許可されていない限り解決されなくなります。これは直接・推移的の両方の依存関係に適用されます。
これらの変更により、依存関係インストールスクリプトの自動実行、Gitベースの依存関係の自動解決、リモートURLの依存関係の自動解決がそれぞれ排除され、サプライチェーン攻撃のリスクを大幅に低減できます。
この新しいデフォルト設定は、最近のサプライチェーン攻撃で使用されたいくつかの攻撃手法を無効化できた可能性があります。
具体的には、悪意あるpreinstall/postinstallスクリプトを使ったキャンペーン(eslint-config-prettierを標的にしたもの、ToptalのPicassaパッケージを悪用したもの、情報窃取型npmパッケージ多数)、およびShai-Hulud攻撃で報告されたGit依存関係の悪用などが該当します。
これらの動作を正規のワークフローで利用しているプロジェクトは、npm v12へのアップグレード前に明示的なオプトインが必要になります。
GitHubは、まずnpm 11.16.0以降にアップグレードすることを推奨しています。このバージョンでは、バージョン12で動作しなくなるすべての操作に対して警告が表示されます。
これにより、通常のインストール作業を行いながら警告内容を確認し、アップグレード前に明示的な承認が必要な依存関係やワークフローを事前に把握できます。
バージョン12へのアップグレード後は、明示的に承認されたスクリプトおよび依存関係ソースのみが引き続き自動的に機能します。
今後の変更に関する意見を共有できるよう、コミュニティディスカッションが開設されています。
攻撃者より先に全レイヤーをテストする
セキュリティチームが記録する攻撃成功率は54%ですが、アラートが発せられるのはそのうち14%に過ぎません。残りの脅威は環境内を検知されることなく移動しています。
Picusのホワイトペーパーでは、侵害・攻撃シミュレーションを活用してSIEMおよびEDRのルールをテストし、脅威が検知をすり抜けないようにする方法を解説しています。