npm v11.10.0 の新機能 min-release-age を試してみた(サプライチェーン攻撃対策)
こんにちは。CX 事業本部製造ビジネステクノロジー部所属の hongki です。
npm v11.10.0 で、pnpm にあった minimumReleaseAge と同等の機能である min-release-age が追加されました。
今回はこの機能について、既存の before オプションとの違いや、サプライチェーン攻撃への対策としてどのように活用できるかを解説していきたいと思います。
min-release-age とは?
min-release-age は、公開から一定日数が経過していないパッケージのインストールを防ぐ機能です。
If set, npm will build the npm tree such that only versions that were available more than the given number of days ago will be installed.
例えば min-release-age=3 と設定すると、公開から 3 日未満のバージョンはインストールされません。
npm install --min-release-age=3
どんな場面で役に立つのか?
近年、npm パッケージを狙ったサプライチェーン攻撃が増加しています。
正規のパッケージに悪意のあるコードを仕込んだり、名前が似ているパッケージを公開してインストールさせるといった手法です。
こうした悪意のあるパッケージは、公開後すぐにレジストリから削除されるケースが多いため、
公開直後のバージョンをインストールしないようにするだけで、リスクを大幅に軽減できます。
min-release-age を設定しておけば、こうしたリスクに自動で対応できます。
既存の before オプションとの違い
npm にはもともと before というオプションがありました。
npm install --before=2026-02-20
before は指定した日付より前に公開されたバージョンのみをインストールするオプションです。
しかし、この方法には以下のような課題がありました。
| 項目 | before | min-release-age |
|---|---|---|
| 指定方法 | 絶対日付(例: 2026-02-20) | 相対日数(例: 3) |
| 運用 | 手動で日付を更新する必要がある | 常に現在日時から自動計算 |
| 使いやすさ | 毎回日付を確認・変更する手間 | 一度設定すれば運用不要 |
before は固定の日付を指定するため、時間が経つにつれて古いバージョンしかインストールできなくなり、定期的に日付を更新する必要がありました。
min-release-age は「現在から N 日前」という相対的な指定なので、一度設定すれば常に動的に計算されます。
設定方法
コマンドラインで指定
npm install --min-release-age=3
.npmrc に設定
プロジェクトルートの .npmrc ファイルに記述することで、プロジェクト全体に適用できます。
min-release-age=3
注意点
before と min-release-age は併用できません。
両方を指定した場合はエラーになります。
内部的には min-release-age が before の値に変換されて動作するため、どちらか一方しか使えません。
# min-release-age=30 を指定すると、内部的には以下のように変換される
# before = "2026-01-26T17:45:11.360Z" (実行日の30日前)
やってみた
実際に min-release-age を使って動作を確認してみます。
検証環境
| 項目 | バージョン |
|---|---|
| OS | macOS 26.2 (M1) |
| Node.js | v24.5.0 |
| npm | v11.10.0 |
テスト対象として eslint を使います。2026 年 2 月 25 日時点での直近のリリース状況は以下の通りです。
| バージョン | リリース日 | 経過日数 |
|---|---|---|
| 10.0.2 | 2026-02-23 | 2 日 |
| 10.0.1 | 2026-02-20 | 5 日 |
| 10.0.0 | 2026-02-06 | 19 日 |
min-release-age なしでインストール
$ npm install eslint
added 68 packages in 1s
$ npm list eslint
└── eslint@10.0.2
最新バージョンの 10.0.2 がインストールされました。
min-release-age=14 でインストール
$ npm install eslint --min-release-age=14
added 68 packages in 754ms
$ npm list eslint
└── eslint@10.0.0
10.0.2(2 日前)と 10.0.1(5 日前)は 14 日の条件を満たさないため、
19 日前にリリースされた 10.0.0 がインストールされました。
バージョンを指定した場合
14 日未満のバージョンを直接指定してみます。
$ npm install eslint@10.0.2 --min-release-age=14
npm error code ETARGET
npm error notarget No matching version found for eslint@10.0.2
with a date before 2/11/2026, 10:00:06 PM.
バージョンを明示的に指定しても、min-release-age の条件を満たさない場合はエラーになりインストールできません。
このように、min-release-age を設定するだけで、公開から一定期間が経過していない新しいバージョンを自動的にスキップしてくれます。
pnpm の minimumReleaseAge との比較
pnpm にも同様の機能として minimumReleaseAge があります。
# pnpm-workspace.yaml
minimumReleaseAge: 1440
| 項目 | npm (min-release-age) | pnpm (minimumReleaseAge) |
|---|---|---|
| 単位 | 日 | 分 |
| 設定ファイル | .npmrc | pnpm-workspace.yaml |
| 設定例(1日) | min-release-age=1 |
minimumReleaseAge=1440 |
npm は日単位、pnpm は分単位という違いがあります。
npm の方がシンプルで直感的ですが、pnpm の方がより細かい制御が可能です。
npm に min-release-age が追加されたことで、この機能のためだけに pnpm へ移行する必要性は低くなりました。
既存の npm プロジェクトでも、同等のサプライチェーン攻撃対策が可能になります。
Aikido Safe Chain について
すでに Safe Chain を利用している方であれば、テスト中にこんなメッセージを見たことがあるかもしれません。
ℹ Safe-chain: Some package versions were suppressed due to minimum age requirement.
To disable this check, use: --safe-chain-skip-minimum-package-age
これは Aikido Safe Chain というサプライチェーン攻撃対策ツールによるものです。
Safe Chain はローカルプロキシサーバーとして動作し、パッケージのダウンロード時にリアルタイムでマルウェア検査を行います。
If malware is detected in any package (including deep dependencies), the proxy blocks the download.
悪意のあるパッケージが検出された場合、依存パッケージも含めてダウンロード前にブロックしてくれます。
Safe Chain にも Minimum Package Age 機能があり、デフォルトでは公開から 24 時間未満のパッケージを一時的に抑制します。
# 時間単位で閾値を変更可能
npm install express --safe-chain-minimum-package-age-hours=48
Safe Chain でも同じ条件で試してみる
先ほどと同じ eslint で、Safe Chain の Minimum Package Age を 336 時間(14 日)に設定してインストールしてみます。
$ npm install eslint --safe-chain-minimum-package-age-hours=336
npm error code ETARGET
npm error notarget No matching version found for minimatch@^10.2.1.
ℹ Safe-chain: Some package versions were suppressed due to minimum age requirement.
eslint 本体ではなく、依存パッケージの minimatch がエラーになりました。
minimatch の最新バージョン(10.2.4)は 2 日前にリリースされたばかりで、14 日の条件を満たさなかったためです。
Safe Chain はプロキシとして動作するため、直接指定したパッケージだけでなく、すべての依存パッケージに対しても公開からの経過時間がチェックされます。
一方で、npm の min-release-age も依存パッケージに対して公開からの経過時間がチェックされますが、条件を満たす古いバージョンを自動的に選択してくれます。
実際に先ほどの min-release-age=14 のテストでは、eslint の依存パッケージである minimatch も最新の 10.2.4(2 日前)ではなく、14 日の条件を満たす 10.2.0(15 日前) が自動的に選択されていました。
$ npm list minimatch
└─┬ eslint@10.0.0
├─┬ @eslint/config-array@0.23.1
│ └── minimatch@10.2.0 deduped
└── minimatch@10.2.0
npm の min-release-age は条件に合う古いバージョンを自動で選んでくれますが、Safe Chain はブロックするだけで代わりのバージョンは探してくれません。
そのため、依存関係の解決に失敗する場合があります。
npm の min-release-age との違い
| 項目 | npm (min-release-age) | Safe Chain (Minimum Package Age) |
|---|---|---|
| 仕組み | npm 本体の設定 | 外部プロキシツール |
| 単位 | 日 | 時間 |
| マルウェア検査 | なし | あり(リアルタイム) |
| 対象 | npm のみ | npm, yarn, pnpm, bun, pip 等 |
| 導入コスト | .npmrc に一行追加 |
ツールのインストールが必要 |
min-release-age は npm の設定だけで手軽に使える一方、Safe Chain はマルウェア検査も含めたより包括的な対策です。
それぞれカバーする範囲が異なるため、両方を併用することをおすすめします。
まとめ
min-release-age は .npmrc に一行追加するだけで使えるので、導入のハードルはかなり低いです。
- 公開から一定日数が経過していないバージョンのインストールを防げる
beforeと違って日付を手動で更新する必要がない- 依存パッケージにも自動で適用される
まだ設定していない方は、まず min-release-age=3 あたりから試してみてはいかがでしょうか。







