Chiphell - 分享与交流用户体验

 找回密码
 加入我们
搜索
      
查看: 3808|回复: 20

[其他] 最近的Mt.Gox停止比特币提现是怎么回事?BTC安全性究竟怎样

[复制链接]
发表于 2014-2-21 12:19 | 显示全部楼层 |阅读模式
本帖最后由 无名旅人 于 2014-2-21 12:24 编辑

转自知乎 http://www.zhihu.com/question/22787360

    前几天CB上又发了一个新闻《比特币漏洞修复时间推迟 凸显虚拟货币缺陷》,再综合前段时间Mt.Gox停止提现,谁能解释一下内在的技术细节么? 最好能有一段简单的话说一下比特币的原理,网上那些文字实在看不下去吖。
Pnigos互联网安全,知道创宇&FreeBuf黑客与极客 的回答
    先来回顾下这次事件的背景:
MtGox在2月7号发出公告,声称发现大量无效提现请求,需要分析原因,并暂停了一切提现操作。随后bitstamp等多个知名比特币交易网站均宣布暂停提现,从而引发了炒币者的恐慌,导致比特币价格一度腰斩。2月10号,MtGox再次发出公告称已查明原因,提现交易受到了“伪造交易ID攻击”,并说明将尽快恢复提现。这次事件的罪魁祸首是由于“比特币交易的可锻性(transaction malleability)”引起的,可锻性体现在“交易ID可被伪造”,而“交易ID可被伪造”的原因是签名算法不够健壮。

上面那段话如果有的朋友看着费劲的话,我来详细解释下,“可锻性”,“交易可锻性”及“交易ID伪造”究竟是怎么回事,为什么能够造成如此巨大的影响:

1,关于“交易的可锻性(transaction malleability)”:
首先我们知道金银铜铁等金属是可以进行锻造的,《龙门镖局》中的白敬祺为了藏私房钱,将银锭打成了银夜壶,而银夜壶和银锭的价值是相当的,这就是金属“可锻性”的物理表现。
在比特币的交易中,第三方交易系统会将交易发送方,接受方,交易金额,比特币钱包私钥等数据作为一个交易发送到比特币网络中,发送之前会对这条交易信息进行加密和签名,接着根据生成的签名最终获得一个哈希值,这个哈希值作为交易ID(类似我们平时网络购物的订单号)返回给提现的用户。 01.jpg

上图是一次交易请求(如提现)后,交易系统对当前交易所做的工作,有省略部分细节,但体现了整个流程。用户接收到的仅有一个交易ID,根据这个交易ID可以查看交易是否成功。
02.jpg

上图是知名的在线比特币钱包blockchain的其中一次交易请求。绿色箭头双方是比特币钱包地址,上方的哈希值就是交易ID(TxID)。

当交易发送到比特币网络中后,网络中的各个结点会根据之前生成的签名来验证交易的真实性,这些做法都是很正确很理所当然的。而问题就出现在签名算法中,由于现在大部分使用的签名算法都是基于OpenSSL的ECDSA(椭圆曲线数字签名),这个签名算法的一个问题就是,修改签名的某个字节能够使得签名依然校验成功,这样伪造签名之后交易依然能成功进行。如果单在比特币网络中这似乎没什么大不了的,顶多可以捣捣乱,但是对于第三方交易系统就不同了,由于交易ID是根据签名生成的,而伪造之后的签名会生成一个完全不同的交易ID,第三方交易系统判断到两个ID不同便会确定当前交易失败,而事实上交易已经成功了。这时如果用户发现提款交易提示失败,可以再次发起提现交易,第三方交易系统一看之前确实失败了,那就会再进行一次提款,这时用户的比特币钱包里就会多收到一份比特币,也就造成了第三方交易平台资金损失。交易的可锻性体现在虽然签名被“锻造过”(修改伪造),但最终的交易依然有效。

2,为什么这样的攻击可以奏效:
原理在上一部分已经说清楚了,可是会有一个疑问,我们伪造的交易请求是在正常交易请求之后发出的,如果正常交易被采纳了,那我们伪造的交易如何能够奏效呢?这里就要说到比特币网络的一个特性,发出一个比特币交易请求后不会立刻返回交易成功与否,在比特币网络中会有一个处理延时,而比特币网络由于自身的特性,所有交易请求是以网状形式随机处理的,两次交易请求并不会以队列形式依次处理。这就给攻击者提供了可乘之机,专业的讲叫做时间条件竞争,通俗的讲就是拼人品。我们伪造的交易和正常的交易都在比特币网络中,如果伪造的交易先被处理,那么攻击成功。

