CVE-2026-33471nimiq-block是Nimiq Rust实现的核心组件,用于提供区块原语。在1.3.0版本之前的`SkipBlockProof::verify`函数中存在严重的验证绕过漏洞。由于使用了`BitSet.len()`进行法定人数检查,却在索引聚合时将`usize`类型转换为`u16`,导致类型截断问题。攻击者能够构造特定的越界索引,使得长度计数虚高,但在实际操作中映射到相同的插槽。这允许拥有少量真实签名插槽的恶意验证者通过简单的签名倍增操作绕过安全验证,严重威胁区块链网络的共识机制。
该漏洞源于`SkipBlockProof::verify`函数在处理签名者索引时的类型转换逻辑缺陷。函数首先计算`BitSet`的长度作为法定人数的依据,随后遍历索引并进行聚合。关键问题在于,代码将`usize`类型的索引强制转换为`u16`类型(即`slot as u16`)。由于`u16`的最大值为65536,当攻击者提供间隔为65536的索引(例如0和65536)时,`BitSet.len()`会计数为2,满足`2f+1`的法定数量要求。然而,在转换为`u16`后,这两个索引都会变成0,导致它们指向同一个插槽位置。这种索引碰撞使得攻击者可以利用BLS签名的线性性质。攻击者无需控制足够数量的真实签名者插槽,只需控制一个插槽,并将对应的BLS签名乘以特定的因子(即伪造索引的数量),即可通过聚合验证。这破坏了拜占庭容错共识的安全性,允许攻击者伪造跳过区块的证明,从而控制网络状态或导致分叉。