Bitcoin Core 合并修复:签名漏洞可在不泄露私钥的情况下转移资金
要点速览
- •Bitcoin Core 于9月25日合并了一项修复,防止在 SIGHASH_SINGLE 输出缺失的边缘情况可能导致收款人被更改后签名仍保持有效的情况下签署 PSBT。
- •该漏洞不会泄露私钥,但对于旧版输入,在匹配的结构条件下,基于固定哈希值的签名可能被重复用于同一密钥控制的其他未花费输出。
- •SegWit v0 签名仍然承诺所花费的具体币及其金额,但目的地输出可能仍未被绑定,给钱包和签名设备带来授权问题。
- •新检查被移入 Bitcoin Core 的共享签名创建逻辑中,将现有的原始交易拒绝机制扩展到 PSBT 路径(包括 walletprocesspsbt 命令),同时允许同一 PSBT 中的有效输入继续处理。
- •截至10月4日,尚无包含该防护措施的正式版本或确认的向后移植,促使钱包提供商和硬件签名集成方审查自身对 SIGHASH_SINGLE 请求的处理方式,而非等待 Bitcoin Core 发布版本。

Bitcoin Core 已新增一项防护措施,防止签署那些可能无法在密码学层面将资金绑定到用户所批准的收款地址的交易。此次更改于9月25日合并至项目的主开发分支,针对部分签名比特币交易(PSBT)中的一个狭窄漏洞——该漏洞可能在未保护预期输出的情况下产生有效签名。Bitcoin Optech 于10月2日重点报道了这一更新。
该问题不会泄露用户的私钥。相反,它带来了另一种风险:在特定条件下,即使交易的收款人已被更改,签名仍可能保持有效。
SIGHASH_SINGLE 漏洞的工作原理
每个比特币签名都带有一个 sighash 标志,用于设定签名所承诺的交易部分。SIGHASH_SINGLE 是这些签名模式之一,旨在将输入承诺到交易中对应位置的输出。当该位置不存在输出时,保护机制会根据所花费比特币的类型以不同方式失效。
对于旧版输入,输出缺失的情况可能产生基于固定哈希值的签名。Bitcoin Core 开发者表示,在相同结构条件存在的情况下,该签名可能随后被重复用于同一密钥控制的其他未花费输出。
SegWit v0 交易保留了更强的保护,因为签名仍然承诺所花费的具体币及其金额。然而,目的地输出可能仍未被绑定。这给钱包和签名设备带来了授权问题:软件可能向用户展示一笔付款,同时产生的签名却无法在密码学上保证已批准的收款人保持不变。
Bitcoin Core 阻止高风险签名请求
Bitcoin Core 此前已通过其原始交易签名接口拒绝了这一边缘情况,但其 PSBT 路径——包括 walletprocesspsbt 命令——仍可能对其进行签名。新代码将该检查移入 Bitcoin Core 的共享签名创建逻辑中,因此同样的拒绝机制现已应用于 Bitcoin Core 的所有签名路径,防止受影响的旧版和 SegWit v0 输入被签名,同时允许同一 PSBT 中的其他有效输入继续处理。
PSBT 通常用于协调软件钱包、硬件设备和离线签名器之间的交易。它们允许交易构建者将信息传递给独立的签名器,而无需让该系统控制私钥。因此,此次修复强化了钱包开发者必须独立于密钥安全来执行的边界:有效的密码学签名必须承诺用户实际授权的交易细节。
定义 PSBT 的比特币改进提案 174 已指示签名者拒绝不可接受的签名模式,并在未指定替代方案时建议使用 SIGHASH_ALL。Bitcoin Core 的此次更改明确防止了这种输出缺失的配置进入签名阶段。
尚无包含此修复的正式版本
用户目前尚无包含该防护措施的已确认正式版本。9月25日的更改已合并至 Bitcoin Core 的开发分支,而截至10月4日,项目发布的版本列表尚未确定修复版本或确认向后移植。向后移植会将同样的防护措施带入已发布的版本;在版本列表中出现之前,该保护仅存在于开发代码库中。
这使得钱包提供商和硬件签名集成方面临一个更紧迫的决定:审查自身对 SIGHASH_SINGLE 请求的处理方式,而不是等待 Bitcoin Core 发布版本来在下游强制执行同样的保护。
原报道发布于 CryptoSlate。