有人正在盗取从未应被访问的比特币钱包。
这些币存放在Coldcard设备上——来自加拿大制造商Coinkite的硬件钱包,这种钱包从不连接互联网。没有钓鱼链接。没有恶意软件。没有被盗的笔记本电脑。攻击者只是找到了私钥的所在。
Galaxy Research现在已经追踪到超过1,596 BTC被盗,分为三波,并怀疑存在第四波,这将使总数达到约2,055 BTC——以当前价格约为1.3亿美元。一次操作在41分钟内转移了7000万美元。Coinkite表示至少有15个独立的攻击者参与其中。
该公司在8月1日发布了技术背景说明,解释了哪里出错了。这是一份异常坦诚的文件,简要版本是,钱包在八年的时间里一直在滚动加载的骰子,而没有人注意到。
零仍然是某种东西
在2021年,Coinkite将Coldcard的密码学迁移到libsecp256k1,这是比特币核心使用的相同库。这个决定很好,但集成处出了问题。
迁移悄然将种子生成从Coldcard自己的硬件随机数生成器重新路由到MicroPython的软件后备——一个名为Yasmarang的小算法,适用于没有随机芯片的设备。
Coldcard有一个随机芯片。它只是不再被请求使用。
原因几乎令人难以置信。一个构建保护使用了#ifndef,它检查一个设置是否存在,而不是检查它是否被打开。Coinkite将该设置定义为零,意味着“关闭”。因为零仍然被视为定义,所以安全检查通过,构建完成。两个版本的函数具有相同的签名,因此看起来没有问题。
“COLDCARD的大部分随机性来自一个我并不知道实际上存在于源代码中的伪随机数生成器,”Coinkite写道,指的是一种产生看似随机但遵循固定配方的开始值的软件。
如果给这个配方相同的起始值,你每次得到的输出都是一样的。
在运行固件4.0.1至4.1.9的Mk2和Mk3设备上,该起始值来自芯片的序列号和时钟。Coinkite估计结果搜索空间约为40位。较新的型号混合了一些安全元素熵,使它们提升到约72位。
无论如何都不是128,这是目标。
差距比看起来更重要。位是指数。128位的搜索空间拥有比可观测宇宙中的原子还要多的组合,而没有人去搜索它。40位大约是万亿——一个普通笔记本电脑可以处理的数字。你失去的每一位都将工作量减半。
Block的工程团队发布了他们自己的分析,将较新设备的有效安全元素搜索空间定为2^32个候选者,平均约为2^31次试验。他们对旧板的评估更直白:对于已知的设备ID、计时器状态和调用历史,钱包生成是确定性的。
而确定性正是随机的对立面,这对密码学至关重要。
不是“弱”。可预测。
Coinkite怀疑这是被机器发现的。“我们必须假设有人使用人工智能审查了我们固件的早期版本,并偶然发现了这个问题,”该公司写道,并补充说它最近运行了一个最佳的可用AI模型,但没有发现任何问题。“攻击者和防御者拥有相同的AI工具,但今天对我们没有帮助,只对坏人有帮助。”
所有受影响型号的固件修复已发布。它并不会修复现有的种子;那些钱包必须重新生成并移动资金。Decrypt已经报道了空气隔离存储在这样的攻击后如何改变,并追踪到损失超过1.14亿美元。
熵实际上是什么
熵是衡量攻击者不知道多少的指标。
换句话说,这基本上是以位计算的不确定性。一位是一次掷硬币:两个结果,而猜测者每次对中的概率是50%。十位是1,024个结果。每增加一位,猜测者的工作量就翻倍。
比特币钱包是一个巨大的秘密数字。人们发送货币的地址是通过数学从它推导出来的,而推导是单向的——你可以从密钥到地址,但无法回去。
因此,每个钱包的安全性取决于一个问题:攻击者必须尝试多少个数字?
如果数字是用128位熵选择的,答案是“超过物理所允许的”。如果它是用40位选择的,答案是“给我一些时间。”
这就是使量子计算威胁值得争论的同一特性——量子计算机会攻击将密钥与地址连接的数学。Coldcard漏洞不需要这样,它在数学介入之前就使得密钥变得可猜测。
这就是词汇变得棘手的地方。伪随机生成器生成的输出在统计测试中通过了随机性测试,因此基本上没有任何电子表格会标记它。该输出仍然完全由其种子值决定。虽然它看起来是随机的,但实际上并不是。
统计随机性和密码学不可预测性是不同的属性,而Coldcard的输出在通过第一个测试的同时在第二个测试中完全失败。
真正的随机性必须来自物理噪声:电路中的电气抖动、热波动、放射性衰变。这就是Coldcard上的硬件芯片的用途。这个芯片在构建标志中被断开了。
然后卢克·达什尔提到了骰子
当用户争先恐后地重新生成种子时,许多人选择了显而易见的低科技解决方案。Coldcard允许您掷物理骰子,并将结果用作熵。Coinkite自己的指导认为,使用至少50个独立的私骰子投掷生成的种子不受漏洞的影响。
这听起来可能很愚蠢,但该公司确实售卖一个包含“100个可爱小骰子”的袋子,以便让整个过程更加简单。
在7月31日,比特币核心开发者卢克·达什尔发布了一条警告:“相当多的人建议/使用骰子来缓解Coldcard漏洞。请注意常见的骰子未被设计为密码学安全。如果你要这样做,可能应该购买精密赌场骰子。即便如此,还要有另一个熵的来源。”
比特币Twitter对此反应激烈。
“哈哈,现在你连骰子都不能掷了,”一位用户写道。“自我保管结束了……”另一个人问他是否应该雇佣一个帕金森病患者来掷骰子。(不太友好。)
可能最有用的回复来自于算术。开发者贾斯汀·夏普计算了一个坏骰子让你损失的确切数额:
“过度杀伤。一个完美的d6每次掷出给出2.585位。一个明显偏向的骰子,例如,有一面以20%的概率落地而不是16.7%,仍然提供约2.55位。在99次掷骰子中,这会使熵差异约为~256位和~252位。”
256中的四位。这就是一个明显不公平骰子的全部惩罚。
达什尔并没有错,认为便宜骰子有可测量的偏差——注塑骰子去掉了每个面略微不同的塑料,这正是赌场使用充满精密骰子的原因。他关于物理的说法是对的,但对风险的理解是错的。失去256中的四位意味着你还剩下252位。而Coldcard的漏洞让用户只有40位。
不过,他的建议中仍隐藏着一个更尖锐的论点,那并不是关于制造公差。它其实是关于不信任任何单一来源。Coldcard的失败并不是熵稍有偏向,而是某一个组件悄然停止了贡献,而没有被察觉。
该怎么办
如果你在受影响的Coldcard上生成了种子,但没有掷骰子(真的)或强大的BIP-39助记词,那么该种子就是被攻破的。
更新固件,生成新种子,验证指纹,发送测试交易,然后转移所有资金。Coinkite的建议逐型号进行了详细说明。导出的种子基因缺陷是随其而来的——将坏种子移入不同的钱包应用并不能解决任何问题。
对于其他人来说,主要的教训并不是硬件钱包破损或骰子是陷阱。
而是“随机”是一种声明,而声明需要核实。Coldcard的源代码一直是公开的。意图的硬件RNG就在二进制文件中。当审查者确认它存在时,并没有确认种子生成器实际上调用了它。
八年的审计查看了正确的代码。没有人检查它是否运行。
免责声明:本文章仅代表作者个人观点,不代表本平台的立场和观点。本文章仅供信息分享,不构成对任何人的任何投资建议。用户与作者之间的任何争议,与本平台无关。如网页中刊载的文章或图片涉及侵权,请提供相关的权利证明和身份证明发送邮件到support@aicoin.com,本平台相关工作人员将会进行核查。