比特币网络延展性攻击的症状与防治
延展性攻击者侦听比特币P2P网络中交易,利用交易签名算法的特征修改原交易中的input 签名, 生成拥有一样input和output的新交易,然后广播到网络中形成双花,这样原来的交易将有一定的概率不能被确认,造成不可预料的后果。
此攻击的原理在于,ECDSA算法生成两个大整数r和s并组合起来作为签名, 可以用来验证交易。而r和BN-s 也同样可以作为签名来验证交易(BN=0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141). 这样,攻击者拿到一个交易,将其中inputSig 的r, s 提取出来, 使用 r, BN-s 生成新的inputSig, 然后组成新的交易,拥有同样的input和output,但是不同的TXID. 攻击者能在不掌握私钥的情况下几乎无成本地成功地生成了合法的交易。写这样的代码及其简单,为了防止有人拿去滥用,就不在这里帖代码和详细信息了。
延展性攻击并不能阻止实际交易的发送,该到的还是会到,但被网络确认的不一定是原来预想的那个TXID, 因此会对比特币网络的活动产生一些影响。例如Alice通过在线钱包给Bob发送了一笔交易,并把TXID发送给Bob说,看我给你发了多少比特币,但是这个交易被延展性攻击并最终也没有确认,Bob通过此TXID却没有发现这比交易,Bob就说,”Alice, 你这个骗子”。
受影响更大的是交易所, 银行之类的离线钱包网站,如果没有好好编程实现,甚至会直接搞乱离线钱包的帐目,引起恶劣的影响。比如通常离线钱包为了方便用户并不等待六个确认才实际充值而是一个确认就实际充值,但是有可能原始交易和攻击的交易都在不同的block中出现在离线钱包的后台钱包中(这些block可能成为orphan但是毕竟曾经出现过),这样就会给某些账户冲币两次或多次, 并给恶意攻击者提现留出时间。应对方法是账户充值需要等待2或者以上的个确认。
充值的后果可以被管理员手动改回,更大的影响发生在提现过程中,提现后的TXID会被记录下来,用来随后查询blockchain 跟踪状态,如果被延展性攻击的交易抢先得到确认, 则提现的TXID一直不能被确认,时间久了会被认为失败,如果策略是失败后重发提现就悲剧了,相信每家交易所银行都有联系客户低声下气索回因失误而发出账款的经历。这种情况下的解决方法是,遇到交易无法确认就停止,报错误并等待手动处理,或者,我们可以自己生成一个延展性交易,然后获取新的TXID, 查找是否发送成功。能生成的TXID数量有多少呢?一共有exp(2, input数量)个,因为每个input都有改签名或者不改两种可能, 通常不是一个大数目。
BIP62 中详细描述了问题, 等待版本升级或许才能真正的解决这个问题。
https://www.evernote.com/l/AN1HD90Ak7ZFAbwhU7cSS1JN99kgKbRZCeI
微信扫描关注公众号,及时掌握新动向
2.本文版权归属原作所有,仅代表作者本人观点,不代表比特范的观点或立场
2.本文版权归属原作所有,仅代表作者本人观点,不代表比特范的观点或立场