テック技報最新号へ →
セキュリティ

Cargo でも「公開直後の版」を待つ(Rust 1.100 の global-min-publish-age)

Rust 1.100(2026-11-12 予定)から、Cargo に「公開から一定期間たっていない crate の版を選ばない」設定が安定版で入る。npm の minimumReleaseAge と同じ考え方で、悪意ある版が見つかって消されるまでの時間を稼ぐ。

@SocketSecurity · 2026-10-21
#supply-chain#rust#cargo#cooldown#dependency-management

なぜ効くか

  • 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 固定や依存の監視と組み合わせる。

出典

X の元の投稿を開く