交易延展性(Malleability)攻击

区块链 比特币

2014年2月25日,日本时间上午11点,MT.GOX交易所(俗语门头沟)停盘。众所周知,MT.GOX曾经是比特币最大的交易所,一度交易量达到所有比特币交易的80%,也是目前运营时间最长的交易所。

门头沟的倒闭,源于黑客的攻击。整个丢失了85万数量的比特币,按当时的币价计算,这些损失的币价值近4.54亿美元。

而这就是我们今天要讲的,大名鼎鼎的“交易延展性攻击”。

Transaction Malleability,翻译成“交易延展性”,也有人称为“交易可锻性”,这其实是个比喻。在现实生活中,一个金币在使用中,被人用锤子砸了几下,凹了几处,变得不是很圆。这个金币的本质含金量没变,只是外观看上去与标准的金币有些不同,这个金币依旧是一个被认可的金币。这就是“金币的可锻性”。

交易延展性,或者叫做“交易可锻性”,指的是,比特币支付交易发出后、确认前可被修改(准确说是被伪造复制)。

为什么交易发出后,可能被篡改呢,不是有签名吗? 其中1个原因就是多数挖矿程序是用openssl 库校验用户签名,而openssl兼容多种编码格式,还有,就是椭圆曲线数字签名算法(ECDSA)本身,签名(r,s) 和 签名(r,-s(mod n))都是有效的。所以,对签名字符串本身的表现方式做些调整,依旧是有效签名。

我们知道,每个Transaction有个Transaction ID,这个Transaction ID也就是对整个交易做的一个Hash,也是该Transaction的唯一标识。现在你对签名做了微调,签名还是有效签名,但是Transaction ID却因此改变了!!!

而黑客就是利用了这个特性,对交易所实施了攻击,下面就来看一下这个攻击过程是怎样的:

Step1: 黑客自己有1个账号,再交易所开了1个账号,把自己的bitcoin转进去。

Step2: 申请提现(withdraw),交易所发起1笔Transaction。

Step3: 这笔交易被广播到网络上,还未打包进区块链之前。黑客收到这笔Transaction,稍微更改了scriptSig的格式,生成1笔新的交易广播出去,此时Transaction id已经变了。

Step4: 黑客的这笔新交易被区块链接收了。然后向交易所投诉,说它没收到钱。交易所根据自己生成的Transaction Id查询该笔交易,发现在网络上查询不到, 会再次转账给黑客,也就是double withdraw! 同1笔钱,被黑客提现了2次,甚至多次! 导致交易所蒙受巨大损失。

总结: 
交易延展性攻击之所以会发生,是因为Transaction ID会变(而这是1个Transaction的唯一标识),而Transaction ID会变,是因为里面的scriptSig可以被调整。

如果有办法保证Transaction ID在整个交易过程中,都不可能被改变,那也就解决了这个问题,而这就是后续要讲的”隔离见证“。

发表评论