
CVE-2026-72714 — 모듈 닫힌 후 Rocq 유니버스 검사 상태 동기화 해제
모듈 범위 유니버스 검사 플래그의 동기화 해제를 통해 공리 없이 0 = 1 증명하기.
| 필드 | 값 |
|---|---|
| 버그 리포트 | rocq-prover/rocq#22287 |
| 수정 | 없음 (2026-08-16 기준 이슈 열려 있음) |
| 영향받는 버전 | Rocq ≤ 9.2.0 / Coq 8.x (stdlib에 Hurkens가 포함된 모든 버전) |
| CVSS 3.1 | AV:L/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:N — 7.1 |
| CWE | CWE-488 (잘못된 세션에 데이터 요소 노출), CWE-20 (부적절한 입력 검증) |
| CVE | CVE-2026-72714 |
Rocq Prover의 모듈 시스템은 Local Unset Universe Checking 플래그의 범위를
제대로 지정하지 못한다. 모듈 내부에서 사용될 때, 이 플래그는 모듈이 종료될 때
이전 상태로 복원되어야 한다. 그러나 유니버스 그래프(ugraph)는 플래그의 자체
복사본을 유지하며, 이는 모듈 종료 시 전역 상태와 동기화가 어긋나게 된다.
동기화가 해제된 후:
Test Universe Checking은 켜짐을 보고한다 (전역 플래그는 복원됨)ugraph는 여전히 유니버스 검사가 꺼져 있다 (자체 복사본은 복원되지 않음)유니버스 검사가 사실상 비활성화되면 Hurkens의 역설이 적용된다:
TypeNeqSmallType.paradox는 유니버스 제약이 강제되지 않을 때 u < v인
Type@{u}와 Type@{v}가 혼동될 수 있다는 사실을 악용하여 False의 직접적인
증명을 도출한다.
익스플로잇:
Print Assumptions는 "Closed under the global context"를 보고함Stdlib.Logic.Hurkens만 필요로 함docker build -t rocq-cve-poc-22287 .
docker run --rm rocq-cve-poc-22287
취약한 Rocq 버전에서 예상되는 출력:
[*] Compiling ZeroEqOne.v ...
Universe Checking is on.
bad is defined
Closed under the global context
zero_eq_one is defined
Closed under the global context
[!] VULNERABILITY CONFIRMED
zero_eq_one : 0 = 1
Depends on: no axioms (closed under the global context)
Bug class: Universe checking state desync (CWE-488)
Root cause: ugraph retains stale Local Unset Universe Checking flag
Bug report: https://github.com/rocq-prover/rocq/issues/22287
Rocq의 커널 검증 증명을 신뢰하는 모든 시스템이 영향을 받습니다:
.v 파일이
다운스트림 증명이 의존하는 불건전한 선언을 조용히 도입할 수 있습니다.커널의 유니버스 그래프(ugraph)는 Universe Checking 플래그의 자체 사본을
포함합니다. 모듈이 Local Unset Universe Checking을 사용하면,
플래그는 전역 상태와 ugraph 양쪽에서 수정됩니다. 모듈이 닫힐 때
전역 상태는 모듈의 저장된 상태에서 복원되지만, ugraph의 사본은
동기화되지 않아 유니버스 검사가 사실상 비활성화된 상태로 남습니다.
┌─────────────────────────────────────────────────────┐
│ 1. Universes u v. Constraint u < v. │
│ → Declare universes with strict ordering │
├─────────────────────────────────────────────────────┤
│ 2. Module Off. │
│ Local Unset Universe Checking. │
│ End Off. │
│ → ugraph flag stays OFF after module closes │
├─────────────────────────────────────────────────────┤
│ 3. Test Universe Checking. → reports "on" (LIE) │
├─────────────────────────────────────────────────────┤
│ 4. eapply TypeNeqSmallType.paradox; reflexivity. │
│ → Kernel accepts universe-inconsistent proof │
│ → False proved with no axioms │
├─────────────────────────────────────────────────────┤
│ 5. zero_eq_one : 0 = 1 │
│ → Derived via exfalso │
└─────────────────────────────────────────────────────┘
| 측면 | Rocq #22287 (이 버그) | Lean #14484 | Lean #14576 |
|---|---|---|---|
| 증명 보조기 | Rocq (Coq) | Lean 4 | Lean 4 |
| 버그 분류 | 모듈 시스템의 상태 비동기화 | 추론 캐시 오염 | 프로젝션을 통한 타입 혼동 |
| 익스플로잇 복잡도 | 6줄 | ~20줄 | ~50줄 |
| 유니버스/타입 시스템 | 유니버스 검사 우회됨 | 불투명 FVar 허용됨 | 팬텀 매개변수 탈출 |
| 수정 상태 | 미해결 | 수정됨 (PR #14498) | 수정됨 (PR #14577) |