Cargo でも「公開直後の版」を待つ(Rust 1.100 の global-min-publish-age)
Rust 1.100(2026-11-12 予定)から、Cargo に「公開から一定期間たっていない crate の版を選ばない」設定が安定版で入る。npm の minimumReleaseAge と同じ考え方で、悪意ある版が見つかって消されるまでの時間を稼ぐ。
なぜ効くか
- 2026 年 8 月、
arrayref・internment・append-only-vecの侵害版が悪意あるproc-macro1に依存する形で公開された。crates.io に残っていたのは 86〜107 分だけだったが、その間に依存更新した開発端末や CI には入り込めた。 - 待機期間を置けば、この「消されるまでの数時間〜数日」をやり過ごせる。npm 側の同じ対策は 依存パッケージの「クールダウン」設定(minimumReleaseAge / min-release-age) を参照。
設定
.cargo/config.toml(プロジェクト or ~/.cargo/config.toml)に書く。
toml
[registry]
global-min-publish-age = "7 days"- 単位は秒・分・時間・日・週・月が使える。
- 既定値は 0。Rust を上げるだけでは何も変わらないので、明示的に書く。
[resolver] incompatible-publish-ageの既定は"deny"。待機期間を満たす版がなければ、古い版にこっそり戻るのではなく解決に失敗する。攻撃者が安全な版を yank して悪意ある版だけ残す手口(実際にarrayrefで起きた)への備えになっている。
急ぎの修正を入れたいとき
その 1 回だけ年齢チェックを外して、版を指定する。
bash
CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE=allow cargo update -p some-crate --precise 1.2.3- 一度
Cargo.lockに入った版は、以後も待機期間に関係なく使われる。
注意点
cargo installには効かない。Git 依存・path 依存・公開日時を返さないレジストリも対象外。- 2026-10-21 時点では beta のみで、安定版は 1.100 から。
- 待てば安全になるわけではない。見つからなかった悪意ある版は期間を過ぎれば入ってくる。「検知する側に時間を渡す」対策として、lockfile 固定や依存の監視と組み合わせる。
出典
- @SocketSecurity · 2026-10-21
- Socket「Rust 1.100 Will Add Dependency Cooldowns to Cargo」: socket.dev