Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
lean-cve-poc-14484 — CVE-2026-72711 — Bug di correttezza del kernel di Lean 4: avvelenamento della cache di inferenza | Kitploit
Strumenti/GitHubGitHub/endrazine/lean-cve-poc-14484
Analisi delle VulnerabilitàAnalisi del CodiceExploitPaper e Ricerca
GitHubendrazine/lean-cve-poc-14484

lean-cve-poc-14484

CVE-2026-72711 — Bug di correttezza del kernel di Lean 4: avvelenamento della cache di inferenza

Vedi Repository
2 giorni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-72711 — Bug di correttezza del kernel Lean 4: avvelenamento della cache di inferenza

Dimostrazione di 0 = 1 senza assiomi tramite avvelenamento della cache FVar di dichiarazioni opache.

CampoValore
Bug reportleanprover/lean4#14484
Fixleanprover/lean4#14498
AffectedLean 4 ≤ v4.31.0 / tutte le versioni precedenti
Fixed innightly 2026-07-23+, backportato a v4.32.1 e 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 (Esposizione di un elemento dati alla sessione errata), CWE-20 (Validazione impropria dell'input)
CVECVE-2026-72711

Riepilogo della vulnerabilità

Il percorso environment::add_opaque del kernel di Lean 4 non chiama check_no_metavar_no_fvar sul corpo della dichiarazione — a differenza delle definizioni e dei teoremi, che eseguono questo controllo di chiusura prima del type-checking del valore.

Un metaprogramma malevolo sfrutta questa omissione tramite l'avvelenamento della cache di inferenza:

  1. Priming — Un'espressione di tipo costruita ad hoc (cachePrimingType) è una beta-redex chiusa definizionalmente uguale a False. Durante il suo type-checking, il kernel crea una dichiarazione locale temporanea _kernel_fresh.2 : False e memorizza nella cache il tipo inferito nell'inference cache dell'istanza type_checker.

  2. Invalidazione del contesto — Il contesto locale viene ripristinato (la variabile temporanea viene rimossa), ma la cache di inferenza persiste sulla stessa istanza type_checker. La voce della cache è ora obsoleta — associa un identificatore che non fa più riferimento a nulla nello scope.

  3. Sfruttamento — Il valore della dichiarazione opaca è un Expr.fvar che punta all'identificatore obsoleto. La ricerca nella cache scatta prima che il ramo FVar verifichi l'appartenenza al contesto locale, restituendo False come tipo senza mai rilevare la variabile non associata.

Il risultato è una costante opaca di tipo False accettata dal kernel, da cui 0 = 1 segue banalmente.

L'exploit:

  • Utilizza solo il percorso addDecl verificato del kernel
  • Viene eseguito con --trust=0 (verifica massima)
  • Non riporta alcun assioma tramite #print axioms
  • Non utilizza sorry, unsafeCast, debug.skipKernelTC, FFI o manomissioni di .olean
  • Supera il replay di leanchecker --fresh

Utilizzo

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

Output atteso su una versione vulnerabile di 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

In una versione di Lean corretta, il kernel rifiuta la dichiarazione opaca mal tipizzata e lo script segnala che la versione non è vulnerabile.

Impatto

Qualsiasi sistema che considera le prove verificate dal kernel di Lean come verità di riferimento è interessato. Questo include:

  • Software formalmente verificato: compilatori, librerie crittografiche, smart contract, avionica, automotive — qualsiasi caso di sicurezza basato su una prova Lean è invalido se costruito con una versione affetta.
  • Proof-carrying code: una dipendenza malevola in un pacchetto Lake può introdurre silenziosamente dichiarazioni non solide che il codice a valle utilizza.
  • Checker indipendenti: il segnalatore ha confermato che anche la riproduzione con leanchecker --fresh accetta l'exploit. Il formato di esportazione comparator non può esprimere un FVar, quindi quel percorso di validazione non è interessato.
  • Prove generate dall'IA: sistemi come AlphaProof, DeepSeek-Prover e Kimina-Prover che usano Lean come backend fidato potrebbero produrre prove che sfruttano bug del kernel anziché dimostrare teoremi.

Dettagli tecnici

Causa principale

In src/kernel/environment.cpp, la funzione add_opaque controlla il tipo del valore opaco ma non esegue il controllo di chiusura:

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

Sia add_definition che add_theorem chiamano check_no_metavar_no_fvar sui loro valori prima di verificarne il tipo. L'omissione in add_opaque è il punto di ingresso.

Meccanismo di avvelenamento della cache

La cache di inferenza in type_checker mappa le espressioni ai loro tipi inferiti. In infer_type_core, la ricerca nella cache:

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

attiva prima che il ramo FVar validi l'appartenenza al contesto locale:

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

L'attaccante controlla il popolamento della cache tramite l'espressione di tipo, rendendo il nome della voce obsoleta (_kernel_fresh.2) prevedibile e attaccabile.

Confronto con #14576

Aspetto#14484 (questo bug)#14576
Classe di bugAvvelenamento della cacheType confusion tramite validazione della proiezione
Punto di ingressoadd_opaque manca il controllo della closureParametri phantom induttivi annidati
Cache coinvoltaSì — cache di inferenzaSì — confronto hash delle espressioni
Influisce su leancheckerSìSì
Influisce su comparatorNo (FVar non esprimibile)Sì

Lavori correlati

  • endrazine/lean-cve-poc — PoC per il bug della proiezione induttiva annidata #14576 (stessa struttura del repository)
  • lean4lean soundness fix — lean4lean è stato indipendentemente affetto dallo stesso bug di avvelenamento della cache

Crediti

  • Scoperta del bug: Patrick Hulin (@phulin), con l'assistenza di GPT-5.6 Sol
  • Correzione del kernel: Joachim Breitner (@nomeata), PR #14498
  • Packaging del PoC: Jonathan Brossard (@endrazine)
Scarica lo strumento