1. 引言

Trail of Bits团队近期发布Coordinated disclosure of vulnerabilities affecting Girault, Bulletproofs, and PlonK,指出Bulletproofs和Plonk等ZKP系统中的Fiat-Sharmir实现存在漏洞,使得恶意用户可为随机statement伪造proof。Trail of Bits将该漏洞命名为Frozen Heart,其中Frozen代表FoRging Of ZEro kNowledge proofs,Heart是指Fiat-Shamir transformation是很多proof system的核心。【该漏洞本质就是,作弊的Prover可就实际不知道的witness伪造证明。】

Trail of Bits提前通知了相关团队修复了该漏洞之后,才进行了公开披露。受影响的库主要有:

  • ZenGo的zk-paillier:已打补丁。
  • ING Bank’s zkrp (该库目前已删除)
  • SECBIT Labs的 ckb-zkp
  • Adjoint, Inc.的 bulletproofs:
    在 Bulletproofs论文 中,作者推荐了一种不安全的Fiat-Shamir生成方式。该作者已在论文最新版本中更新了该问题,在 y y y的计算中引入了statement s t st st。(可参看博客 Bulletproofs: Short Proofs for Confidential Transactions and More学习笔记。)
  • Dusk Network的 plonk:已打补丁
  • Iden3的 SnarkJS:已打补丁
  • ConsenSys的 gnark:已打补丁

因Fiat-Shamir实现引起的漏洞问题并不新鲜,如:

  • 2016年论文 How not to Prove Yourself: Pitfalls of the Fiat-Shamir Heuristic and Applications to Helios
  • 2020年论文 When is a test not a proof?

2021年2月博客 Serving up zero-knowledge proofs中以乒乓球评级形象描述了ZKP系统中的commit->challenge->prove流程,以及ZKP系统的soundness含义。

借助Fiat-Shamir transformation,可将ZKP的interactive交互 转换为 non-interactive。实现方法是引入哈希函数,将哈希函数看成是a random oracle。因此,选择哈希函数的输入则至关重要。仍然以打上面的乒乓球评级为例,若wall的内部随机数仅依赖speed和spin,而不依赖于位置,则具有相同speed和spin,打到wall上不同位置的球将返回到相同的位置,即相当于Prover获得了相同的challenge,这样这些challenge就不再是真正随机的,使得Prover可打破ZKP方案的soundness。

也就是说,哈希函数输入参数的小差别,可能会引法协议的严重安全后果。

2. sigma protocol中的错误实践

sigma protocol协议可参看:

  • 基于Sigma protocol实现的零知识证明protocol集锦

以一个简单的sigma protocol——Schnorr protocol为例,针对的场景为:

  • public info: g , Y g,Y g,Y
  • witness: X X X
  • 待证明relation: Y = g X Y=g^X Y=gX

针对上述场景的interactive版本证明过程为:

  • 1)Prover:生成随机数 A A A,计算 B = g A B=g^A B=gA,将 B B B发送给Verifier;
  • 2)Verifier:给Prover发送random challenge C C C;
  • 3)Prover:发送proof Z = A + C X Z=A+CX Z=A+CX给Verifier;
  • 4)Verifier:验证 g Z = B Y C g^Z=BY^C gZ=BYC是否成立即可。

借助Fiat-Shamir实现的non-interactive版本证明过程为:

  • 1)Prover:生成随机数 A A A,计算 B = g A B=g^A B=gA;
  • 2)Prover:采用哈希函数生成random challenge C C C;
  • 3)Prover:发送proof Z = A + C X Z=A+CX Z=A+CX和 B B B给Verifier;
  • 4)Verifier:采用(相同输入的)哈希函数生成random challenge C C C,验证 g Z = B Y C g^Z=BY^C gZ=BYC是否成立即可。

