Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
lean-cve-poc-14484 — CVE-2026-72711 — Lean 4 カーネルの健全性バグ:推論キャッシュポイズニング | Kitploit
ツール/GitHubGitHub/endrazine/lean-cve-poc-14484
脆弱性分析コード分析エクスプロイト論文と研究
GitHubendrazine/lean-cve-poc-14484

lean-cve-poc-14484

CVE-2026-72711 — Lean 4 カーネルの健全性バグ:推論キャッシュポイズニング

リポジトリを見る
2日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-72711 — Lean 4 カーネルの健全性バグ: 推論キャッシュポイズニング

不透明宣言の FVar キャッシュポイズニングにより、公理なしで 0 = 1 を証明する。

フィールド値
バグ報告leanprover/lean4#14484
修正leanprover/lean4#14498
影響範囲Lean 4 ≤ v4.31.0 / 以前のすべてのバージョン
修正済みnightly 2026-07-23+、v4.32.1 および v4.33.0 にバックポート
CVSS 3.1AV:L/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:N — 7.1
CWECWE-488 (Exposure of Data Element to Wrong Session)、CWE-20 (Improper Input Validation)
CVECVE-2026-72711

脆弱性の概要

Lean 4 カーネルの environment::add_opaque パスは、宣言本体に対して check_no_metavar_no_fvar を呼び出していません。これは、値を型チェックする前に このクロージャチェックを実行する定義や定理とは異なります。

悪意のあるメタプログラムは、この省略を 推論キャッシュポイズニング によって悪用します:

  1. プライミング — 細工された型式 (cachePrimingType) は、False と定義上等しい 閉じたベータ簡約式です。これを型チェックする際、カーネルは一時的なローカル宣言 _kernel_fresh.2 : False を作成し、その推論された型を type_checker インスタンスの 推論キャッシュにキャッシュします。

  2. コンテキストの無効化 — ローカルコンテキストは復元されます (一時変数は削除されます) が、 推論キャッシュは同じ type_checker インスタンス上に残ります。キャッシュエントリは 今や古くなっています — スコープ内の何も参照しなくなった識別子をマッピングしています。

  3. 悪用 — 不透明宣言の値は、古い識別子を指す Expr.fvar です。キャッシュ検索は、 FVar ブランチがローカルコンテキストのメンバーシップをチェックする 前に 発火し、 未バインド変数を検出することなく False を型として返します。

その結果、カーネルに受け入れられた False 型の不透明定数が得られ、そこから 0 = 1 が自明に導かれます。

このエクスプロイトは:

  • チェック済み の addDecl カーネルパスのみを使用
  • --trust=0 (最大チェック) で実行
  • #print axioms で 公理なし を報告
  • sorry、unsafeCast、debug.skipKernelTC、FFI、.olean 改ざんを使用しない
  • leanchecker --fresh リプレイを通過

使用方法

docker build -t lean-cve-poc-14484 .
docker run --rm lean-cve-poc-14484

脆弱な Lean バージョンで期待される出力:

[*] Running CachePoisonFalse.lean with --trust=0 ...
kernel accepted bad : False
'bad' does not depend on any axioms
'assumptionFreeFalse' does not depend on any axioms
'zero_eq_one' does not depend on any axioms

[!] VULNERABILITY CONFIRMED

    zero_eq_one : 0 = 1
    Depends on: no axioms

    Bug class:  Inference cache poisoning (CWE-488)
    Root cause: missing check_no_metavar_no_fvar in add_opaque
    Bug report: https://github.com/leanprover/lean4/issues/14484
    Fix:        https://github.com/leanprover/lean4/pull/14498

パッチ適用済みのLeanバージョンでは、カーネルは型不正なopaque宣言を拒否し、スクリプトはそのバージョンが脆弱でないことを報告します。

影響

Leanのカーネル検証済み証明を絶対的な真実として信頼するあらゆるシステムが影響を受けます。これには以下が含まれます:

  • 形式検証済みソフトウェア: コンパイラ、暗号ライブラリ、スマート コントラクト、アビオニクス、自動車 — Lean証明に基づいて構築された安全性の根拠は、 影響を受けるバージョンで構築された場合、無効となります。
  • 証明付きコード: Lakeパッケージ内の悪意ある依存関係が、下流のコードが使用する 不健全な宣言を密かに導入する可能性があります。
  • 独立したチェッカー: 報告者はleanchecker --freshによるリプレイも エクスプロイトを受け入れることを確認しました。comparatorエクスポート形式は FVarを表現できないため、その検証経路は影響を受けません。
  • AI生成の証明: AlphaProof、DeepSeek-Prover、Kimina-Proverなど、Leanを信頼された バックエンドとして使用するシステムは、定理を証明するのではなくカーネルのバグを 悪用する証明を生成する可能性があります。

技術的詳細

根本原因

src/kernel/environment.cppにおいて、add_opaque関数はopaque値の型を チェックしますが、クロージャチェックを実行しません:

environment environment::add_opaque(declaration const & d, bool check) const {
    scoped_diagnostics diag(*this, check);
    opaque_val const & v = d.to_opaque_val();
    if (check) {
        type_checker checker(*this, diag.get());
        check_constant_val(*this, v.to_constant_val(), checker);
        // ← MISSING: check_no_metavar_no_fvar(*this, v.get_name(), v.get_value());
        expr val_type = checker.check(v.get_value(), v.get_lparams());
        // ...
    }
}

add_definition と add_theorem はどちらも、型チェックの前に値に対して check_no_metavar_no_fvar を呼び出します。add_opaque におけるこの省略がエントリーポイントとなります。

キャッシュポイズニングの仕組み

type_checker 内の推論キャッシュは、式をその推論された型にマッピングします。infer_type_core では、キャッシュの検索が次のようになります:

auto it = m_infer_type_cache[binfo_idx(bi)].find(e);
if (it != m_infer_type_cache[binfo_idx(bi)].end())
    return it->second;

は、FVar ブランチがローカルコンテキストのメンバーシップを検証する前に発火します:

case expr_kind::FVar: {
    optional<local_decl> d = m_lctx.find_local_decl(e);
    if (!d) throw_kernel_exception(...);
    return d->get_type();
}

攻撃者は型式を通じてキャッシュの生成を制御できるため、古いエントリの名前(_kernel_fresh.2)が予測可能になり、標的にできます。

#14576 との比較

観点#14484(本バグ)#14576
バグの種類キャッシュポイズニング射影検証による型混同
エントリポイントadd_opaque にクロージャチェックがないネストした帰納的ファントムパラメータ
関与するキャッシュあり — 推論キャッシュあり — 式ハッシュの比較
leanchecker への影響ありあり
comparator への影響なし(FVar は表現不可)あり

関連研究

  • endrazine/lean-cve-poc — #14576 のネストした帰納的射影バグの PoC(同じリポジトリ構成)
  • lean4lean soundness fix — lean4lean も同じキャッシュポイズニングバグの影響を独立して受けていた

クレジット

  • バグの発見: Patrick Hulin (@phulin)、GPT-5.6 Sol の支援による
  • カーネルの修正: Joachim Breitner (@nomeata)、PR #14498
  • PoC のパッケージ化: Jonathan Brossard (@endrazine)
ツールをダウンロード