
2026/10/13 19:27
Rust の借用チェックで見つかった、11 歳で無効なバグ
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Rust の Types チームは、11 年もの間存在していた「P-high」と分類されるバグを緊急で対応しています。この重大度ランク付けは、その発覚時期の古さに基づくものであり、本質的な危急度を反映したものではありません(最近発見されたなら P-critical と判断されたはずです)。この長年の不備により、悪意のあるカスタムの
Drop 実装を通じて意図しないメモリ違反が発生し、 Mutex に参照を漏らすことでコンパイラに非安全なコードを受け付けてしまうという問題が生じています。標準ビルドではプログラムは正常にコンパイルされ、無害に見える挙動(出力の印刷)を示しますが、AddressSanitizer を使用すると明確に「範囲外のスタックの使用」によるクラッシュが検出され、その不安定性が証明されています。この脆弱性は Rust 1.85.0 以降の nightly ビルドおよび stable バージョンの両方に影響しており、多くのプロジェクトで修正されるまで潜在的な欠陥が隠れたままとなる可能性があります。Rust のメモリ安全性保証への信頼を回復するため、チームは Project Zero などのイニシアチブを拡大し、コンパイラがこのような危険な振る舞いを厳格に拒否するようにし、安全なソフトウェア開発のために範囲外の使用リスクを排除することを計画しています。本文
Rust の型システムにおける深刻なメモリ安全性不整合の発見
🔍 問題の概要と重大度
- 発見状況: オンライン上で共有されており、現在かなりのアクセス数を記録している。
- 分類の矛盾:
- 当初は「P-High(高優先度)」として分類されていたが、実際には現場で遭遇するか否かを問わず**「P-Critical(深刻)**とすべきであった。
- 理由: この不整合はすでに11 年前から存在しており、「容易に再現可能」であるはずがないため、発見されなかったことが異常である。
🛡️ Rust コミュニティの対応方針
- 基本姿勢: Rust の型システムはメモリ安全性を確保することを最優先とし、この約束を非常に重視している。
- 今後の取り組み:
- 次世代のトレイトソルバーへの移行。
- リージョン制約の見直し。
- プロジェクト・ゼロ(Project Zero)などのセキュリティ強化策の実施。
- 最大の優先事項:
- 型システムの全体的な不整合を是正する。
- 未知の不整合がもたらすリスクを最小限に抑えるための堅牢な基盤の構築。
💻 コード例と再現手順
以下のコードは、型システム上の矛盾を示す具体例です。
サンプルコード
use std::sync::Mutex; static KEPT: Mutex<Vec<Box<dyn std::any::Any + Send>>> = Mutex::new(Vec::new()); struct Q<T: 'static + Send>(Option<T>); impl<T: 'static + Send> Drop for Q<T> { fn drop(&mut self) { if let Some(t) = self.0.take() { KEPT.lock().unwrap().push(Box::new(t)); } } } fn main() { { // 通常の String を作成 let l = String::from("hello world, this is long enough"); // Q の内部に間接参照 (&l) を代入('static ライフタイムではない) let mut q = Q(None); q.0 = Some(&l); } // --- 以下は範囲終了時 --- // Q がドロップされ、その内容が KEPT ベアリングに格納されるはずだが... // &l は 'static ライフタイムを持たないため、型システム上無効な操作であるはずだ。 let _z = String::from("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); let k = KEPT.lock().unwrap(); // コンパイル成功し、以下の文字列が印刷される(メモリ安全性違反) println!("{}", k[0].downcast_ref::<&'static String>().unwrap()); }
動作結果の比較
| 項目 | 予想された動作 (仕様) | 実際の動作 (バグ) |
|---|---|---|
| コンパイル | ❌ コンパイルエラーにより受理されない | ✅ 正常にコンパイルされ、実行が可能 |
| 出力結果 | - | が印刷される |
| ASAN 有効時 | - | エラーでクラッシュ |
📌 メタ情報 (Meta)
- 影響範囲:
- 現在の nightly 版
- stable 版の少なくとも 1.85.0 を含むバージョン
- 確認リンク (Godbolt):
📝 技術的な考察
- 悪用条件:
- 一見簡単にトリガーできそうに見えても、これを悪用するには意図的に悪意のある
実装が必要である。Drop
- 一見簡単にトリガーできそうに見えても、これを悪用するには意図的に悪意のある
- 不整合の本質:
- バグの構造上、この不整合が意図せずメモリ安全性を損なうことを招いていない可能性は極めて高い(ただし、実際にはリスクが存在する)。
- @lcnr コメント要約:
- 「なぜ P-High でしかないのか?」という疑問に対し、「11 年前から存在しており、発見されなかったのが不思議だ」という回答が示唆されている。