Rustの開発者向けに、公開されたばかりの依存パッケージの採用を遅らせるオプションのセキュリティ機能が、まもなく利用可能になります。11月12日に予定されているRust 1.100では、最小公開経過期間(minimum publish age)の安定版サポートが導入されます。これにより、プロジェクトが新しいリリースを取り込む前に、研究者やメンテナーが悪意あるリリースを見つける時間を確保できます。
この機能はベータ版で利用でき、8月28日に安定化がマージされました。ただし、クールダウン期間は開発者自身が有効にする必要があります。Cargoの最小公開経過期間の既定値はゼロのままです。そのため、アップグレードしただけでは待機期間は有効になりません。
この機能は、コードをスキャンするのではなく、公開からの経過時間で依存パッケージのバージョンを絞り込みます。待機期間を過ぎたからといって、そのパッケージが安全だと保証されるわけではありません。
最近の攻撃を見ると、短い遅延でも効果があることがわかります。8月20日、攻撃者はarrayref、internment、append-only-vecの侵害されたバージョンを公開しました。これらのリリースには、悪意ある依存パッケージproc-macro1が組み込まれていました。proc-macro1のビルドスクリプトは、有害なペイロードをダウンロードする仕組みでした。
Rustのセキュリティチームは、arrayref 0.3.10を86分後に、internment 0.8.7を90分後に、append-only-vec 0.1.9を107分後に削除しました。対応にあたった担当者は、攻撃者がyank(公開取り下げ)していた正規バージョンも復元し、被害を受けた公開アカウントをロックしました。
3つのリリースはいずれも2時間以内に消えましたが、削除前に自動の依存関係更新が取得してしまう可能性はありました。
待機期間を設ければ、影響を受けたバージョンが他の開発環境に広がる前に、検知とレジストリ側の対処に充てる時間が生まれます。
この機能は、今回のインシデントより前から開発が進められていました。追跡用のissueは5月に立てられ、6月にはnightly版でサポートが始まっています。
8月の侵害は、開発のきっかけになったわけではありません。ただ、依存パッケージの採用を遅らせることの実用的な価値を示しました。7日間の遅延を有効にするには、.cargo/config.tomに次の設定を追加します。
Cargoは、設定したしきい値より新しい依存パッケージのリリースをスキップします。プロジェクトの要件を満たす場合は、より古いリリースを選択できます。要件を満たす適格なバージョンが1つもなければ、依存関係の解決は失敗します。
リゾルバーのincompatible-publish-ageポリシーは、既定で"deny"です。これにより、古い選択肢がない場合にCargo が単純に新しいリリースへフォールバックすることを防ぎます。この設定は、レジストリごとの最小経過期間にも対応しています。
この厳格な挙動は、攻撃者が悪意ある更新を公開し、正規バージョンをyankした場合に重要です。古いパッケージを優先するだけのポリシーでは、攻撃者のリリースが選ばれてしまうおそれがあります。
Cargo.lockに記録済みのバージョンは、しきい値より新しい場合でもそのまま使えます。したがって、このポリシーを有効にしても、すでにプロジェクトに取り込まれた新しい依存パッケージが遡って除外されることはありません。
緊急の修正が必要な場合、開発者は特定のパッケージを更新する間だけ、CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE=allowでチェックを一時的に無効にできます。この例外は、そのコマンド中に解決される推移的依存関係にも適用されます。
Socketによると、この実装はcargo install、Git依存、ローカルパス依存、公開日時のタイムスタンプを持たないレジストリを対象外としています(Socketの解説)。
また、開発者が例外を設けない限り、正規の更新も待たなければなりません。一方で、悪意あるリリースが設定した遅延期間を過ぎても見つからないケースもあり得ます。
この機能が稼ぐのは対応のための時間です。依存関係のレビュー、セキュリティ監視、公開用認証情報の慎重な管理に代わるものではありません。保護の効果は、チームがこの機能を有効にし、待機期間を日常的に回避することなく例外を管理できるかどうかにかかっています。
脅威調査を効率化し、手作業を減らすために、16,000以上のSOCチームがANY.RUNを活用しています。自社チームでの活用を検討する
翻訳元: https://cyberpress.org/cargo-adds-dependency-cooldown/