3,如何发起攻击:
  • 首先需要有足够多的比特币矿机接入网络,以增加伪造的请求被优先处理的可能性。
  • 攻击者在第三方交易平台提交一个提款请求并获得一个交易ID。
  • 根据交易信息伪造一个签名同时生成一个完全不同的交易ID,并将伪造的请求发出。
  • 若伪造的交易被优先处理,则原始交易失败。
  • 我们可再次提交提现请求,第三方交易平台确认之前的交易失败后会再次发送提现交易,至此攻击成功。
攻击流程图如下:
03.jpg

4,如何防范:
不要too young too simple的仅根据一个哈希值来判断交易的状态,使用双因素,或者多因素验证。比如可以根据用户比特币钱包的余额来判断用户能否有足够的余额进行交易。或者追踪每笔交易的信息来判断是否真正交易成功。

5,其他:
Mt.Gox这次暂停提现也是要对之前所有异常的交易请求进行溯源,看到底哪些是由于伪造交易ID攻击造成的。由于数据量巨大,因此需要耗费不少时间来调查。
其实这个问题像51%矿池攻击一样很早就已经被提出了,也有对应的防范措施,只是Mt.Gox等一些第三方平台没有重视。
货币的安全大致分为两类:
  • 货币安全。
  • 货币交易安全。
这次MtGox出现的问题基本上算货币交易安全,虽然签名算法不够健壮,但并不影响整个比特币网络的安全,所以不能由此就臆断比特币脆弱,更大可不必看衰比特币。就像国内第三方支付平台如果出现漏洞,我们不能因此就看衰人民币一样。

6,End Of End:
对比特币感兴趣想快速了解的同学可以观看FreeBuf视频组翻译的视频《比特币的运行机制和原理》,比看各种资料来的方便,最后希望我的回答对你有帮助:)
http://v.youku.com/v_show/id_XNjc0MzI4OTY0.html



Wu Hao程序员的跟帖

比特币的一个“交易”是一段指令,这段指令告诉整个网络:我作为一些比特币的拥有者,要把他们的所有权转移到目标地址。这样,谁拥有目标地址,我就把钱打给谁了。

这段指令本质上是一个字符串,就像这样:
01000000017a06ea98cd40ba2e3288262b28638cec5337c1456aaf5eedc8e9e5a20f062bdf000000008b48304502202ef6483a2509394551eadf333afe2a749dbe77729a7b729ad79bf2f2246483b0022100ce8a3f1801e32e95aeceac4ab400713b783120930f436774d27ca85c27428bfa014104e0ba531dc5d2ad13e2178196ade1a23989088cfbeddc7886528412087f4bff2ebc19ce739f25a63056b6026a269987fcf5383131440501b583bab70a7254b09effffffff01f0ca052a010000001976a9142dbde30815faee5bf221d6688ebad7e12f7b2b1a88ac00000000
然后,你对这个字符串提取一个所谓的哈希,可以理解为用摘要的方式获得一个比较短的字符串,像这样的:0735353e82b8496eb87fc910d8cf814384028d0a853926c6acfd7b01190ea0b4

这个比较短的字符串可以作为一个ID,用于跟踪这个交易。

MTGox就是这么做的,当你提现的时候,它就发出一个交易,然后记录下这个ID。当有人提现出问题要求重发时,他们就用这个ID去比特币网络检查这个ID有没有被确认,如果没有的话就重发。


----------------------------

问题来了,这个指令虽然不能被伪造,也就是说你不能改变目标地址和数额等信息,但是在不破坏其合法性的前提下,你可以添加一些无用的数据进去,这就是所谓的“Transaction Malleability”。为什么会出问题呢?是因为这样被篡改后,生成的摘要,也就是被MTGox使用的ID,就被改掉了。

然后MTGox就这样被黑了:
1.Gox发了一个转出比特币交易并记录其ID为 “id12345”。
2.小偷的人在这个交易确认之前把它在不破坏合法性的前提下篡改掉,ID成了 “id67890”。
3.改之前和之后的交易除了ID不同以外没有任何区别,小偷顺利拿到币。
4.小偷在拿到币的情况下跑到Gox那说,他提币出现了问题,要求重提。
5.Gox一看,"id12345"对应的交易果然没有被确认,所以就重新给他发币。

----------------------------

这是比特币协议的一个“负面特性”,说白了就是“交易ID不确定导致用ID跟踪交易不可靠”。
但是Gox丢币就只能怪自己SB了,因为在上面第5步的时候,它就不知道去看下自己的余额有没有减少啊?糊里糊涂就把钱被人骗走了。