关键在于,Prover是如何生成随机值 C C C的呢?在interactive版本中,Prover会将 B B B发送给Verifier,因此,可选择 C = H a s h ( B ) C=Hash(B) C=Hash(B)——这就是理论学家所称的弱Fiat-Shamir transformation,正如你可能怀疑的那样,这会产生一些微妙的后果。在实践中,敌手可提供a valid proof for some public key even if they don’t know the secret key,具体为:

  • 1)令 P K ′ PK' PK′为某个Prover不知道私钥的公钥。
  • 2)令 B = P K ′ , C = H a s h ( B ) B=PK',C=Hash(B) B=PK′,C=Hash(B)
  • 3)选择随机数 Z Z Z
  • 4)令 P K = ( g Z / P K ′ ) 1 / C PK=(g^Z/PK')^{1/C} PK=(gZ/PK′)1/C。【由于不知道 P K ′ PK' PK′的私钥,自然也不知道 P K PK PK的私钥。】

这样,敌手就可声称其知道 Y = P K Y=PK Y=PK的私钥(其实并不知道),在上面的non-interactive版本证明中,设置 B = P K ′ B=PK' B=PK′和在步骤3)中已预取的 Z Z Z,使得Verifier验证 g Z = B Y C g^Z=BY^C gZ=BYC仍能通过。从而破坏了ZKP的soundess——不知道私钥 X X X的Prover可提供forged proof。


为解决该问题,计算 C C C的方式应为:【强Fiat-Shamir transformation】

  • C = H a s h ( B , Y ) C=Hash(B,Y) C=Hash(B,Y)
  • 或 C = H a s h ( B , Y , g ) C=Hash(B,Y,g) C=Hash(B,Y,g)

从而可保证soundness,使得Prover无法提供forged proof。

如Swiss的选举系统中,采用了ZK方案来生成a decryption proof,来证明an encrypted vote decrypts to the correct result。但是,在实际实现时,由于在Fiat-Shamir transformation时哈希函数的输入不完整,使得Prover可create false proof——即可将有效的选票修改为无效不计数。详细参看2020年论文 How not to prove your election outcome。

参考资料

[1] 2022年4月博客 Coordinated disclosure of vulnerabilities affecting Girault, Bulletproofs, and PlonK
[2] 2021年2月博客 Serving up zero-knowledge proofs

Bulletproofs和Plonk等ZKP系统中Fiat-Shamir实现漏洞Frozen Heart相关推荐

  1. 黑客发现瑞士电子选举系统中的多个漏洞并获奖2.7万美元

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 研究人员已经从瑞士新推出的电子选举系统漏洞奖励计划中赚取了数千欧元的奖励. 20多年前,瑞士出现电子选举,不过负责电子选举的瑞士邮政已经在着手推 ...

  2. 网站安全测试与检测中 发现的OA系统中的SQL注入漏洞

    近日,SINE安全监测中心监控到泛微OA系统被爆出存在高危的sql注入漏洞,该移动办公OA系统,在正常使用过程中可以伪造匿名身份来进行SQL注入攻击,获取用户等隐私信息,目前该网站漏洞影响较大,使用此 ...

  3. 攻防演练中的业务逻辑漏洞及检测思路

    随着各类前后端框架的成熟和完善,传统的SQL注入.XSS等常规漏洞在Web系统里逐步减少,而攻击者更倾向于使用业务逻辑漏洞来进行突破.业务逻辑漏洞,具有攻击特征少.自动化脆弱性工具无法扫出等特点,也为 ...

  4. 先进机器人系统中的关键技术

    先进机器人系统中的关键技术 Key technologies coalesce in advanced robotic systems 就在机器人设计进入商业领域,服务于制造业.物流业和服务业之际,概 ...

  5. Linux系统中创建大文件,并作为文件系统使用

    在LInux系统的使用过程中,有时候会遇到诸如某个磁盘分区的大小不够用了,导致其下的文件系统不能正常写入数据.亦或者是系统swap分区太小,不够用或者不满足条件而导致的其他一系列问题.如果我们系统上挂 ...

  6. ip设置 kali 重置_在 Windows 系统中如何重置 TCP/IP 协议堆栈修复网络连接问题

    Internet 在 TCP/IP 协议上工作,如果 TCP/IP 协议堆栈在 Windows 或任何其他操作系统(例如 Linux 或 MacOS)中无法正常工作,则您的 Internet 连接会出 ...

  7. linux ubuntu安装 mono,在Ubuntu 18.04系统中安装Mono及基本使用Mono的方法

    本文介绍在Ubuntu 18.04操作系统中安装Mono及基本使用Mono的方法.Mono是一个基于ECMA/ISO标准开发和运行跨平台应用程序的平台,它是Microsoft .NET框架的免费开源实 ...

  8. ROS系统中实现点云聚类(realsense数据源)

    本文主要介绍ROS系统中如何订阅并解码realsense点云数据,并对点云进行稀疏.去噪.聚类. 环境配置见<ROS系统中从零开始部署YoloV4目标检测算法(3种方式)> 需要安装的第三 ...

  9. win10html5无法播放,win10系统中网页中无法播放视频怎么办

    近日有win10系统用户要通过浏览器来打开网页观看视频的时候,却发现在网页中打开视频的时却无法播放,这是怎么回事呢,经过分析是由于Adobe Flash Player ActiveX插件未安装.版本过 ...

最新文章

  1. Blender从头到尾创建一辆宝马轿车视频教程
  2. 我在学习springboot和vue前后台连接时碰到的问题记录!(跨域问题)
  3. python---简单的接口测试实例
  4. web实现QQ第三方登录 开放平台-web实现QQ第三方登录
  5. leetcode算法题--链表中的下一个更大节点★
  6. What every programmer needs to know about game networking
  7. (转)Splay伸展树模板
  8. python爬虫-爬取今日头条(图集)
  9. java linq_LINQ和Java
  10. 金蝶记账王登录显示连接金蝶云服务器异常,金蝶KIS记账王系统初始化常见问题...
  11. 18个最常用的Win8快捷键
  12. Atitit.ide eclipse编译速度慢的解决
  13. web测试实践作业进度报告三
  14. 递归算法php,php递归算法经典实例
  15. 如何写php大马,带你走进php大马的结构模块编写之路
  16. U盘 / 移动硬盘在 Mac 苹果电脑上无法使用问题
  17. Mac上制作Linux U盘启动盘
  18. 【研究生论文写作】 思政相关题目选择题
  19. ZBrush笔刷属性栏简介
  20. 广图登陆知网下载资源教程

热门文章

  1. python整数运算_Python实现整数的四则运算
  2. html模板引擎的作用,如何用javascript实现一个模板引擎
  3. 奇偶校验码和海明码原理
  4. 奇点云数据中台技术汇 | 数据智能模型——数据中台航母的作战集群
  5. webpack配置(webpack配置文件)
  6. joomla 3.4.5 php版本,joomla升级
  7. 联想android刷机教程,联想X2-TO(VIBE X2 移动4G 安卓5.0)一键刷机教程,看教程刷机...
  8. 程序员逼格提升完全指南
  9. Putty Fatal Error:Network error connection refued
  10. HDU 5775 (树状数组)