Bundler cooldown オプションでサプライチェーン攻撃を緩和
Bundler 4.0.13 が提供する時間ベースの cooldown フィルタを Gemfile の source 行に組み込むことで、公開直後の gem が自動的に解決対象から除外され、供給チェーン攻撃のリスクを低減します。
背景
サプライチェーン攻撃は、gem がリリースされた数日以内に悪意あるコードが混入するケースが増えていることが背景です。開発者は新バージョンを速やかに取り入れる慣習があるため、十分な検証が行われないまま依存関係が更新されるリスクがあります。Bundler はこの脅威に対処すべく、公開から一定期間が経過したバージョンのみを解決対象とする cooldown フィルタを導入しました。
技術的な変更
Gemfile の 1 行目に cooldown: 5 オプションが追加され、Bundler が gem を解決する際に最低 5 日間の公開待機を要求するようになりました。
# frozen_string_literal: true
-source "https://rubygems.org"
+source "https://rubygems.org", cooldown: 5
group :development, :test do
gem "rake"
end
同様の変更はテスト用 Gemfile が配置されている gemfiles/rails_72 と gemfiles/rails_80 ディレクトリでも行われ、Rails バージョン別のテスト環境でも一貫した防御が確保されています。
# frozen_string_literal: true
-source "https://rubygems.org"
+source "https://rubygems.org", cooldown: 5
# frozen_string_literal: true
-source "https://rubygems.org"
+source "https://rubygems.org", cooldown: 5
Gemfile.lock には cooldown 設定自体の記載は不要で、今回の PR では多数の gem バージョンが通常の依存解決に伴い更新されていますが、これらは cooldown 機能の動作に直接影響しません。
設計判断
cooldown 機能は source のオプションとして導入 されたため、既存の Bundler 設定構造を変更せずに新機能を提供しています。source 行を変更するだけで有効になるため、cooldown を利用しないプロジェクトは従来通りの解決ロジックで動作し、互換性リスクが最小化されています。また、cooldown の日数はユーザーが自由に設定可能であり、プロジェクトのリリースサイクルやリスク許容度に応じて柔軟に調整できます。
まとめ
Bundler の cooldown オプションを Gemfile に組み込むことで、公開直後の gem が自動的に解決対象から除外され、サプライチェーン攻撃のリスクが実装レベルで軽減されます。設定は既存の source 行の一部書き換えだけで済み、Rails バージョン別テスト環境でも同様に適用できるため、プロジェクト全体の依存管理セキュリティが向上します。