
2026/03/05 9:21
パッケージマネージャーは冷却が必要です
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
主なメッセージ:
パッケージエコシステムは、最近のサプライチェーン攻撃を抑制するために「依存関係クールダウン」機構(新しく公開されたパッケージが即座に使用できないようにする設定可能な待ち時間)を採用しつつあります。目標は、全てのマネージャーでサポートできる(例:7d)のようなグローバルに構成可能なフラグです。exclude-newer-than=<duration>
重要性
Seth Larson のリクエストと William Woodruff が 2025 年末に行った分析では、最近の攻撃のうち 10 件中 8 件が 1 週間以内に実行できることが示されました。これがクールダウンを導入してその時間窓を閉じる動機となっています。
各エコシステムでの現状:
JavaScript: pnpm (v10.16, 2025 年 9 月)、Yarn (minReleaseAgev4.10.0, 2025 年 9 月)、Bun (npmMinimalAgeGatev1.3, 2025 年 10 月)、npm (minimumReleaseAgev11.10.0, 2026 年 2 月)、Deno (min‑release‑age)。--minimum-dependency-age
Python: uv (, 相対期間をサポートする v0.9.17 Dec 2025) と pip (--exclude-newer, 絶対タイムスタンプを使用する v26.0 Jan 2026)。--uploaded-prior-to
Ruby: ネイティブサポートなし。gem.coop のベータサービスは新しい gem に 48 時間の遅延を課し、Bundler ユーザーにツール変更なしで影響します。
Rust: Cargo は RFC とレジストリ側クールダウンインフラ(v1.94 Mar 2026)を持ち、でオプトイン可能。サードパーティラッパーcargo update foo --precise …も存在します。cargo-cooldown
Go, Composer, NuGet, .NET: 提案段階または初期施行段階にあり、Dependabot はすでに NuGet にクールダウンを適用しています(2025 年 7 月以降)。
サポートツール:
Renovate、Dependabot、Snyk、および npm‑check‑updates は、さまざまなデフォルトでクールダウンロジックを実装またはサポートしています。zizmor の、StepSecurity の GitHub PR チェック、OpenRewrite、pinact、prek などの監査ツールはクールダウン設定の挿入を自動化します。dependabot-cooldown
用語と相互運用性:
各エコシステムでは、cooldown、minimumReleaseAge、min-release-age、npmMinimalAgeGateなど異なる名前が使われており、クロス言語プロジェクトを複雑にしています。あるツールは再現性のため絶対タイムスタンプを強制し、別のツールは相対期間でスライディングセキュリティウィンドウを使用します(uv は ISO 8601 とフレンドリー文字列両方をサポート、pip は単純な日数を好みます)。exclude-newer
広い文脈:
apt、brew、Fedora などのシステムパッケージマネージャはすでに暗黙的なレビューウィンドウを提供しています。言語エコシステムに明示的な遅延を追加すると、人間のゲートキーパーが重複し、不要なコストが発生します。そのためクールダウンは高速リリース環境向けのターゲットセキュリティ対策です。
将来展望:
提案が成熟するにつれて、より多くのエコシステムがクールダウンを採用し、オープンソースプロジェクトは言語間で構成を統一するために共有フラグやラッパーを標準化できるようになります。これらの対策はセキュリティを強化しますが、ビルドパイプラインの複雑さも増し、クロス言語依存関係の更新速度が遅くなり、リリースサイクルに影響を与える可能性があります。
主なポイント: 改良された要約は、主要リストからすべての重要点を保持し、不必要な推測を避け、明確で簡潔なナラティブを提示し、曖昧な表現を削除しています。
本文
この投稿は、Seth Larson が「パッケージマネージャー全体でグローバルに設定できる exclude-newer-than(例:
7d)を導入し、自律的な悪用の応答時間を人間が介入できるレベルへ戻す」ことを依頼して作成されました。彼の提案は次のようにまとめられます。
攻撃者がメンテナーの認証情報を乗っ取ったり、休眠中のパッケージを掌握した場合、悪意あるバージョンを公開し、自動化ツールがそれを数千のプロジェクトへ取り込むまで誰も気付かないまま待つことです。William Woodruff は 2025 年 11 月に依存関係クーリングダウンについて提唱し、1 ヶ月後にリデュース版で「パッケージバージョンをレジストリ上に一定期間(最低でも数日)置いておくまでインストールしない」ことがコミュニティとセキュリティベンダーに問題を指摘する時間を与えると述べました。
彼が検証した 10 件のサプライチェーン攻撃のうち、8 件は機会窓が 1 週間未満であったため、たとえ 7 日程度のクーリングダウンでもほぼすべてを阻止できるという結論に至ります。
ツールごとに呼び名は異なり(cooldown, minimumReleaseAge, stabilityDays, exclude-newer など)、実装もロールリング期間か絶対時刻か、直接依存だけか転移依存までを対象にするか、セキュリティ更新が除外されるか等で差があります。しかし、過去一年での採用は驚くほど速いです。
JavaScript
| パッケージマネージャー | 追加された機能 | 発表時期 |
|---|---|---|
| pnpm | (直接・転移依存共に)+信頼できるパッケージを除外する リスト | v10.16 (2025 年9月) |
| Yarn | (分単位で設定)+除外リスト | v4.10.0 (同月) |
| Bun | を から設定 | v1.3 (2025 年10月) |
| npm | | v11.10.0 (2026 年2月) |
| Deno | (・で使用) |
6 ヶ月で 5 つのパッケージマネージャーが導入。競合ツール間での機能統一は前例がほとんどありません。
Python
| パッケージマネージャー | 機能名 | 発表時期 |
|---|---|---|
| uv | (絶対時刻)+相対期間 (, ) とパッケージ別オーバーライド | v0.9.17 (2025 年12月) |
| pip | (絶対時刻のみ) | v26.0 (2026 年1月) |
相対期間サポートは pip には未実装です。
Ruby
Bundler と RubyGems はネイティブにクーリングダウンを持ちませんが、コミュニティ運営の gem サーバ gem.coop がベータ版で新規公開パッケージに 48 時間の遅延を課しています。
インデックスレベルで遅延を適用すれば、gem.coop エンドポイントを指す Bundler ユーザーはツールやワークフローを変更せずにクーリングダウンが有効になります。
Rust, Go, PHP, .NET
| 言語 | 状況 |
|---|---|
| Cargo | RFC が進行中。レジストリ側のインフラは Cargo 1.94 (2026 年3月5日リリース) で安定化予定。 * アクセプションリストなし、 でオプトインし、ロックファイルに記録。* 一方で はサードパーティラッパーとして開発者マシンでクーリングダウンを検証する概念実証です。 |
| Go | , 用のオープンプロポーザルが存在。 |
| Composer | 2 件のオープンイシュー。 |
| NuGet | イシューは開いているが、Dependabot を利用する .NET プロジェクトは 2025 年7月から更新ボット側でクーリングダウンを受けています。 |
依存関係更新ツール
| ツール | 機能名 | 備考 |
|---|---|---|
| Renovate | (旧 )「pending」ステータスで時間が経過するまで待機。 で npm パッケージのデフォルトを 3 日に設定。 | |
| Dependabot | に cooldown ブロック(, 等)。セキュリティ更新はクーリングダウンをバイパスします。 | |
| Snyk | 自動 PR で 21 日の固定クーリングダウン(非設定可)。 | |
| npm‑check‑updates | に期間接尾辞 (, ) を許容。 |
設定確認ツール
- zizmor – v1.15.0 で
の監査ルールを追加、デフォルト閾値は 7 日。自動修正も可能。 |dependabot-cooldown - StepSecurity – GitHub PR チェックで npm パッケージのクーリングダウン期間内にリリースされたものを拒否。 |
- OpenRewrite –
レシピで Dependabot 設定ファイルへ自動追加。 |AddDependabotCooldown - GitHub Actions –
でpinact
フラグ、Rust 製--min-age
はprek
を付与。 |--cooldown-days
現状未対応
Go, Bundler, Composer, pip においてクーリングダウンは議論中か部分的にしか実装されていません。Dependabot や Renovate で自動更新を遅延させることはできますが、ローカル実行(
bundle update, go get 等)は数分前のレジストリにあるバージョンを取得できてしまいます。
Maven, Gradle, Swift Package Manager, Dart の pub, Elixir の Hex などでクーリングダウンが議論されているケースは見つかりませんでした。もし知っていればお知らせください。投稿を更新します。
設定名の多様性
サポートしているツール間では、少なくとも十種類以上の設定名が存在します。
,cooldown
,minimumReleaseAge
,min-release-agenpmMinimalAgeGate
,exclude-newer
,stabilityDays
,uploaded-prior-tomin-age
,cooldown-daysminimum-dependency-age
ポリグロットプロジェクトで設定を整えるのは、文章を書くよりも難しいかもしれません。
言語パッケージマネージャー vs. システムパッケージマネージャー
npm, PyPI, RubyGems では
publish(npm publish, gem push)で即座に全世界がインストール可能になります。Dependabot や Renovate がそのウィンドウ内で実行されれば、悪意あるコードは人間の介入無しにプロジェクトへ入り込みます。William が指摘したシナリオです。
対して、apt, Homebrew などのシステムパッケージマネージャーは「公開」から「配布」までを分離します。新しいアップストリームバージョンはレビュー・パッケージ化・ビルドされて初めて
apt install や brew install で利用可能になります。Debian は unstable へ最初にアップロードし、2〜10 日後に testing, さらに別のリリースプロセスで stable に移行します。これは人間がレビューするインターナルクーリングダウンと同等です。
言語エコシステムにレビューウィンドウを追加すると、セキュリティ研究者は悪意ある公開を検知してから自動化ツールがロックファイルへ取り込むまで数日間の時間を確保できます。Homebrew や apt に同じ機能を要求すると、本来人間が管理するプロセスに遅延が加わり、実際には逆に時間とコストが増える可能性があります。
タイムスタンプ問題
のpip
と npm の古い--uploaded-prior-to
は絶対時刻を取るため再現性に優れます。--before- 相対期間(例:7 日)はスライディングウィンドウとして機能し、セキュリティ機能として有効です。
uv の
--exclude-newer は両形式を受け付け、npm では絶対時刻用の --before と相対期間用の min-release-age が存在します。pnpm, Yarn, Bun, Deno は相対期間のみを許容します。
期間文字列の解析は面倒です。ISO 8601(
P7D)は曖昧さがなく長いですが、読みやすい文字列(7 days)は扱いやすい一方でパーサーが必要です。月・年といった可変長カレンダー単位を処理するには月の知識が必須です。uv は ISO 8601 とフレンドリ文字列を採用し、月・年は除外しています。pip のメンテナーは「日数のみ」を受け付ける方向に傾いています。
タイムゾーンも別問題です。CI サーバが UTC で動作し、開発者のノートパソコンが米国太平洋時間、レジストリが PyPI の設定タイムゾーンを使用していると、6 日 22 時間前に公開されたパッケージがクーリングダウンチェックを通過するかどうかで数時間の差が生じます。