一个藏在“检查顺序”里的漏洞
2018 年 9 月 18 日,比特币核心发布 0.16.3 与 0.17.0 候选版,修复一个编号 CVE-2018-17144 的问题;9 月 20 日官方发布完整披露。漏洞本身的触发条件一句话能说清:一个区块里包含这样一笔交易——它的两个输入指向同一个前次输出。这种交易显然违反“一个输出只能花一次”的常识,但问题在于,当年负责拦截它的检查恰好不在了。追溯代码史,这个重复输入检查早在 2012 年就以 PR 443 加进过代码库;2017 年的 0.14 版本里,一次以加速为名的优化(PR 9049)在区块预广播校验阶段把这项检查移除,理由是后续的 UTXO 记账环节会兜底。麻烦就出在“兜底”并不完整:记账环节只做断言级自检而不是带错误处理的正式校验。
两种版本区间,两种结局
官方披露把受影响版本分成两种行为。0.14 系列里,同一笔交易内标记同一个输出两次支出会命中“该输出此前必须未花费”的断言,节点当场断言失败崩溃——这是一个仅凭收到一个恶意区块就能触发的拒绝服务。0.15.0 到 0.16.2 里断言被改弱成“该输出存在即可”,于是多了一个更危险的分支:如果被重复花的输出是更早区块里创建的,检查会安静通过,区块被接受,而它的价值被记账两次——对一个愿意自掏腰包造这种块的矿工来说,这意味着可以凭空把流通量吹大一截。触发它并不需要骇入谁:造块本身就要求放弃这个区块至少 12.5 枚比特币的正常收入,官方公告据此把攻击者画像明确为“愿意烧钱造非法块的矿工”。普通用户无需为这个漏洞做任何链上操作,风险全部集中在跑旧版本的节点和矿工身上。
官方时间线与处置节奏
按 bitcoincore.org 的公告还原:9 月 17 日,开发者以“仅拒绝服务漏洞”的名义收到匿名报告并同步给相关币种项目;同日即确认还存在通胀面。9 月 18 日凌晨打 0.16.3 标签,当晚二进制与公告齐备,公开论坛挂出升级横幅;9 月 20 日发布包含完整影响分析的公告。整个链条从收到报告到修复包上线约一天,从报告到全面披露不到三天。修复本身极小:把重复输入检查以正确的错误处理方式放回区块校验路径,让打补丁的节点用 bad-txns-inputs-duplicate 之类的正式校验错误安静拒收恶意块,而不是断言崩溃或误记账。主链历史数据没有证据显示该漏洞在被利用过,这一点官方公告有明确记载;公开讨论区里倒是有测试网有人用类似手法造出过问题币的记录,属于测试网实验,不影响主网账本。
对今天运行节点的三条教训
第一,软件版本就是安全边界。这个漏洞横跨 0.14.0 到 0.16.2 共九个发布版,说明“能用、没报错”不等于“没中招”——漏洞可以安静地活在默认路径里,只有官方版本说明才说得清。今天的每一版 Core 也都带着同类历史补丁,停在旧版本等于同时停在旧漏洞集合上。第二,恐慌节奏要以官方公告为准。漏洞公开当天,部分媒体把它写成“比特币可以被无限增发”,而官方口径是:需要矿工烧掉整块收入才能触发,且无现实利用证据。核对原始公告、发行说明和 CVE 记录,永远比转述更可靠。第三,恶意区块攻击防不住防火墙。它的载体是一个结构合法的 P2P 区块消息,任何连接对等体都可能送过来,限流量、换端口、藏 IP 都不能替代打补丁;节点唯一的防御就是运行包含修复的现代版本。对普通持币者,这件事的启示更简单:你的钱包或节点软件更新日志里那些看不懂的英文条目,正是这类历史事件的最新章。
风险提示:本文为历史安全事件复盘,不构成投资建议;涉及版本与时间均以比特币核心官方公告为准,运行节点请始终保持受支持的更新版本。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。