CVE-2020-37268: Coq and Rocq Prover Print Assumptions Omits Unsafe Universe Checking Inlined Through Parameter Inline
Print Assumptions does not report that a definition was produced while universe checking was disabled when that definition reaches the caller through Parameter Inline in a module type. Applying a functor inlines the body of the parameter, and the inlining drops the record that the term was built under Unset Universe Checking, so the resulting constant carries no trace of the unsafe operation. A module implementation can therefore prove False using a universe inconsistency, expose it through an inlined parameter, and have Print Assumptions report the dependent proof as closed under the global context. Because Print Assumptions is the in-process audit used to confirm that a development rests on no unexpected assumptions, a dependency built this way passes that audit while proving arbitrary propositions. The standalone checker coqchk does reject the resulting compiled file. The project records this in dev/doc/critical-bugs.md under non-fixed bugs and rates the risk as moderate when coqchk is not used.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Configuration
Run coqchk (standalone checker) in addition to Print Assumptions, because Print Assumptions does not report that universe checking was disabled when the definition is passed to the caller via Parameter Inline.
Coq / Rocq Prover Print Assumptions workflow coqchk usage = enabled - Compensating control
Use the standalone checker coqchk to validate the compiled file, since it rejects artifacts produced with unsafe universe checking inline through a parameter.
Event History
Frequently Asked Questions
Who is exposed to this issue?
Projects that rely on Print Assumptions as their in-process audit for unexpected assumptions are exposed when dependencies can use Parameter Inline in a module type and disable universe checking. The recorded risk is moderate when coqchk is not used.
What does an attacker or malicious dependency need to do?
They need to create a definition while universe checking is disabled, route it through a Parameter Inline in a module type, and have a functor inline that parameter body. This can hide the unsafe origin from Print Assumptions while allowing a universe inconsistency to be used to prove False.
How can I detect affected compiled artifacts?
Run the standalone coqchk checker on the compiled file. Unlike Print Assumptions, coqchk rejects the resulting file.
What should be done if patching is not available?
Use coqchk to validate compiled files rather than relying solely on Print Assumptions. This specifically addresses the audit bypass described here.