2026年11月12日にリリース予定の Rust 1.100 で、Cargoの依存関係クールダウン機能が正式に(安定版として)サポートされます。開発者は、新たに公開されたパッケージのバージョンについて、設定した最低経過期間に達するまで採用を拒否できるようになります。
この機能により、セキュリティ研究者やメンテナー、レジストリ運営者は、悪意あるリリースを見つけ出すための時間を確保できます。自動更新によって開発環境やCIパイプラインへのアクセスに被害が広がる前に、対処できる余地が生まれます。Rustのリリースノート草案にも、この機能の安定化が明記されています。
Cybersecuritynews platform
この保護機能はオプトイン方式です。Cargoの最低公開経過期間のデフォルト値はゼロのままです。つまり、Rustをアップグレードしただけでは、依存関係の採用は遅延されません。
保護を有効にするには、チームが経過期間のしきい値を設定する必要があります。この機能は依存関係の選択を絞り込むものであり、パッケージ内の悪意あるコードをスキャンするものではありません。
このセキュリティ上の意義は、8月に起きたarrayref、internment、append-only-vecの侵害で具体的に示されました。
これらの悪意あるバージョンは、proc-macro1というクレートを持ち込みました。このクレートのビルドスクリプトは、悪意あるペイロードをダウンロードする仕組みでした。
公開から削除までの時間は短かったものの、問題点は明らかです。調査担当者による検証やレジストリでの削除が完了する前に、依存関係の解決によって攻撃者が仕掛けたコードが配布されてしまう可能性があります。
待機期間を設定しておけば、該当バージョンがまだロックされていない限り、新たに依存関係を解決するプロジェクトがその期間中にこうしたリリースを選ぶことを防げます。
攻撃者は、正規のarrayrefリリースをyank(取り下げ)することもしていました。この手口は、Cargoの適用モデルと直接関わります。
単に古いパッケージを優先するだけでは、危険なフォールバックが残ります。安全なバージョンが候補から消えた場合、リゾルバーが悪意ある新しいバージョンを受け入れてしまう恐れがあるからです。そこでCargoは、設定した期間に満たないバージョンを拒否します。依存関係の要件を満たす適格なバージョンがない場合は、解決を失敗させます。
Rust 1.100でCargoを強化
7日間の遅延を有効にするには、.cargo/config.tomlの[registry]配下にglobal-min-publish-age = "7 days"を追加します。
期間の単位には、秒、分、時間、日、週、月を指定できます。resolver.incompatible-publish-ageの設定はデフォルトで"deny"のため、通常はリゾルバー側の設定を追加する必要はありません。
依存関係の解決時、Cargoはしきい値より新しいリリースを除外し、プロジェクトの制約を満たす古いバージョンを残します。
診断メッセージでは、スキップされた新しいリリースが示され、解決に失敗した理由も説明されます。レジストリごとの設定も可能なため、組織はパッケージの提供元ごとに異なる待機期間を適用できます。
この設計により、適用範囲は依存関係更新ボットの外にも広がります。この機能のRFCによると、外部の自動化ツールでは、マニフェストのローカル編集、Cargoによる直接の更新、ロックファイルの暗黙的な変更を一貫して制御できません。
リゾルバー自体で強制すれば、こうした作業もすべて同じポリシーの下に置けます。
Socketの研究者らによると、Rustのセキュリティ対応チームは、arrayref 0.3.10、internment 0.8.7、append-only-vec 0.1.9を削除しました。これらはそれぞれ86分、90分、107分間にわたって入手可能な状態でした。
既存のCargo.lockのエントリは、バージョンがしきい値より新しくても有効なままです。したがって、この機能を有効にしても、すでに採用してしまった悪意ある依存関係がさかのぼって除外されるわけではありません。
この例外により、記録済みの解決結果は維持されます。一方で、実際の保護範囲を把握するには、ロックファイルの確認が欠かせません。
緊急の修正が必要な場合は、CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE=allow cargo update -p some-crate --precise 1.2.3を使えば、一時的に制限を回避できます。
この上書きでは、新たに解決される推移的依存関係も許可されます。以降の解決では、ロックファイルに記録されたバージョンが維持されます。
保護の対象範囲は、レジストリの公開タイムスタンプに依存します。Git依存関係、ローカルパス依存関係、このメタデータを持たないレジストリは、チェックの対象外です。正当な修正版にも、明示的に上書きしない限り待機期間が適用されます。
クールダウンで得られるのは対応のための時間であり、安全性の証明ではありません。検知をすり抜けた悪意あるリリースは、しきい値を超えて時間が経てば、そのまま採用されてしまいます。
このためRFCは、本番ワークフローにおける侵害された依存関係への単独の防御策として、この仕組みに頼らないよう警告しています。
サイバー脅威を被害が出る前に阻止し、MTTRを21分短縮。ANYRUNのサンドボックスをSOCに統合。
Cybersecuritynews subscription
翻訳元: https://gbhackers.com/rust-1-100-strengthens-cargo/