
CVE-2026-72844 : Lean 4 커널의 취약점을 사용하여 "0 = 1"을 증명하는 예시
중첩 귀납 프로젝션 검증 우회를 통해 0 = 1을 공리 없이 증명하기.
Lean 4 커널은 프로젝션 식에서 명명된 구조체가 프로젝션 대상 값의 타입과 일치하는지 확인하지 않습니다. 또한 src/kernel/inductive.cpp의 environment::add_inductive는 보조 타입으로 대체되는 중첩 귀납적 응용을 타입 검사하지 않았기 때문에, 해당 매개변수 인자들이 검사를 우회했습니다.
Lean 프로세스에서 실행되는 메타프로그램은 생성자가 관련 없는 타입 W의 값에 .proj C 0 프로젝션을 적용하는 타입이 잘못된 중첩 귀납적 타입을 등록할 수 있습니다. 커널은 최대 커널 검사 설정에서 일반적인 검사된 addDecl 경로를 통해 해당 선언을 승인합니다. 그 결과 타입 혼동이 발생하여 공리가 없는 False의 증명이 생성되며, 이를 통해 0 = 1을 포함한 임의의 명제를 도출할 수 있습니다.
이 익스플로잇:
addDecl 커널 경로만 사용--trust=0 (최대 검사)로 실행#print axioms를 통해 공리 없음을 보고sorry, unsafeCast, debug.skipKernelTC, FFI 또는 .olean 변조를 사용하지 않음docker build -t lean-cve-poc .
docker run --rm lean-cve-poc
취약한 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
패치된 Lean 버전에서는 커널이 타입이 잘못된 귀납적 타입을 거부하며 스크립트는 해당 버전이 취약하지 않다고 보고합니다.
Lean 커널이 검사한 증명을 진실의 근거로 신뢰하는 모든 시스템이 영향을 받습니다. 여기에는 다음이 포함됩니다:
근본 원인은 커널이 중첩 귀납적 타입을 처리하는 방식에 있습니다. 중첩 발생 I Ds is를 제거할 때 커널은 매개변수 인자 Ds가 귀납적 타입의 선언된 매개변수와 일치하는지 확인해야 합니다. 취약한 코드는 Ds의 프로젝션 식(.proj)이 올바른 구조체 이름을 참조하는지 확인하지 못합니다 — w : W이고 W ≠ C인 경우에도 .proj C 0 w가 허용됩니다.
해시 충돌(커널은 정의적 동일성 검사에서 Expr.hash 비교를 사용함)과 결합하면, 공격자는 커널의 내부 타입 할당이 실제 용어 의미론과 일치하지 않는 선언을 등록할 수 있으며, 이로 인해 타입 혼동과 False의 증명이 발생합니다.
| Field | Value |
|---|
| CVE | CVE-2026-72844 |
| Advisory | VulnCheck VCSA |
| Bug report | leanprover/lean4#14576 |
| Fix | leanprover/lean4#14577 |
| Affected | Lean 4 ≤ v4.31.0 / nightly ≤ 2026-07-27 |
| Fixed in | 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 중간 |
| CVSS 3.1 | AV:L/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:N — 6.3 중간 |
| CWE | CWE-843 (타입 혼동) |