
过去几天,一些尽心尽力做好一切准备的人损失了他们的比特币。他们购买了一款信誉良好的硬件签名器,使用该设备离线生成种子,并信任该设备能够完成签名器存在的唯一使命:生成一个无人能猜到的数字。
然而,Coldcard 却未能做到。预处理器保护机制错误地检查了某些内容,悄悄地将种子生成路由到一个弱软件伪随机数生成器(PRNG),即 MicroPython 的 Yasmarang,而不是硬件熵源。
在某些型号上,有效熵骤降至约40位。该漏洞于2021年3月发布,并在公开可读的固件中存在了五年多。攻击者在人们弄清原因之前就已窃取500个地址;几天之内,Galaxy Research 统计到的受影响地址数量达到4585个,损失金额近9000万美元。
Coinkite 的初步假设(在 X 问题上已达成广泛共识)是,有人利用人工智能技术梳理了公开的固件,从而发现了这个漏洞。无论此次攻击者是否真的通过这种方式发现了漏洞,下一个攻击者肯定也会这么做。
虽然在盗窃事件发生前几周就进行了一次人工智能辅助审计,但并未发现任何漏洞(这可能是由于模型的性能限制,也可能是由于搜索方式的特殊性)。自攻击开始以来,研究人员已经展示了多个前沿模型,它们仅需一个提示即可在几分钟内找到相同的缺陷。而这段代码已经公开供人工审查长达五年之久,却无人发现。
Coinkite 将其固件的许可协议从自由软件许可改为源代码公开的MIT 许可(附带 Commons Clause 条款),此前Foundation Devices 在其竞争产品中使用了 Coinkite 的代码。你可以阅读源代码,但不能以此为基础开展业务。但这并没有改变什么。
漏洞存在于机器可以读取的代码中,无论许可协议如何规定;事实上,漏洞正是在重写代码并移除所有 GPL 代码的过程中进入了代码树的。许可协议的变更并没有提高安全性;它仅仅改变了发现漏洞的经济成本。
在人工智能高度发达的时代,所有分布式程序都可读,或者即将可读。剥离二进制文件的符号,用反编译器处理,就会得到伪C 代码,就像打开 Ghidra 程序的人看到的那样:无名变量、扁平化的控制流、函数标签为 FUN_00401a20。对大多数人来说,这些代码难以理解。这种对人类理解的高门槛,正是“闭源”安全性的全部保障所在。
编译后的程序别无选择,只能说出真相。加密的代码无法运行。在执行的那一刻,处理器必须接收到实际的指令,因此无论程序执行什么操作,它都会向机器提供完整而准确的执行方式。所有信息都包含在机器代码中。混淆并不能,也不可能将其移除。
如果觉得机器短期内难以掌握二进制读取,不妨想想机器已经在处理比这难得多的问题了。读取二进制数据本质上是分析:你需要的所有信息都摆在眼前,工作就是提取信息。数学发明则要难得多,因为它需要一个前所未见的对象。
7月20日世界协调时02:19,与 Anthropic 公司的 Claude Fable 5 合作的数学家 Levent Alpöge 发布了一个反例,反驳了 Keller 的雅可比猜想。这个问题自1939年以来一直悬而未决,难度之高甚至被列入了Stephen Smale列出的21世纪挑战清单。
几代人都尝试过解决这个问题。反例只需要三个三元多项式。Lean在几个小时内就验证了它,而且它足够短,任何人只需大约一分钟就能在计算机代数系统中验证。
雅可比矩阵的证明在一个下午就被推翻了,而提问者显然当时正在观看国际足联世界杯的决赛。5月,OpenAI的一个模型推翻了埃尔德什单位距离猜想,这是一个自1946年以来悬而未决的问题。
7月下旬,一个存在了30年的图论猜想在四个提示后就被推翻了;在这期间,雅可比矩阵的反证以及一系列其他维持了几十年的成果也被推翻了。
把这种速度与阅读互联网上已有的机器代码这一相对简单的任务进行比较。如今的模型处理源代码和反编译器输出比处理原始字节要好得多,因此完全封闭的二进制文件仅能保持微弱的安全裕度。
这微弱的裕度就像一个成本障碍,而且它正以你在其他方面所看到的速度被蚕食殆尽。把安全性押注于它能持续多久,就等于是在与一个只会加速运转的时钟较劲。
能够发现你熵漏洞的同一技术也能读取你的专有方法。这是悄无声息的受害者,它影响着那些从未想过自己会接触到任何开源软件的公司。在已发布的软件中,商业秘密从来都只是诉讼中的隐晦之谈。
自商业秘密法诞生以来,法律就一直如此规定:对你合法拥有的产品进行逆向工程是公平的,因此,秘密只有在逆向工程成本高昂时才能得以保存。当提取成本降至订阅费和提示费时,你交付给客户的代码中所蕴含的秘密就不再是秘密了。你巧妙的算法、你未公开的格式、你在二进制代码中的优势:对任何愿意查看的人来说都清晰可见,而时间线正以分钟计算。
这一切并不一定意味着开源就安全。Heartbleed漏洞在世界上部署最广泛的TLS库中隐藏了两年之久,因为缺乏资金支持的关注,漏洞根本无法被发现。
xz后门则表明,开放贡献模式本身就是一个攻击面,一个耐心的攻击者可以凭借友好的面孔和两年来的良好代码提交轻松突破。开放性曾经是一道屏障,但如今已不再如此。它所能提供的,是允许审查人员进行审查、可以独立复现和验证的构建版本、在供应商倒闭或倒闭时可以退出,以及承认无论你是否喜欢,这一切都将发生。
现在我们必须假设发布的每一行代码都会被心怀不轨的人读取,因为这种情况必然会发生。防御者拥有攻击者永远无法企及的一项结构性优势:时间。
你可以在发布前,也就是提交代码到发布之间的这段时间里,对自己的代码应用同样的“前沿模型”,而攻击者却只能等待一个尚未存在的二进制文件。确保你的构建过程可复现,这样就能追溯到源代码,并且源代码可以被检查。
设计时要考虑故障的封闭性,并保持可信核心足够小,避免一个漏洞导致所有问题。就持有比特币这一特定业务而言,要吸取 Coldcard 正在实时传授的教训:掌控你无法承受被猜测的风险熵,保持安全元件的最小化并将其置于公开接口之后,并将你的密钥分散到不同的实现中,这样就不会因为任何单一设备或任何单一供应商的错误而导致你面临全部风险。
对于比特币而言,风险远超其他加密货币,因为只要掌握了私钥,就等于拥有了所有权。熵漏洞已经造成了永久性的伤害。即使修补了密钥生成器,也无法挽救已经生成的种子;一个弱密钥空间将永远处于可攻击状态,而泄露信息则等于将密钥拱手让给了攻击者。
我们之前就目睹过这种情况。libbitcoin浏览器工具 bx 中的Milk Sad 漏洞,利用一个32 位值生成私钥,攻击者在漏洞公开之前就已经开始盗取由此生成的钱包中的资金。攻击者会按照自己的节奏行事,无论是否受到邀请。对于无法追回的资金而言,“最终可找到”就等同于“最终消失”。
比特币从未信任过隐秘。它的协议是开放的,任何人都可以查阅其规则,它的安全性并非建立在秘密之上,而是建立在完全公开的数学和激励机制之上。我们围绕它构建的硬件和软件也理应遵循同样的标准,因为别无选择。选择从来都不是开放或封闭的,而是纪律严明或公开透明。
Coldcard事件给我们带来的更广泛的教训是,闭源软件就像一颗由损坏的Coldcard芯片生成的种子;它看起来不错,但本质上却是建立在沙子上的。任何人都可以阅读代码——唯一的问题是,你是否承认这一事实,还是你和你的用户会像Coldcard的用户那样,一个个被耗尽的地址慢慢地发现真相。