ネスト帰納的射影の検証バイパスによる、公理なしの 0 = 1 の証明。
Lean 4 カーネルは、射影式で指定された構造体が射影される値の型と一致することを検証しません。
また、src/kernel/inductive.cpp の environment::add_inductive は、補助型に置き換えられるネスト帰納的適用を型検査しなかったため、
それらのパラメトリック引数は検査を逃れました。
Lean プロセス内で実行されるメタプログラムは、型不正なネスト帰納的型を登録できます。
そのコンストラクタは無関係な型 W の値に対して .proj C 0 射影を適用し、
カーネルは最大カーネル検査で通常の検査済み addDecl パスを通じて宣言を受理します。
その結果、公理を伴わない False の証明を生じる型混同が発生し、
そこから任意の命題 — 0 = 1 を含む — を導出できます。
このエクスプロイト:
addDecl カーネルパスのみを使用--trust=0(最大検査)で実行#print axioms で公理なしを報告sorry、unsafeCast、debug.skipKernelTC、FFI、.olean の改ざんは不使用docker build -t lean-cve-poc .
docker run --rm lean-cve-poc
脆弱な Lean バージョンでの期待される出力:
[*] Running ZeroEqOne.lean with --trust=0 ...
'bad' does not depend on any axioms
'boom' does not depend on any axioms
'zero_eq_one' does not depend on any axioms
zero_eq_one : 0 = 1
[!] VULNERABILITY CONFIRMED — CVE-2026-72844
zero_eq_one : 0 = 1
Depends on: no axioms
パッチ適用済みの Lean バージョンでは、カーネルは型不正な帰納的型を拒否し、スクリプトはそのバージョンが脆弱ではないと報告します。
Lean のカーネル検査済み証明を正として信頼するすべてのシステムが影響を受けます。これには以下が含まれます:
根本原因は、カーネルによるネスト帰納的型の処理にあります。
ネストした出現 I Ds is を除去するとき、カーネルはパラメトリック引数 Ds が帰納的型の宣言されたパラメータと一致することを検証する必要があります。
脆弱なコードは、Ds 内の射影式 (.proj) が正しい構造体名を参照していることをチェックできないため、w : W かつ W ≠ C の場合でも .proj C 0 w を受け入れてしまいます。
ハッシュ衝突(カーネルは定義上の等価性チェックで Expr.hash 比較を使用)と組み合わせることで、攻撃者はカーネルの内部型割り当てが実際の項の意味論と一致しない宣言を登録でき、型混同と False の証明につながります。
| 項目 | 値 |
|---|
| CVE | CVE-2026-72844 |
| アドバイザリ | VulnCheck VCSA |
| バグレポート | leanprover/lean4#14576 |
| 修正 | leanprover/lean4#14577 |
| 影響を受けるバージョン | Lean 4 ≤ v4.31.0 / nightly ≤ 2026-07-27 |
| 修正バージョン | nightly 2026-07-29+ / v4.32.2 |
| CVSS 4.0 | AV:L/AC:L/AT:N/PR:N/UI:P/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N — 6.8 中 |
| CVSS 3.1 | AV:L/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:N — 6.3 中 |
| CWE | CWE-843 (型混同) |