モジュールスコープの宇宙チェックフラグの非同期化を利用し、公理なしで 0 = 1 を証明する。
| フィールド | 値 |
|---|---|
| バグレポート | rocq-prover/rocq#22287 |
| 修正 | なし(2026-08-16 時点でイシューはオープン) |
| 影響範囲 | Rocq ≤ 9.2.0 / Coq 8.x(stdlib に Hurkens を含むすべてのバージョン) |
| CVSS 3.1 | AV:L/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:N — 7.1 |
| CWE | CWE-488(データ要素の誤ったセッションへの露出)、CWE-20(不適切な入力検証) |
| CVE | CVE-2026-72714 |
Rocq Prover のモジュールシステムは、Local Unset Universe Checking フラグを適切にスコープ化できていません。モジュール内で使用された場合、このフラグはモジュールが閉じられた時点で以前の状態に復元されるべきです。しかし、宇宙グラフ(ugraph)はフラグの独自のコピーを保持しており、モジュールのクローズ時にグローバル状態と同期が取れなくなります。
非同期化が発生した後:
Test Universe Checking は オン を報告する(グローバルフラグは復元された)ugraph は依然として宇宙チェックが オフ のままである(そのコピーは復元されなかった)宇宙チェックが実質的に無効化されると、Hurkens のパラドックスが適用されます:TypeNeqSmallType.paradox は、宇宙制約が強制されない場合に u < v である Type@{u} と Type@{v} が混同され得るという事実を悪用し、False の直接的な証明を導き出します。
このエクスプロイトは:
Print Assumptions は「Closed under the global context」と報告するStdlib.Logic.Hurkens のみを必要とするdocker build -t rocq-cve-poc-22287 .
docker run --rm rocq-cve-poc-22287
脆弱な Rocq バージョンで期待される出力:
[*] Compiling ZeroEqOne.v ...
Universe Checking is on.
bad is defined
Closed under the global context
zero_eq_one is defined
Closed under the global context
[!] VULNERABILITY CONFIRMED
zero_eq_one : 0 = 1
Depends on: no axioms (closed under the global context)
Bug class: Universe checking state desync (CWE-488)
Root cause: ugraph retains stale Local Unset Universe Checking flag
Bug report: https://github.com/rocq-prover/rocq/issues/22287
Rocq のカーネル検証済み証明を信頼するあらゆるシステムが影響を受けます:
.v ファイルが、
下流の証明が依存する不健全な宣言を黙って導入する可能性があります。カーネル内の宇宙グラフ(ugraph)は、Universe Checking フラグの
独自のコピーを保持しています。モジュールが Local Unset Universe Checking
を使用すると、フラグはグローバル状態と ugraph の両方で変更されます。
モジュールが閉じられると、グローバル状態はモジュールの保存状態から復元
されますが、ugraph のコピーは同期されず、宇宙チェックが実質的に
無効化されたままになります。
┌─────────────────────────────────────────────────────┐
│ 1. Universes u v. Constraint u < v. │
│ → Declare universes with strict ordering │
├─────────────────────────────────────────────────────┤
│ 2. Module Off. │
│ Local Unset Universe Checking. │
│ End Off. │
│ → ugraph flag stays OFF after module closes │
├─────────────────────────────────────────────────────┤
│ 3. Test Universe Checking. → reports "on" (LIE) │
├─────────────────────────────────────────────────────┤
│ 4. eapply TypeNeqSmallType.paradox; reflexivity. │
│ → Kernel accepts universe-inconsistent proof │
│ → False proved with no axioms │
├─────────────────────────────────────────────────────┤
│ 5. zero_eq_one : 0 = 1 │
│ → Derived via exfalso │
└─────────────────────────────────────────────────────┘
| 観点 | Rocq #22287(本バグ) | Lean #14484 | Lean #14576 |
|---|---|---|---|
| 証明支援系 | Rocq (Coq) | Lean 4 | Lean 4 |
| バグ分類 | モジュールシステムにおける状態の非同期 | 推論キャッシュの汚染 | 射影による型の混同 |
| エクスプロイトの複雑さ | 6行 | 約20行 | 約50行 |
| 宇宙/型システム | 宇宙チェックのバイパス | 不透明なFVarが受理される | ファントムパラメータの脱出 |
| 修正状況 | 未解決 | 修正済み (PR #14498) | 修正済み (PR #14577) |