所以有人说形象的说,有人拿了个PS了的发票跑到Gox退钱,他们居然就给退了。顺便说下,其他的网站被DoS攻击其实就是因为有N多人看到别人在Gox骗到钱,纷纷跑到各大平台拿PS了的发票骗钱导致他们服务器不堪重负。

----------------------------

后来Gox就说,比特币协议有bug,我们要重新写代码,所有提现暂停。目前大家也都不知道是他们SB币都丢光了,现在拖延时间还是怎么的,那里面的价格已经完全没有意义了。

----------------------------

如果你觉得太长没看的话,记住门头沟SB就好了。  











发表于 2014-2-21 12:27 | 显示全部楼层
门头沟SB 什么意思啊
 楼主| 发表于 2014-2-21 12:29 | 显示全部楼层
MTGox 就是MTG门头沟
发表于 2014-2-21 12:29 | 显示全部楼层
意思就是最可靠的货币也不可靠了?
 楼主| 发表于 2014-2-21 12:30 | 显示全部楼层
albaphika 发表于 2014-2-21 12:29
意思就是最可靠的货币也不可靠了?

意思是MT.Gox做了一件傻事,可以慢慢看一下文章
发表于 2014-2-21 12:33 | 显示全部楼层
MTG  S B?
发表于 2014-2-21 12:34 | 显示全部楼层
门头沟怎么看都是在血洗用户财产
发表于 2014-2-21 12:37 | 显示全部楼层
希望楼下的喷子在开嘴之前先仔细读一下文章。
发表于 2014-2-21 12:47 | 显示全部楼层
这些虚拟币除了卖钱,你会用?所以,让他们折腾吧,我是矿工我怕谁
发表于 2014-2-21 13:02 | 显示全部楼层
tuo2013 发表于 2014-2-21 12:47
这些虚拟币除了卖钱,你会用?所以,让他们折腾吧,我是矿工我怕谁

我也是矿工。握爪!
发表于 2014-2-21 13:04 | 显示全部楼层
本帖最后由 wyiky 于 2014-2-21 14:04 编辑
无名旅人 发表于 2014-2-21 12:30
意思是MT.Gox做了一件傻事,可以慢慢看一下文章

其实我想知道对应的防范措施是啥!换签名方式?
 楼主| 发表于 2014-2-21 13:13 | 显示全部楼层
wyiky 发表于 2014-2-21 13:04
其实我想知道对应的饭饭措施是啥!换签名方式?

MTGox修改现有验证交易的方式,不单单靠验证交易序号就认为交易失败,还要检查余额
发表于 2014-2-21 14:08 | 显示全部楼层
无名旅人 发表于 2014-2-21 13:13
MTGox修改现有验证交易的方式,不单单靠验证交易序号就认为交易失败,还要检查余额 ...

那他们的效率不就相当低下了嘛?再说已经产生的损失如何?哎2B事件啊!!!
发表于 2014-2-21 14:19 | 显示全部楼层
断章取义的标题,这和比特币安全性毫无关联,只是网站的提现验证有漏洞而已...
发表于 2014-2-21 14:27 | 显示全部楼层
是门头沟自己2B,或许是想借口2B,卷钱?
搞不好被卷走不少钱,导致现在各种币低迷
发表于 2014-2-21 15:23 | 显示全部楼层
玩不起比特币 纯粹挖山寨币 早就已经回本了 无所谓涨跌 涨最好 跌也无所谓 反正免费电 能挖则挖 不能挖就卖卡
发表于 2014-2-21 15:36 | 显示全部楼层
case92 发表于 2014-2-21 15:23
玩不起比特币 纯粹挖山寨币 早就已经回本了 无所谓涨跌 涨最好 跌也无所谓 反正免费电 能挖则挖 不能挖就卖 ...

也是3个月回本吗?
发表于 2014-2-21 15:38 | 显示全部楼层
mkoyo 发表于 2014-2-21 15:36
也是3个月回本吗?

我是去年9月底开挖的 现在3个月回本难了吧
发表于 2014-2-21 16:13 | 显示全部楼层
市场需要折腾的借口。
发表于 2014-2-21 18:27 | 显示全部楼层
NND,最近被门头沟害惨了

亏了大几万软妹币
发表于 2014-2-21 18:48 | 显示全部楼层
case92 发表于 2014-2-21 15:38
我是去年9月底开挖的 现在3个月回本难了吧

免费电,单算显卡成本,有40天能回的
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

小黑屋|手机版|Archiver|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2021-12-5 10:55 , Processed in 0.017469 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2007-2021 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表