
安全な npm インストーラー。新たに侵害されたパッケージからプロジェクトを保護します。
npm パッケージへのサプライチェーン攻撃は増大する脅威です。攻撃者は正規のパッケージを侵害することがあります。その手段は次のとおりです。
こうした攻撃は突然発生することがよくあります。昨日まで安全だったパッケージが今日は侵害されている可能性があります。safe-npm は、公開から一定期間(デフォルトで 90 日)が経過したパッケージバージョンのみをインストールすることで、プロジェクトを保護します。これにより、セキュリティコミュニティが悪意のあるリリースを発見して報告する時間が確保され、プロジェクトに到達する前に防ぐことができます。
safe-npm install を実行すると、次の処理が行われます。
package.json またはコマンドライン引数から依存関係を読み取るたとえば、react@^18 を指定し、悪意のある [email protected] が昨日公開された場合、safe-npm は代わりに 90 日以上前に公開された最新バージョンをインストールします。
# Install globally
npm install -g @dendronhq/safe-npm
# Now you can use it anywhere
safe-npm install
# Clone and build
git clone <repository-url>
cd safe-npm
npm install
npm run build
# Link the binary globally
npm link
# Use the minimum age of 90 days (default)
safe-npm install
# Or specify your own minimum age
safe-npm install --min-age-days 120
# Install packages directly with version constraints
safe-npm install react@^18 lodash@^4.17.0
# These will be filtered to only use versions at least 90 days old
safe-npm install express --min-age-days 60
# Preview which versions would be installed without actually installing
safe-npm install --dry-run
--min-age-days <n>デフォルト: 90
パッケージバージョンをインストールできるようになるまでに、公開から経過していなければならない最低日数です。
例: --min-age-days 120 は、パッケージが少なくとも 4 か月前のものであることを要求します。
調整のタイミング:
--ignore <pkg1,pkg2>期間要件を適用しないパッケージのカンマ区切りリストです。これらのパッケージは semver 範囲には従いますが、最低期間は無視されます。
例: --ignore typescript,@types/node
使用する場面:
--strictいずれかの依存関係が期間要件を満たすバージョンに解決できない場合、エラーで終了します。
例: safe-npm install --strict
使用する場面:
--dev / --prod-onlypackage.json のどの依存関係を処理するかを制御します。
例:
safe-npm install --dev - devDependencies のみインストールsafe-npm install --prod-only - 本番依存関係のみインストール使用する場面:
--strategy <direct|overrides>デフォルト: direct
safe-npm が解決されたバージョンをインストールする方法です。
direct - 解決されたバージョンを npm install package@version で直接インストールします。
overrides - 解決されたバージョンを package.json の overrides フィールドに書き込み、その後 npm install を実行します。
--registry <url>デフォルト: https://registry.npmjs.org
代替の npm レジストリを指定します。
例: --registry https://registry.company.com
使用する場面:
--dry-run変更を加えずに、何がインストールされるかを表示します。
例: safe-npm install --dry-run
使用する場面:
# Create a new project
mkdir my-project && cd my-project
npm init -y
# Install dependencies safely
safe-npm install express@^4 lodash
# This creates package-lock.json with versions at least 90 days old
# Check what versions would be installed with age requirements
safe-npm install --dry-run
# If you're happy, install them
safe-npm install
# In your CI pipeline, fail the build if any package can't meet age requirements
safe-npm install --strict --min-age-days 120
# Or allow newer packages for dev dependencies only
safe-npm install --prod-only --strict
# Need to urgently update a specific package? Add it to ignore list
safe-npm install --ignore package-with-critical-fix
プロジェクトにはテストスイートが含まれており、次のコマンドで実行できます。
npm test
自動テストでは、フィクスチャを使用してレジストリの応答をモックできます。
export SAFE_NPM_FIXTURES=/path/to/fixtures.json
safe-npm install
フィクスチャファイルには、各パッケージの npm レジストリ応答を模した JSON を含める必要があります。
実際のシナリオ:
popular-lib が信頼できる開発者によってメンテナンスされている[email protected] を公開する^5.0.0 を使用しているプロジェクトは、すぐに悪意のあるバージョンをインストールしてしまう4.9.0(90 日以上前に公開された最新バージョン)を使い続けるセキュリティはトレードオフです。safe-npm は、突然のサプライチェーン侵害に対する保護と引き換えに、最先端のアップデートを犠牲にします。これは多層防御戦略の 1 つの層であり、次の要素も組み合わせるべきです。
npm audit)ISC