
CVE-2026-72844 : Exemplo de prova de "0 = 1" usando uma vulnerabilidade no kernel do Lean 4.
Provando 0 = 1 sem axiomas por meio de bypass na validação de projeção de indutivos aninhados.
| Campo | Valor |
|---|
| CVE | CVE-2026-72844 |
| Comunicado | VulnCheck VCSA |
| Relatório de bug | leanprover/lean4#14576 |
| Correção | leanprover/lean4#14577 |
| Afetado | Lean 4 ≤ v4.31.0 / nightly ≤ 2026-07-27 |
| Corrigido em | 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 MÉDIO |
| CVSS 3.1 | AV:L/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:N — 6.3 MÉDIO |
| CWE | CWE-843 (Confusão de Tipos) |
O kernel do Lean 4 não verifica se a estrutura nomeada em uma expressão de
projeção corresponde ao tipo do valor que está sendo projetado, e
environment::add_inductive em src/kernel/inductive.cpp não verificava
os tipos das aplicações indutivas aninhadas que são substituídas por tipos
auxiliares, fazendo com que seus argumentos paramétricos escapassem da
verificação.
Um metaprograma em execução no processo do Lean pode registrar um indutivo
aninhado com tipos incorretos cujo construtor aplica uma projeção .proj C 0
a um valor do tipo não relacionado W, e o kernel aceita a declaração pelo
caminho comum verificado addDecl com verificação máxima do kernel. O
resultado é uma confusão de tipos que produz uma prova de False sem
carregar nenhum axioma, da qual qualquer proposição — incluindo 0 = 1 —
pode ser derivada.
O exploit:
addDecl do kernel--trust=0 (verificação máxima)#print axiomssorry, unsafeCast, debug.skipKernelTC, FFI, nem adulteração de .oleandocker build -t lean-cve-poc .
docker run --rm lean-cve-poc
Saída esperada em uma versão vulnerável do 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
Em uma versão corrigida do Lean, o kernel rejeita o indutivo com tipos incorretos e o script informa que a versão não é vulnerável.
Qualquer sistema que confie nas provas verificadas pelo kernel do Lean como verdade absoluta é afetado. Isso inclui:
A causa raiz está no tratamento que o kernel dá aos tipos indutivos
aninhados. Ao eliminar uma ocorrência aninhada I Ds is, o kernel deve
verificar se os argumentos paramétricos Ds correspondem aos parâmetros
declarados do indutivo. O código vulnerável não verifica se as expressões de
projeção (.proj) em Ds referenciam o nome de estrutura correto — um
.proj C 0 w é aceito mesmo quando w : W e W ≠ C.
Combinado com uma colisão de hash (o kernel usa comparações de Expr.hash
na sua verificação de igualdade definicional), isso permite que um atacante
registre declarações em que a atribuição de tipo interna do kernel diverge da
semântica real do termo, levando a uma confusão de tipos e a uma prova de
False.