Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
lean-cve-poc-14484 — CVE-2026-72711 — Bug de solidez do kernel do Lean 4: Envenenamento do cache de inferência | Kitploit
Ferramentas/GitHubGitHub/endrazine/lean-cve-poc-14484
Análise de VulnerabilidadesAnálise de CódigoExploraçãoPapers e Pesquisa
GitHubendrazine/lean-cve-poc-14484

lean-cve-poc-14484

CVE-2026-72711 — Bug de solidez do kernel do Lean 4: Envenenamento do cache de inferência

Ver Repositório
há 2 diasAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-72711 — Bug de solidez do kernel Lean 4: Envenenamento do cache de inferência

Provando 0 = 1 sem axiomas via envenenamento do cache FVar de declarações opacas.

CampoValor
Relatório do bugleanprover/lean4#14484
Correçãoleanprover/lean4#14498
AfetadoLean 4 ≤ v4.31.0 / todas as versões anteriores
Corrigido emnightly 2026-07-23+, backportado para 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 (Exposição de Elemento de Dados à Sessão Errada), CWE-20 (Validação de Entrada Imprópria)
CVECVE-2026-72711

Resumo da Vulnerabilidade

O caminho environment::add_opaque do kernel do Lean 4 não chama check_no_metavar_no_fvar no corpo da declaração — diferentemente de definições e teoremas, que realizam essa verificação de fechamento antes de verificar o tipo do valor.

Um metaprograma adversário explora essa omissão por meio do envenenamento do cache de inferência:

  1. Preparação — Uma expressão de tipo elaborada (cachePrimingType) é uma beta-redex fechada, definitionalmente igual a False. Durante a verificação de seu tipo, o kernel cria uma declaração local temporária _kernel_fresh.2 : False e armazena em cache seu tipo inferido no cache de inferência da instância de type_checker.

  2. Invalidação de contexto — O contexto local é restaurado (a variável temporária é removida), mas o cache de inferência persiste na mesma instância de type_checker. A entrada do cache agora está obsoleta — ela mapeia um identificador que não se refere mais a nada no escopo.

  3. Exploração — O valor da declaração opaca é um Expr.fvar apontando para o identificador obsoleto. A consulta ao cache é disparada antes de o ramo FVar verificar a pertinência ao contexto local, retornando False como o tipo sem nunca detectar a variável não vinculada.

O resultado é uma constante opaca do tipo False aceita pelo kernel, da qual 0 = 1 decorre trivialmente.

O exploit:

  • Usa apenas o caminho verificado addDecl do kernel
  • Executa com --trust=0 (verificação máxima)
  • Não reporta nenhum axioma via #print axioms
  • Não usa sorry, unsafeCast, debug.skipKernelTC, FFI ou adulteração de .olean
  • Passa na reprodução com leanchecker --fresh

Uso

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

Saída esperada numa versão vulnerável do 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

Em uma versão corrigida do Lean, o kernel rejeita a declaração opaca mal tipada e o script relata que a versão não é vulnerável.

Impacto

Qualquer sistema que confia nas provas verificadas pelo kernel do Lean como verdade absoluta é afetado. Isso inclui:

  • Software formalmente verificado: compiladores, bibliotecas criptográficas, contratos inteligentes, aviônica, automotivo — qualquer argumento de segurança construído sobre uma prova Lean é inválido se construído com uma versão afetada.
  • Código com prova embutida: uma dependência maliciosa em um pacote Lake pode introduzir silenciosamente declarações não sólidas que o código downstream utiliza.
  • Verificadores independentes: o relator confirmou que a reprodução com leanchecker --fresh também aceita o exploit. O formato de exportação comparator não consegue expressar um FVar, portanto esse caminho de validação não é afetado.
  • Provas geradas por IA: sistemas como AlphaProof, DeepSeek-Prover e Kimina-Prover que usam o Lean como backend confiável podem produzir provas que exploram bugs do kernel em vez de provar teoremas.

Detalhes Técnicos

Causa Raiz

Em src/kernel/environment.cpp, a função add_opaque verifica o tipo do valor opaco, mas não realiza a verificação de fechamento:

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

Tanto add_definition quanto add_theorem chamam check_no_metavar_no_fvar sobre seus valores antes de fazer a verificação de tipos. A omissão em add_opaque é o ponto de entrada.

Mecanismo de Envenenamento de Cache

O cache de inferência em type_checker mapeia expressões para seus tipos inferidos. Em infer_type_core, a consulta ao 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;

dispara antes de o ramo FVar validar a associação ao contexto local:

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

O atacante controla o preenchimento do cache por meio da expressão de tipo, tornando o nome da entrada obsoleta (_kernel_fresh.2) previsível e direcionável.

Comparação com #14576

Aspecto#14484 (este bug)#14576
Classe do bugEnvenenamento de cacheConfusão de tipos via validação de projeção
Ponto de entradaadd_opaque sem verificação de closureParâmetros fantasma indutivos aninhados
Cache envolvidoSim — cache de inferênciaSim — comparação de hash de expr
Afeta o leancheckerSimSim
Afeta o comparatorNão (FVar não é expressável)Sim

Trabalhos Relacionados

  • endrazine/lean-cve-poc — PoC para o bug de projeção indutiva aninhada #14576 (mesma estrutura de repositório)
  • lean4lean soundness fix — o lean4lean foi afetado de forma independente pelo mesmo bug de envenenamento de cache

Créditos

  • Descoberta do bug: Patrick Hulin (@phulin), com assistência do GPT-5.6 Sol
  • Correção do kernel: Joachim Breitner (@nomeata), PR #14498
  • Empacotamento do PoC: Jonathan Brossard (@endrazine)
Baixar ferramenta