
CVE-2026-72844 : Exemple de preuve de « 0 = 1 » en exploitant une vulnérabilité dans le noyau de Lean 4.
Prouver 0 = 1 sans axiomes via un contournement de la validation des projections inductives imbriquées.
Le noyau Lean 4 ne vérifie pas que la structure nommée dans une expression
de projection correspond au type de la valeur projetée, et
environment::add_inductive dans src/kernel/inductive.cpp ne vérifiait
pas les types des applications inductives imbriquées qui sont remplacées par
des types auxiliaires, de sorte que leurs arguments paramétriques échappaient
à la vérification.
Un métaprogramme s'exécutant dans le processus Lean peut enregistrer une
inductive imbriquée mal typée dont le constructeur applique une projection
.proj C 0 à une valeur du type sans rapport W, et le noyau admet la
déclaration par le chemin addDecl vérifié ordinaire avec une vérification
maximale. Le résultat est une confusion de type produisant une preuve de
False sans aucun axiome, à partir de laquelle n'importe quelle proposition
— y compris 0 = 1 — peut être dérivée.
L'exploit :
addDecl vérifié du noyau--trust=0 (vérification maximale)#print axiomssorry, ni unsafeCast, ni debug.skipKernelTC, ni FFI, ni altération de .oleandocker build -t lean-cve-poc .
docker run --rm lean-cve-poc
Sortie attendue sur une version vulnérable de 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
Sur une version corrigée de Lean, le noyau rejette l'inductive mal typée et le script indique que la version n'est pas vulnérable.
Tout système qui fait confiance aux preuves vérifiées par le noyau de Lean comme vérité de référence est concerné. Cela inclut :
La cause racine se situe dans la gestion par le noyau des types inductifs
imbriqués. Lors de l'élimination d'une occurrence imbriquée I Ds is, le
noyau doit vérifier que les arguments paramétriques Ds correspondent aux
paramètres déclarés de l'inductive. Le code vulnérable ne vérifie pas que les
expressions de projection (.proj) dans Ds référencent le nom de structure
correct — un .proj C 0 w est accepté même lorsque w : W et W ≠ C.
Combiné à une collision de hachage (le noyau utilise les comparaisons
Expr.hash dans sa vérification d'égalité définitionnelle), cela permet à un
attaquant d'enregistrer des déclarations où l'affectation de type interne du
noyau est en désaccord avec la sémantique réelle du terme, conduisant à une
confusion de type et à une preuve de False.
| Champ | Valeur |
|---|
| CVE | CVE-2026-72844 |
| Avis | VulnCheck VCSA |
| Rapport de bug | leanprover/lean4#14576 |
| Correctif | leanprover/lean4#14577 |
| Affecté | Lean 4 ≤ v4.31.0 / nightly ≤ 2026-07-27 |
| Corrigé dans | 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 MOYEN |
| CVSS 3.1 | AV:L/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:N — 6.3 MOYEN |
| CWE | CWE-843 (Confusion de type) |