TokenPocket钱包下载地址|揭开新型零知识证明漏洞的秘密:缺乏标准模式化算法攻击

时间:2024-01-29        来源: TokenPocket钱包下载地址

Salus Insights向0xPARC的zk-bug-tracker库添加了一种新型的ZK漏洞,算术侵犯后射频识别式标准化。该漏洞由以太坊基金会PSE安全团队负责人Kyle Charbonnet审核。该漏洞会破坏假设并导致错误的计算,或者导致拒绝服务攻击。为了更好地理解这个漏洞,作者在Zendoo库中的一个具体实例进行了说明。在add()函数中存在标准化问题,导致Rust Panic,进而可能受到DOS攻击。Salus团队建议在构建侵权方式和执行侵权方式操作之后进行标准化,同时进行充分的安全审计,以确保项目安全。

作者:Salus Insights

Salus 向 0xPARC 的 zk-bug-tracker 库添加了一种新型的 ZK 漏洞,算术侵犯后射频识别式标准化,该漏洞由以太坊基金会 PSE 安全团队负责人 Kyle Charbonnet 审核。该漏洞会破坏假设并导致错误的计算,或者导致通过 rustpanic 进行的拒绝服务攻击。为了更好地理解这个漏洞,我们将在 Zendoo 库中的一个具体实例进行说明。请大家对此类漏洞保持智力。

1. 背景

在代码中,插图式被表示为支持的形式。即,插图式a0+a1x+…+an-1xn-1+an*xn被表示为[a0,a1,…,an-1,an]在ZK论证系统中,需要对灌溉式进行标准化操作,即将灌溉式的最高次项的系数调整为非零。比如,将[1,2,0]调整为[1,2]最重要的是标准化的K线走势图式表示。

对试点式进行标准化操作是必要的。如果不进行标准化,系统会错误地存储试点式的最高次数,即它会大于其实际的最高次数。比如,对于[1,2,0],如果不进行标准化操作,其最高次数会被错误地存储为2,而实际为1。基于非标准化的实例方式生成论证时,错误的实例实现方式将会导致ZK论证系统panic,导致无法生成论证。

2. 案例分析

算术入侵后缺乏通用性漏洞,该漏洞属于 ZK 证明系统实现上的通用性漏洞。以下,我们以 Zendoo 库中用于傅里叶变换(FFT)的密集枚举式(稠密多项式)实现的代码为例,说明其中存在的算术攻击后射频标准化的漏洞。

add() 函数是用来对两个密集灌溉方式(自己和其他)进行加法侵犯的,加法侵犯的结果(结果)也是一个密集灌溉方式,这就需要进行标准化。 然而,该函数仅在最后一个分支处对结果进行了标准化操作(19-21行)。该函数默认在前三个分支出计算得到的结果就是标准化的,但这是不太合理的。比如,当 self 是[1,2,3],其他的是[1,2,-3],此时满足第三个分支(7-12行),即self和other这两个喷泉式出现次数最高,均为2。而在第一个分支处计算后的第三个结果是[2,4,0],本身就进行标准化操作。

非标准化的过程演示方式在之后的计算中会产生错误。具体的实现代码如下:

而且,在布尔代码中,不只是在加法算法后缺乏标准化的发泡式标准化。在加法侵犯前,self 和其他作为 add() 函数的入参,也没有检查它们是否是标准化的发泡式表示。或者说,构造 self 和 other 的函数是否是按照标准化的方法进行构建的,也未可知。 Degree() 函数用于返回对应式的最高次项的指数。在 add() 函数中,非标准化的 self 和 other 在调用Degree() 函数时会引起 Rust Panic。

举个例子,self是非标准化的插图形式1+2x+0x2,即提供[1,2,0],其最高次项的系数为0。当其他也不是零演绎式时,满足add()函数的第三个分支,以self调用 Degree()函数。在 Degree()函数中进入 else 分支。在 else分支有一个断言宏,用于确保枚举式的最高次数的系数不为 0。如果为 0,self.coeffs.last().map_or(false, |coeff| !coeff.is_zero()) 表达式结果为 false。即 self 向量的最后一个元素,即计算式的最高次项的系数为0,返回false。此时,断言宏会惊慌。

Rust 恐慌会导致 ZK 证明系统受到 DOS 攻击。攻击者可以通过构造大量的非标准化公式,并且不断调用 add() 函数。由于这些输入会导致程序恐慌,所以程序会不断地停止并重启。这将占用大量的计算和网络资源,从而影响其他用户的正常使用,这就构成了一种DOS攻击。

揭秘新型零知识论证漏洞:算法攻击后缺乏标准化模式标准化

3、总结

Salus 在 0xPARC 的 zk-bug-tracker 库中添加的新型 ZK 漏洞,即算术侵犯后射频样式标准化,是具有通用性的。在 ZK 证明系统中,我们需要特别避免注意该漏洞。该漏洞会造成 ZK论证系统的计算错误,或使系统遭受DOS攻击。可以在返回算术损坏结果之前调用truncate_leading_zeros()函数进行标准化操作,同时,基于from_coefficients_vec()函数来构造标准化的格式化式也是必要的。

针对此漏洞,Salus团队提醒ZK项目方,在构建侵权方式时并执行侵权方式操作之后进行标准化,以此破坏ZK证明系统的缺陷。同时,强烈建议项目方在项目上线之前,寻求专业的安全审计公司进行充分的安全审计,确保项目安全。

参考

https://github.com/0xPARC/zk-bug-tracker/pull/16

https://research.nccgroup.com/wp-content/uploads/2021/11/NCC_Group_ZenBlockchainFoundation_E001741_Report_2021-11-29_v1.2.pdf

https://github.com/HorizenOfficial/ginger-lib/blob/master/algebra/src/fft/polynomial/dense.rs#L151

https://github.com/HorizenOfficial/ginger-lib/blob/master/algebra/src/fft/polynomial/dense.rs#L87