每隔一段时间,就会有新闻,说美国政府没收了xxx的大量加密货币;而此类新闻对于如何没收的语焉不详;让很多不明真相的群众,认为比特币又又又被攻破了,什么去中心化并非真正的去中心化,美国政府想没收谁就没收谁……
这里面最大的一个事件,应该是2025年10月,美国司法部以“打击跨国电诈洗钱”为名义,对柬埔寨太子集团创始人陈志发起刑事指控,罪名涉及电信网络诈骗、洗钱等,同时高调宣布没收其控制的约12.7万枚比特币,按当时市场价格计算价值约150亿美元,创下美国司法部门历史上最大规模的虚拟资产没收纪录。
那么,这12.7万枚比特币,究竟是如何被没收的呢?难道是刑讯逼供出来的私钥?还是真的美国政府握有比特币的某个不为人知的漏洞?
我仔细研究了一番,发现这是一个非常有意思的故事;
这位陈志,是柬埔寨从事诈骗行业里面的翘楚,他应该是诈骗的钱太多了,无法都洗白;机缘巧合之下,他发现了比特币这个东东;他也应该做了一番学习,发现绝佳的洗钱渠道,并不是直接买币,而是成立一个矿池,先把钱换成设备和算力,然后用电费源源不断的转换为比特币;这个过程完全是公开透明且合法;真是一个洗钱的好手段;
他成立的矿池叫LuBian矿池(LuBian mining pool);成立于2020年初,是一个快速崛起的比特币矿池,以中国和伊朗为主要运营基地。2020年12月,LuBian矿池遭受了一次大规模黑客攻击,导致其超过90%的比特币持有量被盗。被盗总额127272.06953176BTC; 与美司法部起诉书中所称127271BTC基本吻合。
也就是说,美国政府有个技术部门,他们长年累月的寻找各种比特币的薄弱钱包,然后进行攻击和没收;这其实就是国家支持的明抢;然后有意思的是,2020年这个技术部门偷窃了所有比特币,转到了几个冷钱包里面,到2025年才公开宣布;这5年,应该是去寻找合理合法没收的法律证据;
那么最关键的,美国政府是找到了什么比特币的漏洞,没收了这12w枚比特币?
我又做了一番研究,发现竟然是从2017年,就广泛存在于社区的一个漏洞!且听我慢慢道来:
Libbitcoin Explorer的漏洞
比特币有个历史悠久的库实现,叫 Libbitcoin Explorer,社区里简称为bx;就是把比特币的私钥生成、钱包组织、区块链数据解析等等杂活,做成这么一个库,供大家学习使用;
这个项目,是用于教学和小工具方向的,并没有经过工业界的安全审计,他的作者也明晃晃的在项目主页说明了:仅供学习使用!但是项目实现的质量很高,很多比特币客户端以及矿池的实现,都会参考他,甚至直接引入代码;
然后在2017年3月8日,这个库的作者发布了3.0.0版本;出于教学的考虑,作者把原来随机数的生成方法,由系统的随机生成函数,换成了一个叫 mt19937的随机数算法;具体代码是这个提交;
然后过了将近6年,在2023年7月22日,有一个团队,发现这个随机数生成算法的空间是非常有限的,仅仅有2^32;就是说,可以通过遍历的方法,来碰撞所有随机数;
经过各种拉扯,最后litbitcoin的开发团队认为这不是一个问题,因为这个库的定位是教学,而不是工业实现;mt19937确实是科学界为了能够得到一个比较真的随机数最方便的算法;他们最后拖到 2023年8月08日给出了一份报告
这个随机数算法,被libbitcoin库所有的3.x版本采用,作为教学示范,整整存在了6年,而没有人质疑!
而路边矿池的开发者,估计也是参考了这个库,这个矿池的所有私钥,都是用mt19937的算法生成的;美国政府技术团队,在2020年发现了这个漏洞,从而转移了这个矿池的所有币;
币安的漏洞
然后还有一条另外的平行的时间线,就是币安有一个官方的钱包:TrustWallet;这个钱包的web版本依赖于WASM,在2022年的一次升级中,WASM为了支持多个平台,把random变成了MT19937,随之所有依赖这个调用的软件的随机数生成都出现问题;
2022-11-14: 币安发布了有问题的钱包
2022-11-17: Ledger团队联系币安报告漏洞
2022-11-21: 币安在Github上提交修复程序,并提示用户升级钱包
2023-04-22: 币安团队撰写了事后分析报告,并承诺所有受此次影响被盗的钱包会得到全额赔付
分析见:
https://www.ledger.com/blog/Funds-of-every-wallet-created-with-the-Trust-Wallet-browser-extension-could-have-been-stolen
MT19937 Crack分析
那么我们来具体分析一下这个漏洞究竟是如何被攻击的, 采用了MT19937随机数生成的私钥,具体流程如下:
私钥生成流程:
-
种子的生成逻辑:从随机数到字节流
• 每轮贡献一个字节:MT19937 算法每运行一个循环(Round)会输出一个 32 位整数,但该软件仅截取其中的最高 8 位(即 1 个字节)。
• 32 轮构建一个种子:比特币的私钥种子需要 256 位(32 字节)。因此,程序必须让生成器运行 32 轮,将每一轮得到的那个字节按顺序连接起来,最终组成一个 32 字节的种子。
-
OFFSET(偏移量)的作用
OFFSET 功能的引入是为了在同一个随机数序列中寻找更多的可能性。由于 MT19937 生成的是一个无限的确定性序列,程序可以通过跳过前面的字节来选择不同的起始点:
• OFFSET = 0:取序列中第 0 到 31 轮生成的字节。
• OFFSET = 1:取序列中第 32 到 63 轮生成的字节。
• 扩大范围的假象:来源指出,OFFSET 的值甚至可以达到 3232。开发者引入此功能的本意可能是为了增加生成的随机性或私钥范围,但由于底层算法是非加密安全的,这反而为黑客提供了多个可预测的“窗口”。
-
组合32轮生成高8位字节,得到1初始熵 (Entropy):32 字节(缺陷发生点)
这是生成钱包的第一步,也是 Libbitcoin Explorer (bx) 出现问题的地方。
• 规范要求:生成 24 个助记词需要 256 位(32 字节) 的随机数据。
• 来源中的逻辑:Libbitcoin 使用缺陷随机数生成器(MT19937-32)来产生这 32 字节 的数据,。
• 漏洞本质:虽然最终需要 32 字节,但由于它是用低熵的时间戳生成的,黑客可以轻松“猜”出这 32 字节的原始面貌,。
-
助记词 (Mnemonic):24 个单词
• 这 32 字节的初始熵会被转换成 24 个 BIP39 助记词(如 apple banana …)。
• 注意:这 24 个单词和那 32 字节的熵在数学上是等价的。如果你能破解熵,你就拿到了单词。
-
二进制种子 (Binary Seed):64 字节(你看到的那个长数值)
当你有了 24 个单词后,BIP39 规范会使用 PBKDF2(一种密钥拉伸算法) 对单词进行哈希处理,最终生成一个 512 位(64 字节) 的二进制种子。
• 这就是你提到的那个超长数值。
• 这个 512 位的种子随后会被用作 BIP32 算法 的输入,用来派生出主私钥(Master Private Key)和所有的子私钥。
重现
这个过程的关键就是偏移量这一步;矿池的开发者还是有一点儿安全意识的,他没有直接用MT19937生成的随机数,而是引入了偏移量,但是致命的是:即使是引入100轮的偏移量,其碰撞空间还是不够大!
我在Github上模拟了这个过程:
https://github.com/brainzhang-bitcoin/CrackMt19937
具体流程如下:
Once the original 32-bit seed is recovered , the private key reconstruction process becomes fully deterministic according to the BIP-39 and BIP-32 standards:
-
Entropy generation:
seed → MT19937 → 256-bit pseudorandom sequence -
Checksum calculation:
SHA-256(entropy) → first 8 bits -
Mnemonic formation:
(entropy || checksum) → 24 BIP-39 words -
Master seed derivation:
PBKDF2-HMAC-SHA512(mnemonic, “mnemonic” || passphrase, 2048 iterations) → 512-bit seed -
Master key generation:
HMAC-SHA512(” Bitcoin seed “, master_seed) → (master_private_key, chain_code) -
Hierarchical derivation:
BIP-44 path: m/44’/0’/0’/0/0 → final private key
Transformation chain:
1
| |
全部碰撞出来所有的私钥还是需要一点儿时间的,为了提高效率,我用CUDA和OPENGL写了两个版本,在一张3060 12GB显卡上,花了两个月时间(当然,财大气粗的政府团队,可能顶级设备,几个小时就搞定了),碰撞了所有的可能的mt19937随机数以及偏移量;最后结果大概是得到了超过22w个私钥!
下面是我随意摘取的一些碰撞结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
而采用MT19937随机数生成私钥的钱包,还有另外一个风险,就是不一定你的交易上链才会被爆破;而是在广播交易,还在内存池的时候,就有可能被窃取;原理如下:
-
MT19937的碰撞空间在2^32,攻击者完全可以生成一个私钥-> hash160的bloomfilter文件,然后监控所有内存池中的交易
-
每一笔交易,都可以用hash160来碰撞,如果碰撞成功,再到数据库中寻找完整的私钥
-
提高手续费构建新的交易
-
完成盗币
-
整个流程如果用CUDA显卡来碰撞,仅仅几秒钟就可以实现
这个事件的启示
-
已经有国家级别的技术力量,至少从2020年开始,就不间断的寻找比特币的所有薄弱环节
-
生成私钥的算法,一定要选择工业级别的随机数生成算法
-
加密世界,光懂技术是不够的,但是不懂技术是万万不可的
-
任何在你眼中的高大上的机构都有可能被一击致命;包括各种矿池,交易所,国家承认的ETF等等
-
比特币是一种完全由你自己负责的资产,放在交易所、购买ETF,还是信任任何一个中心化的机构,都是推卸责任,总有一天你会被反噬的