http://www.bitcoin86.com/news/2426.htmlMt自身也有着巨大缺陷,发现提现交易tx hash无效这样的罕见现象应该引起足够的重视,并及时解决。将问题推卸给比特币核心开发组是完全不负责任的。
一、概要
mtgox(以下简称mt)2.10 发出公告,号称用户伪造了交易,导致mt重复给用户提现,造成巨大未知损失。并责怪比特币核心开发组,声称发现比特币重大Bug。后短时间内引发市场巨大恐慌,造成大量抛盘,但价格在短时间内迅速恢复。
二、攻击可以做到的事情:替换原交易的Hash。
三、攻击不可以做到的事情:偷不了任何币,因为修改不了交易的输入、输出。
四、平台防范措施
1. 防“变种”交易:生成提现交易后,不仅记录tx hash,还要记录前向tx hash。当发现该tx hash被拒后(长时间得不到确认),检查前向tx hash是否已经花费掉,如果没有,则再次广播即可。如果已被花费,则更新tx hash,同时发出告警邮件。
2. 构建完善的广播网络,部署多个节点并与网络主要Hub节点打通
3. 完善的监控与告警机制。罕见、特殊现象一旦发生需要立即发出短信、邮件等
4.“熔断”措施,当某条件满足,自动或手动暂停部分功能,可防止扩大化
五、攻击技术分析
这是一个需要较高操作技巧,且依赖平台自身特点才能做出的攻击。对平台的依赖是:交易是否发出仅查找tx id(tx hash),不查找前向交易是否花费。
比特币交易的签名步骤:
1. 构造一个空白交易:输入交易、输出地址+金额、辅助参数
2. 对这个空白交易进行双SHA256(所有内容),得到一个32字节Hash A,用输入交易对应的私钥对该hash A签名,得到signature
3. 将signature填入步骤一的空白交易中,得到最终交易,然后对最终交易进行双SHA256运算得到32字节的Hash B,该Hash B成为最终的Tx Hash,又
称Tx ID
4. 将最终交易广播出去
空白交易任何字段均不可更改,否则导致签名验证失败。但填入的签名(signature),在openssl实现中是可以修改1个字节,并依然能够通过校验,由于这一个字节的修改,导致最终Tx Hash(Hash B)却发生了变化。称之为“变种”交易,与原交易理论上是一样的。
攻击者熟悉mt的比特币节点,并成功连接上去,一旦mt的节点发出交易广播,立即捕获之修改签名的一个字节,使tx hash发生变化,并利用自身网络优势使得“变种”交易抢在原交易前面得到接收。这样原交易就被其他节点拒掉了(因为已经收到“变种”交易,其前向tx已经花费,导致无法验证通过)。
即使输入、输出没有变化,却依然导致了mt丢币,是因为mt发现提现的tx hash不存在(失效了)误以为没有给顾客提现,于是再次发一起一笔提现。导致重复提现。
六、总结
该问题是由于openssl版本的ecdsa实现方式缺陷造成,社区早在2011年就提出并分析,Gavin认为不是太重要的事情,虽然列入了TODO List,但优先级较低。
Mt自身也有着巨大缺陷,发现提现交易tx hash无效这样的罕见现象应该引起足够的重视,并及时解决。将问题推卸给比特币核心开发组是完全不负责任的。
比特币是足够健壮的,但以后类似这样事件依然可能发生,平台需要加强风险控制与完善危机应对策略。
作者:潘志彪kevin ,文章转载自:sina blog