2026年6月Dependabotに修正が入り、SHA固定したpre-commitフックを、cooldown指定付きで自動更新できるようになりました。
以前からDependabotのpre-commitアップデーターは、SHA固定バージョンの更新も、cooldown指定での更新もサポートしていました。しかし、SHA固定とcooldownの両条件が同時に揃うと、全バージョンがcooldown期間内にあると誤判定されてしまう不具合があり、これまで更新ができませんでした。この不具合が修正され、SHA固定&cooldown指定でpre-commitフックの自動更新ができるようになりました。
サプライチェーンセキュリティに関わるSHA固定とcooldown設定
SHA固定もcooldown設定も、サプライチェーンセキュリティを高める重要な要素です。
SHA固定とは、自プロジェクトが依存するプログラムのバージョン指定として、vX.X.Xのようなバージョン番号を使わずに、Gitコミットハッシュ値 (SHAハッシュ値)を指定することを指します。SHA固定はタグ改竄攻撃の防止策となります。
cooldownとは、依存プログラムの新バージョンがリリースされたときに、すぐにそのバージョンへ更新するのではなく、一定のクールダウン期間が過ぎた後に更新することを言います。悪性バージョンが出回ったときのリスク緩和策となります。※本稿ではDependabotの設定にならい cooldownと呼んでいますが、サービスやツールによっては他の名称で呼ばれることもあります。
以下、それぞれ具体的な設定方法を説明します。
pre-commitフックのバージョン指定方式
pre-commitフックのバージョン (rev) 指定の主要な方式として、リリースタグ方式とSHA固定方式があります。
リリースタグ方式
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
# ↓リリースタグを指定
rev: v5.0.0
hooks:
- id: check-yaml
リリースタグ方式は、pre-commit本家が採用していたり、公式ドキュメントでも真っ先に例示されている、典型的な設定方式です。Web上に見られるpre-commit設定サンプルの大部分もこの方式が使われています。
しかしながら、リリースタグが実際に指すリビジョンは書き換えられるリスクがあります。タグの指す先を悪意あるリビジョンに書き換えて悪性コードを実行させること (タグ改竄攻撃) が可能です。ミュータブルなタグは、信頼性もミュータブルです。
SHA固定方式
タグ改竄攻撃対策として、可変なタグの代わりに、タグに対応する固定のコミットハッシュ値 (SHA) を指定する方式が利用できます。コミットのハッシュ値は不変なので意図せず内容が書き換えられる恐れがありません (なお、理論上はSHA-1の同一ハッシュ値を持つ悪性コミットを生み出す衝突攻撃が可能ですが、GitHub等主要なプラットフォームではハッシュ値衝突を検出して拒否する機構を設けていたりと、現実的な攻撃成立は困難です)。
pre-commitフックのSHA固定方式の設定例は以下の通りです。
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
# ↓リリースタグに対応するコミットハッシュを指定
rev: cef0300fd0fc4d2a87a85fa2093c6b283ea36f4b # frozen: v5.0.0
hooks:
- id: check-yaml
タグ改竄攻撃は、GitHub Actions設定を利用したサプライチェーン攻撃の代表的な手法としても知られており、対策としてGitHubもSHA固定を推奨しています。
cooldown設定
Dependabotでは、依存パッケージの新バージョンリリース後、一定期間更新を遅らせるcooldown設定が可能です。新バージョンに悪性コードが含まれるリスクがあるので、不正を検出する隔離期間として機能します。サプライチェーン攻撃のリスク緩和策として、Dependabotのような自動更新システムでは重要な機能となります。
pre-commitエコシステムでの設定例は以下の通りです。
version: 2
updates:
- package-ecosystem: "pre-commit"
cooldown:
default-days: 7
Dependabotの更新例
pre-commit設定
設定には少し注意点があるので、繰り返しになりますが、実際に動作可能かつミニマムな設定例を取り上げます。
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: cef0300fd0fc4d2a87a85fa2093c6b283ea36f4b # frozen: v5.0.0
hooks:
- id: check-yaml
注意点として、pre-commitフックのrev値には、コミットハッシュに続いて、# frozen: vX.X.X というコメントが必要です (vX.X.X の部分はGitタグ名に置き換えてください)。このコメントが無いと自動更新されません。
# frozen: vX.X.X というコメントが必要だと述べましたが、frozen: 無しの # vX.X.X というコメントだけでも更新はされました。ただし、これはアンドキュメンテッドな挙動なので、frozen:を付けた方が無難でしょう。
また、コメントが無いと更新されないとも書きました。この挙動は、実はドキュメントの記述と一致しません。ドキュメントには、コメントが無い場合、デフォルトブランチのHEADのSHAに更新される (Updated to the HEAD SHA of the default branch.) と書かれています。しかしながら、リリースタグさえ打たれていないHEADに更新するなんて、控えめに言っても常軌を逸しています。更新しないという実際の挙動の方がまだ適切でしょう。おそらくドキュメントの不備ではないかと思われます。
Dependabot設定
version: 2
updates:
- package-ecosystem: "pre-commit"
directory: "/"
schedule:
interval: "weekly"
cooldown:
default-days: 7
こちらは特に注意点はありませんが、あえて一つ挙げるとすれば、pre-commitのcooldown設定には、バージョン種別 (メジャーアップデート、マイナーアップデート等) 毎の細かな期間設定ができないという点でしょうか (本稿執筆時点)。
DependabotによるPR内容
以下のdiffは、実際にDependabotが作ったPRの内容です。コミットハッシュの更新はもちろん、コメントのタグもしっかり更新できています。SHA固定バージョンの更新管理という面倒な作業を自動化できることがわかると思います。
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: cef0300fd0fc4d2a87a85fa2093c6b283ea36f4b # frozen: v5.0.0
+ rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # frozen: v6.0.0
hooks:
- id: check-yaml
まとめ
Dependabotで、SHA固定pre-commitフックをcooldown付きで自動更新できるようになったこと、またその具体的な方法を紹介しました。
SHA固定、cooldown設定ともに、現在激しさを増しているサプライチェーン攻撃に対する防御策として、重要な要素となるものです。一方で、SHA固定バージョンの更新管理は面倒なタスクでもあり、これを自動化できることは継続的な運用という面で大きなメリットがあります。Dependabotによる継続的な依存性管理をよりセキュアにするという観点でぜひ活用してみてください。
