VYPR
High severityNVD Advisory· Published May 2, 2025· Updated Apr 15, 2026

CVE-2025-46723

CVE-2025-46723

Description

OpenVM is a performant and modular zkVM framework built for customization and extensibility. In version 1.0.0, OpenVM is vulnerable to overflow through byte decomposition of pc in AUIPC chip. A typo results in the highest limb of pc being range checked to 8-bits instead of 6-bits. This results in the if statement never being triggered because the enumeration gives i=0,1,2, when instead the enumeration should give i=1,2,3, leaving pc_limbs[3] range checked to 8-bits instead of 6-bits. This leads to a vulnerability where the pc_limbs decomposition differs from the true pc, which means a malicious prover can make the destination register take a different value than the AUIPC instruction dictates, by making the decomposition overflow the BabyBear field. This issue has been patched in version 1.1.0.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
openvmcrates.io
>= 1.0.0, < 1.1.01.1.0

Patches

2
68da4b50c033

fix: auipc range check `pc_limbs[3]` to 6-bits

https://github.com/openvm-org/openvmJonathan WangApr 16, 2025via ghsa
1 file changed · +3 2
  • extensions/rv32im/circuit/src/auipc/core.rs+3 2 modified
    @@ -129,8 +129,9 @@ where
                 need_range_check.push(limb.into());
             }
     
    +        assert_eq!(pc_limbs.len(), RV32_REGISTER_NUM_LIMBS);
             // pc_limbs[0] is already range checked through rd_data[0]
    -        for (i, limb) in pc_limbs.iter().skip(1).enumerate() {
    +        for (i, limb) in pc_limbs.iter().enumerate().skip(1) {
                 if i == pc_limbs.len() - 1 {
                     // Range check the most significant limb of pc to be in [0, 2^{PC_BITS-(RV32_REGISTER_NUM_LIMBS-1)*RV32_CELL_BITS})
                     need_range_check.push(
    @@ -242,7 +243,7 @@ where
                 need_range_check.push(limb);
             }
     
    -        for (i, limb) in pc_limbs.iter().skip(1).enumerate() {
    +        for (i, limb) in pc_limbs.iter().enumerate().skip(1) {
                 if i == pc_limbs.len() - 1 {
                     need_range_check.push((*limb) << (pc_limbs.len() * RV32_CELL_BITS - PC_BITS));
                 } else {
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

7

News mentions

0

No linked articles in our index yet.