Skip to main content

警惕私钥缺陷,牛奶悲伤漏洞已造成近30枚BTC被盗

号外:公众号「刘教链内参」今日发表《内参:10亿港元的豪宅,加密的尽头》。欢迎点击阅读。


隔夜比特币仍在29k上方横盘。

在刘教链所著《上帝掷骰子:比特币史话》一书(https://leanpub.com/history-of-bitcoin )第十八章,专门以一章7小节的篇幅来讲述了随机数和随机性在比特币系统中的关键作用。

20230815-B01.png

其中第88话“脑钱包”一节开篇就如此写道:

20230815-B02.png

这三个随机性至关重要的关键之处首当其冲的就是私钥生成这一环节,也是起步的一个环节。看过刘教链《如何用私钥保管比特币》一文的朋友都记得,教链介绍大家使用的私钥生成工具是需要你自己随便敲击键盘或者移动鼠标来输入外部随机性(专业术语叫做“熵”)。

为什么?因为计算机算法都是确定性算法,而确定性算法不能产生真随机数。1951年现代计算机之父冯诺依曼就说过,“任何考虑使用算术方法生成随机数的人,都是有罪的。”

20230815-B03.png

那么,今天我们要介绍的这个今年刚刚被发现的、被称之为Milk Sad(牛奶悲伤)[1]的比特币工具libbitcoin的漏洞CVE-2023-39910,就是由于随机数缺陷,从而导致生成存在随机性缺陷的私钥。

已知最早被黑客利用该漏洞盗窃比特币发生在今年(2023年)5月份。而最近最大的一笔与该漏洞有关的比特币盗窃案发生在刚刚过去的7月,总失窃金额约为29.65枚BTC。

更可怕的是,使用libbitcoin提供的bx seed命令生成比特币私钥的使用教程被全球畅销书《精通比特币》(Mastering Bitcoin)所介绍,这就意味着,无数通过这本书学习比特币基本操作入门知识的小白,很可能用了这个工具来创建了自己的比特币私钥,从而成为黑客眼中待宰的羔羊。

关于bx seed命令的使用,就出现在《精通比特币》一书的第四章“密钥和地址”[2]

20230815-B04.png

在此,警告各位读者,千万不要再使用该命令来创建你的比特币私钥!

根据milksad漏洞披露网站的介绍,bx工具仅仅采用系统时钟作为随机性来源,导致它所产生的私钥不具备通常比特币私钥应该具有的128位、192位或者256位熵(随机性),而仅有32位熵。这意味着,随机空间只有2^32 = 4,294,967,296种可能性。一台计算机用不到一天的时间就可以遍历这个空间,从而破解所生成的私钥。

这个漏洞为什么叫做“牛奶悲伤”这么一个有趣的名字呢?因为当系统时间为0.0的时候,它总是会输出相同的结果,即下面这套助记词:

milk sad wage cup reward umbrella raven visa give list decorate bulb gold raise twenty fly manual stand float super gentle climb fold park

前两个单词正是milk sad。


后记:不仅仅是在生成助记词的环节要格外小心随机性缺陷问题,在使用过程中也同样存在这个问题。简单地讲,每次用私钥签名动币,都要用到随机数,如果这个随机数出现缺陷,那么黑客也可以算出来你的私钥,从而偷走你的币。

这个问题,教链在《比特币史话》第89话中讲过:

20230815-B05.png

这既是中本聪为何推荐每个比特币地址只用一次的原因,也是我们绝不应该随便使用各种没有久经考验的软件钱包App或者硬件钱包的原因。

尤其是以太坊及其兼容链(包括二层网络),几乎必定存在着严重的地址复用问题。如果你的助记词或者私钥在某钱包App里发起过交易,那么它的缺陷随机性就可能暴露你的私钥。或者你买了某厂的硬件钱包,把助记词或私钥放到该硬件钱包中,那么当签名交易时,该硬件钱包内置的随机数发生器有缺陷,同样会导致你的私钥暴露。

由于所有以太坊兼容链的私钥-地址对是完全兼容的。这就意味着,你在某个侧链(比如Polygon)或者二层(比如Base)上,使用了不良的随机数签署了交易,造成了私钥暴露,那么你在所有以太坊兼容链上的资产就全部都不安全了!

参考资料: