NPMサプライチェーンの保護: safe-install入門

Node.jsのエコシステムは、サプライチェーン攻撃に悩まされています。パッケージがインストール中に任意のスクリプトを実行できる機能は、一部のビルドプロセスには不可欠ですが、開発者にとっては危険な脆弱性となっており、長らく重大な攻撃ベクトルとなってきました。Bunのような一部のモダンなランタイムは、これらのスクリプトを制限するメカニズムを導入していますが、標準的なnpmエコシステムは、デフォルトでは依然として大部分がオープンな状態です。

インストールスクリプトの課題

多くのnpmパッケージは、ネイティブモジュールをコンパイルしたり、初期セットアップを実行したりするために、preinstallpostinstall、およびinstallスクリプトを使用します。しかし、このメカニズムにより、依存関係ツリー内のあらゆるパッケージ(深いサブ依存関係を含む)が、npm installプロセス中にマシン上でコードを実行できてしまいます。もしパッケージが侵害された場合、悪意のある攻撃者はこれらのスクリプトを使用して、環境変数、SSHキー、またはビルドパイプラインに悪意のあるコードを注入することが可能です。

safe-installの紹介

npmのネイティブ機能におけるこれらのギャップに対処するため、safe-installは、インストールプロセスに詳細な制御をもたらす軽量なツールとして開発されました。これは、主に2つのセキュリティ強化に焦点を当てています:

1. 信頼できるビルド依存関係

Bunの「trusted dependencies」機能と同様に、safe-installは、開発者がデフォルトでインストールスクリプトを無効にし、ビルドまたはインストールスクリプトの実行を許可する依存関係の明示的な許可リスト(allow-list)を維持することを可能にします。これにより、セキュリティモデルを「すべて許可」から「すべて拒否、一部を許可」へとシフトさせ、プロジェクトの攻撃対象領域を大幅に削減します。

2. 異質なサブ依存関係のブロック

pnpmのblockExoticSubdeps設定から着想を得て、safe-installは、異質なサブ依存関係をブロックする機能を提供します。これにより、package.jsonで明示的に宣言されていないパッケージや、依存関係ツリーにおいて予期しないパッケージのインストールを防ぎ、依存関係の混乱(dependency confusion)や、悪意のあるパッケージの隠密な追加のリスクを軽減します。

サプライチェーンセキュリティへの代替アプローチ

safe-installは、ローカルな保護のための開発者中心のツールを提供しますが、コミュニティの議論では、開発の規模に応じて異なる戦略が必要であることが強調されています。

エンタープライズグレードのリポジトリ管理

大規模な組織では、標準的な慣行として、「カウボーイ的なインストール」を完全に回避することが一般的です。NexusやArtifactoryのようなツールは、内部ミラーおよびプロキシとして機能します。このモデルでは、開発者はパブリックなnpmレジストリから直接プルするのではなく、IT部門によって検証され、セキュリティチェックを通過したパッケージのみがホストされている内部リポジトリからプルします。

アーティファクトミラーリング

単純なユーティリティと完全なエンタープライズリポジトリの中間を求める場合、artifact-keeperのようなアーティファクトミラーは、パッケージのゲートキーパーとして機能します。これらは、どのパッケージのどのバージョンが環境への導入を許可されるかを管理するための、より構造化された方法を提供し、パブリックなレジストリとローカルな開発環境の間に隔離層を提供します。

結論

npmサプライチェーンの保護は、多層的な取り組みです。safe-installによる詳細なスクリプト制御、Artifactoryにおける厳格な内部ミラーの実装、または専門的なアーティファクトキーパーの使用など、その目的はすべて同じです。それは、インストールフェーズにおけるサードパーティ製コードへの信頼を最小限に抑えることです。

Sources