Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
lean-cve-poc-14484 — CVE-2026-72711 — Lean-4-Kernel-Korrektheitsfehler: Vergiftung des Inferenz-Caches | Kitploit
Tools/GitHubGitHub/endrazine/lean-cve-poc-14484
SchwachstellenanalyseCode-AnalyseExploitationPapers & Forschung
GitHubendrazine/lean-cve-poc-14484

lean-cve-poc-14484

CVE-2026-72711 — Lean-4-Kernel-Korrektheitsfehler: Vergiftung des Inferenz-Caches

Repository anzeigen
vor 2 TagenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-72711 — Lean 4 Kernel-Soundness-Fehler: Vergiftung des Inferenz-Caches

Axiomfreier Beweis von 0 = 1 durch Vergiftung des FVar-Caches mittels opaker Deklaration.

FeldWert
Fehlerberichtleanprover/lean4#14484
Fixleanprover/lean4#14498
BetroffenLean 4 ≤ v4.31.0 / alle früheren Versionen
Behoben innightly 2026-07-23+, zurückportiert auf v4.32.1 und 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

Zusammenfassung der Schwachstelle

Der Pfad environment::add_opaque des Lean-4-Kernels ruft check_no_metavar_no_fvar nicht für den Deklarationskörper auf — anders als bei Definitionen und Theoremen, die diese Abschlussprüfung vor der Typprüfung des Werts durchführen.

Ein gegnerisches Metaprogramm nutzt diese Auslassung durch Vergiftung des Inferenz-Caches aus:

  1. Vorbereitung (Priming) — Ein präparierter Typausdruck (cachePrimingType) ist eine geschlossene Beta-Redex, die definitionell gleich False ist. Während der Typprüfung erzeugt der Kernel eine temporäre lokale Deklaration _kernel_fresh.2 : False und speichert deren abgeleiteten Typ im Inferenz-Cache der type_checker-Instanz.

  2. Kontextinvalidierung — Der lokale Kontext wird wiederhergestellt (die temporäre Variable wird entfernt), aber der Inferenz-Cache bleibt auf derselben type_checker-Instanz bestehen. Der Cache-Eintrag ist nun veraltet — er ordnet einen Bezeichner zu, der sich nicht mehr auf etwas im Gültigkeitsbereich bezieht.

  3. Ausnutzung — Der Wert der opaken Deklaration ist ein Expr.fvar, der auf den veralteten Bezeichner zeigt. Die Cache-Suche erfolgt bevor der FVar-Zweig die Zugehörigkeit zum lokalen Kontext prüft, und gibt False als Typ zurück, ohne jemals die ungebundene Variable zu erkennen.

Das Ergebnis ist eine vom Kernel akzeptierte opake Konstante vom Typ False, aus der 0 = 1 trivial folgt.

Der Exploit:

  • Verwendet ausschließlich den geprüften addDecl-Kernelpfad
  • Läuft mit --trust=0 (maximale Prüfung)
  • Meldet keine Axiome über #print axioms
  • Verwendet kein sorry, unsafeCast, debug.skipKernelTC, FFI oder .olean-Manipulation
  • Besteht die leanchecker --fresh-Wiedergabe

Verwendung

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

Erwartete Ausgabe bei einer verwundbaren Lean-Version:

[*] 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

In einer gepatchten Lean-Version lehnt der Kernel die falsch typisierte opake Deklaration ab und das Skript meldet, dass die Version nicht anfällig ist.

Auswirkungen

Jedes System, das die kernel-geprüften Beweise von Lean als Grundwahrheit vertraut, ist betroffen. Dazu gehören:

  • Formal verifizierte Software: Compiler, kryptografische Bibliotheken, Smart Contracts, Avionik, Automotive — jede Sicherheitsargumentation, die auf einem Lean-Beweis aufbaut, ist ungültig, wenn sie mit einer betroffenen Version erstellt wurde.
  • Proof-Carrying Code: Eine bösartige Abhängigkeit in einem Lake-Paket kann stillschweigend ungesunde Deklarationen einführen, die nachgelagerter Code verwendet.
  • Unabhängige Checker: Der Melder bestätigte, dass die Wiedergabe mit leanchecker --fresh den Exploit ebenfalls akzeptiert. Das Exportformat von comparator kann kein FVar ausdrücken, daher ist dieser Validierungspfad nicht betroffen.
  • KI-generierte Beweise: Systeme wie AlphaProof, DeepSeek-Prover und Kimina-Prover, die Lean als vertrauenswürdiges Backend verwenden, könnten Beweise erzeugen, die Kernel-Fehler ausnutzen, anstatt Theoreme zu beweisen.

Technische Details

Ursache

In src/kernel/environment.cpp prüft die Funktion add_opaque den Typ des opaken Werts, führt jedoch keine Closure-Prüfung durch:

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());
        // ...
    }
}

Sowohl add_definition als auch add_theorem rufen check_no_metavar_no_fvar auf ihren Werten auf, bevor sie typgeprüft werden. Die Auslassung in add_opaque ist der Einstiegspunkt.

Cache-Poisoning-Mechanismus

Der Inferenz-Cache in type_checker ordnet Ausdrücke ihren inferierten Typen zu. In infer_type_core erfolgt der Cache-Lookup:

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

fires bevor der FVar-Zweig die Zugehörigkeit zum lokalen Kontext validiert:

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

Der Angreifer kontrolliert die Cache-Befüllung über den Typausdruck und macht dadurch den Namen des veralteten Eintrags (_kernel_fresh.2) vorhersehbar und angreifbar.

Vergleich mit #14576

Aspekt#14484 (dieser Bug)#14576
FehlerklasseCache-PoisoningTypverwechslung durch Projektionsvalidierung
Einstiegspunktadd_opaque fehlende Closure-PrüfungVerschachtelte induktive Phantom-Parameter
Beteiligter CacheJa — Inferenz-CacheJa — Ausdrucks-Hash-Vergleich
Betrifft leancheckerJaJa
Betrifft comparatorNein (FVar nicht ausdrückbar)Ja

Verwandte Arbeiten

  • endrazine/lean-cve-poc — PoC für den Bug bei verschachtelten induktiven Projektionen #14576 (gleiche Repo-Struktur)
  • lean4lean soundness fix — lean4lean war unabhängig vom selben Cache-Poisoning-Bug betroffen

Danksagungen

  • Fehlerentdeckung: Patrick Hulin (@phulin), mit Unterstützung von GPT-5.6 Sol
  • Kernel-Fix: Joachim Breitner (@nomeata), PR #14498
  • PoC-Paketierung: Jonathan Brossard (@endrazine)
Tool herunterladen