酸饼博客
关注区块链技术应用与数字货币

区块链入门100问(18):如何理解比特币的交易延展性(Malleability)攻击?

现实中的实物金属钱币,用锤子砸记下,形状发生了变化,但金属含量没有发生变化,只是外观上跟标准的金属钱币有些不同。这个外观发生了变化的钱币仍然被认可。这个特性被称为“可锻性”。

在比特币系统中,也有一个类似的名词,“Transaction Malleability”。这个词通常翻译为“交易延展性”,也叫做“交易可锻性”,指的是比特币交易在发出之后、确认之前,能够被伪造复制。

我们之前有说过,比特币交易用哈希函数和数字签名来保证交易的安全性,为什么还会被伪造呢?

原因是在交易被签名时,签名并没有包括交易中的所有数据。比如位于 txin 中的 scriptSig,它包含公钥和签名数据,不可能对自身自签名。而交易中所有的数据又会被用来生成交易的哈希值来作为该交易的唯一标示,即是txid。

交易发起人可以通过篡改scriptSig,这样交易的txid就发生了变化。当他用伪造的交易重新广播到比特币网络,那这笔新的交易有可能会在原先的交易之前被比特币挖矿节点采用,加入到比特币账本;而最开始那笔交易,则由于双重支付,被比特币节点验证为不合法交易,从而拒绝。

为什么可以做到篡改了scriptSig仍然通过其他交易的校验呢呢?原因是,比特币交易的签名,用ECDSA算法来实现。对于每一个 ECDSA signature(r,s),这个 signature(r,-s(mod N)) 是相同消息的一个有效签名。多数挖矿程序是用OpenSSL 库校验用户签名,但是 OpenSSL 并没有强制,只要一笔签名没有极度的改变,它就是可接受的。

交易的延展性,如何用来进行攻击呢?

这种攻击一般是在交易所进行提现的时候发起攻击。大致流程是这样:
1. 攻击者在交易所发起提币申请;交易所往攻击者的提现地址转账。
2. 攻击者通过提现交易的txid找到这个交易,复制这笔交易的数据并篡改交易输入的解锁脚本的签名,之后向比特币网络广播这个伪造的交易。
3. 伪造的交易有一定的概率早于交易所的提币交易被区块链接收。这种情况下,交易所发起的那笔交易就一直不能确认,交易所有可能就会认为这笔交易失败,重新发起交易,再次转账给攻击者。这样,一笔钱,攻击者可以提现两次甚至多次。

针对这种攻击,交易所可以通过检查提现地址的收款交易来核查数据,发现是不是受到了延展性攻击。但遗憾的是,早期的一些交易所没有意思到这种攻击方式,造成了很大的损失,甚至倒闭。

比特币开发者也从比特币软件层面,提供了一种新的机制来防范这种攻击,即是隔离见证。我们后面会对隔离见证进行介绍,欢迎关注。

未经允许不得转载:酸饼 » 区块链入门100问(18):如何理解比特币的交易延展性(Malleability)攻击?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

留言联系关于酸饼