0x00 概述

现在市面上出现的假充值的漏洞很多,比如前段时间出现的USDT的假充值问题,或者之前hackerone上曝光的coinbase中以太坊充值的问题。本报告主要探讨Qtum的问题。

0x01 假充值攻击过程

这些假充值漏洞一般是由于接受虚拟货币支付的商家(如电商平台、交易所等)为了良好的支付体验,支持未确认交易充值的原因。出现漏洞的场景如下:

  • 用户构造一个恶意交易,比如支付0.1个虚拟币,这个交易的交易费设置的很低

  • 商家看到了该交易,但是此时该交易未被确认(矿工因为fee低没有打包该交易)

  • 商家接受这个未被确认的交易,并支付实物

  • 用户利用RBF技术将UTXO转回给自己

这里可以看到,一般出现这种情况都是因为商家接受了未确认交易造成的。

这种攻击核心的问题是:作为攻击者,如何去发起一个异常的交易呢?

在bitcoin中,客户端和矿工会对交易的每个字段进行校验,如果伪造utxo或者交易费设置的非常低,会直接被P2P网络拒绝,因此也就进入不到mempool里被矿工选中。在bitcoin/qtum案例中,可以使用RFB来构造这种交易。

0x02 RBF技术

RFB即Replace-By-Fee,就是用一个较高的交易费替换一个已经存在的交易。替换的意思是新的交易会使用旧交易的input部分,但是这种情况并不是双花的问题,因为未被确认过的老交易其实是被替换掉了。因此这两个交易只会有一个交易被确认,并添加到区块链上。一般都是交易费给的高的那个交易。

这里其实会有个双花的问题,场景是攻击者向商家支付0.1 BTC,并且商家支持未确认交易付款:

  • 攻击者首先构造一个RBF交易tx1,转给商家0.1 BTC,这个交易的fee被设置的很低

  • tx1在mempool中,由于fee过低,所以迟迟不会被矿工选中打包

  • 商家看到了这个交易,虽然该交易的状态是unconfirmed,但是认为该交易是有效的

  • 商家把0.1 BTC对应的实物交割给攻击者

  • 攻击者拿到实物之后,构造交易tx2,该交易的input使用tx1的,将tx1的0.1BTC的utxo再转给自己,然后设置一个高的fee,把这个交易广播出去

  • tx1被tx2替换,tx2被矿工确认了

  • 攻击者仅仅付了一些交易费就获取到了实物,商家损失0.1 BTC

关于RFB,技术细节在这里,该改进协议在Bitcoin Core 0.12.0 被实现。

这里简单说下,一个交易如果任意一个input的nSequence字段设置为比(0xffffffff - 1 )小的数值,这个交易就是可以替换的交易,举个例子:

....
"vin": [{"txid": "0d158a5ec4dad1c6abda3eb24c13ee872a2468b2234e2b035f5f4a61cc908701","vout": 1,"scriptSig": {"asm": "304402201207cba81c284dfe30d87ded1bcdba267be1aa8753d0abecb7d18746ba6164d2022060566d9d19062bcb54a1f7dbf93711cf3ee14ea9d833ec78fba0f25ce313a2c9[ALL] 037f901bc1ca9601fdbdd464b55877134a859267e0e8863f089dde5a7a6acd2ab8","hex": "47304402201207cba81c284dfe30d87ded1bcdba267be1aa8753d0abecb7d18746ba6164d2022060566d9d19062bcb54a1f7dbf93711cf3ee14ea9d833ec78fba0f25ce313a2c90121037f901bc1ca9601fdbdd464b55877134a859267e0e8863f089dde5a7a6acd2ab8"},"sequence": 4294967293  // 这里是RBF交易的标识}],
....

当这个交易未被确认时,那么就可以发起另一个交易使用该交易的input来进行替换。

0x03 构造交易

Qtum的代码基本和比特币的一致,所以用qtum来复现试试。

钱包使用qtum-electrum,在设置页面有一个选项可以打开RFB属性:

这里Propose Replace-By-Fee设置为Always

然后先构造一个交易,比如这里的商家为:QN5j2oa9cywEBaTB3DUNXcjCGuiPttGJTWt,自己的地址为QceiK7qDgnxruJ8HFTRiUDmfLybtsVZNAw. 往商家的地址转0.002个qtum:

这里把fee设置的很低,设置为0.001。

交易大致如下:

看Outputs部分就知道这个交易就是往商户转账0.002数值的qtum,然后第二个输出是找零。

我们记录下这里input使用的UTXO,是f1671e8657b801e890bc69ea34e04a6d408f786524a72127f617aa018a5e51f0, 索引是1,这里的余额是0.772763 Qtum:

我们来先构造第二个交易,使用qtum-cli:

# 创建原始交易
./qtum-cli createrawtransaction '[{"txid":"f1671e8657b801e890bc69ea34e04a6d408f786524a72127f617aa018a5e51f0","vout":1}]' '{"QceiK7qDgnxruJ8HFTRiUDmfLybtsVZNAw":0.770763}'

这个命令的含义是使用f1671e8657b801e890bc69ea34e04a6d408f786524a72127f617aa018a5e51f0:1这个utxo作为输入,然后把这个utxo再转给自己,当然这里要自己去算一下手续费。

第一个交易中,我们设置的交易费是0.001,这里第二个交易我们设置为0.002就行了,计算交易2的输出的方法如下:

Output_in_tx_2 = 0.772763 - 0.002 = 0.770763

因此就得出了createrawtransaction命令中的数值。

然后再对这个交易进行签名:

# 签名交易
./qtum-cli signrawtransaction "0200000001f0515e8a01aa17f62721a72465788f406d4ae034ea69bc90e801b857861e67f10100000000ffffffff014c179804000000001976a914b006130cad3681eaf4182689e535c94399068cc288ac00000000"

输出如下:

{"hex": "0200000001f0515e8a01aa17f62721a72465788f406d4ae034ea69bc90e801b857861e67f1010000006a47304402204c9c15714e33fd525025b435302bfa34fd604a3ff5836c699f1679b1c74db90a022041c13a858ed5215bfe1e6617c523f90c886749030f7ba39e6a4f3a45d2918dfe0121037f901bc1ca9601fdbdd464b55877134a859267e0e8863f089dde5a7a6acd2ab8ffffffff014c179804000000001976a914b006130cad3681eaf4182689e535c94399068cc288ac00000000","complete": true
}

0x03 广播交易复现

首先我们把第一个交易广播出去,调用以下命令即可:

./qtum-cli sendrawtransaction "hexstring"

或者在钱包端直接去广播也行。

在钱包的交易池里可以看到这个交易没有被确认,标记为了Replaceable,表明这个交易可以被RFB。

然后发现这个交易已经在qtum浏览器中可以看到了:

由于fee设置的很低,通常如果不进行RFB操作的话,这个交易被确认要等5-6 mins(网络越拥堵越好),这时如果商家支持未确认交易支付的话就可以付款成功了。

然后我们把第二个交易发送出去:

就可以在钱包交易池中看到,第一个交易被第二个交易替换了,而第二个交易详情如下:

这里就是把第一个交易里输入的的utxo再转给自己,只不过手续费为0.002 Qtum,是第一个交易的两倍。这时候我们就只剩一个交易了,即第二个交易替换了第一个交易:

在Qtum浏览器上看是这样的,这时候再刷新第一个交易的页面,发现该交易已经没有了,但是我们的目的达到了,即在商家端是支付成功了,交割实物走人。整个过程我们只耗费了0.002个qtum的手续费。

0x04 总结

总结下,Qtum假充值的整个过程如下:

  • 发起交易1,支付0.02 qtum支付给 商家,手续费为0.001

  • 商家看到了交易,虽然没有被确认,但是也看作是支付成功

  • 然后在交易1没有被确认的间隙下,立刻发起交易2,将交易1中输入部分的utxo 支付给自己,手续费为0.002

  • 交易1不复存在,交易2被确认写入链上,完成攻击

总的来说,这种假充值的漏洞,一般公链是不会背锅的,区块链的共识使得交易无法原子操作。只能依赖DApp端来对交易进行确认,不过随着后续公链出块时间越来越快,这种攻击可能就难以发起了。

Reference

(1) https://explorer.qtum.org/

(2) https://qtumwallet.org/

(3) https://github.com/petertodd/replace-by-fee-tools

(4) https://medium.com/@overtorment/bitcoin-replace-by-fee-guide-e10032f9a93f

RBF技术实现“双花漏洞”研究相关推荐

  1. SGX技术的分析与研究 学习笔记

    SGX技术的分析与研究 学习笔记 SGX技术的分析与研究 学习笔记 1 SGX架构概述 2 SGX关键技术 2.1 Enclave安全容器 2.2 Enclave保护机制 2.2.1 内存访问语义 2 ...

  2. M1卡破解(智能卡攻防技术分层、分级研究探讨)

    本来是当任务来完成的一篇论文,原计划有些宏伟,迫于时间太紧根本无法完成它,就草草成了现在这个样子交差了.交出去如石沉大海,了无消息.干脆发到这里也不辜负我加班写作的辛苦了. 许多材料来不及验证,可能有 ...

  3. 袁哥写的漏洞研究方法总结

    一.前期准备,建立安全模型: 1.熟悉软件功能.功能实现,配置等: 如:IIS的虚拟目录.脚本映射: 2.根据功能,分析安全需求,建立安全模型: IIS外挂,文件类型识别,目录正确识别:目录限制: 外 ...

  4. 342.基于高通量技术的微生物组研究实验设计

    基于高通量技术的微生物组研究实验设计 --微生物组研究,从方案设计到写作套路(二) 作者:王晓雯 凌波微课 版本1.0.2,更新日期:2020年9月22日 好文章离不开好设计 研究第一步就是要结合自己 ...

  5. SMRT测序技术及其在微生物研究中的应用

    SMRT测序技术及其在微生物研究中的应用 唐勇1,2, 刘旭3 摘要:高通量测序技术的发展为研究者深入探索微生物世界提供可能.随着以Pacific BioSciences(PacBio)公司的单分子实 ...

  6. 计算机技术应用及信息管理,计算机应用技术与信息管理整合研究(共2808字).doc...

    计算机应用技术与信息管理整合研究(共2808字) 计算机应用技术与信息管理整合研究(共2808字) 摘要:随着现代信息技术的不断发展,计算机技术已广泛应用于各行各业的管理和运行中,且呈现迅猛的发展趋势 ...

  7. Java反序列化漏洞研究

    Java反序列化漏洞研究 漏洞原理 java序列化就是把对象转换成字节流,便于保存在内存.文件.数据库中:反序列化即逆过程,由字节流还原成对象.当反序列化的输入来源于程序外部,可以被用户控制,恶意用户 ...

  8. 亲历漏洞研究最让人难受的地方:看到打补丁版本,才知漏洞一直近在眼前(详述)...

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 本文叙述的是作者还在谷歌 Project Zero (GPZ) 团队工作时发生的事情.说明了做漏洞研究更令人沮丧的一面:当你看到打补丁 ...

  9. 百姓基因:新一代基因测序技术及其在肿瘤研究中的应用

    基因测序技术的进步, 为分子生物学的发展, 起到了巨大的推动作用.传统的基因测序技术的重要代表, 是所谓的Sanger测序法, 这是一种以末端终止法为原理建立起来的技术.20世纪90年代开始启动的人类 ...

最新文章

  1. git与github区别与简介
  2. CVE-2016-1779技术分析及其背后的故事
  3. 系统间通信1:阻塞与非阻塞式通信A
  4. 计算机简单游戏有什么用,简单又好玩的互动游戏 简单又好玩的互动游戏有哪些...
  5. php数据库根据相似度排序,php数组字段相似度排序
  6. php 卡号算法,PHP实现通过Luhn算法校验信用卡卡号是否有效_PHP
  7. MapReduce 论文翻译
  8. Nginx----OpenResty
  9. 1.2什么是神经网络
  10. Lync Server 2013 安装体验(二)
  11. snownlp 原理_使用snownlp进行情感分析
  12. C语言电码,翻译莫尔斯电码
  13. 中医药大学计算机考试题,浙江中医药大学2013年级研究生《计算机应用》期末考试复习题...
  14. 设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例
  15. 如何将Asp.net 2.0网站部署到服务器
  16. Spark 调优技巧总结
  17. [Swift通天遁地]七、数据与安全-(6)管理文件夹和创建并操作文件
  18. 蓝色简约大气公司简介企业介绍产品宣传ppt模板
  19. ENVI Classic:如何对影像文件的头文件进行编辑?
  20. python中华氏度与摄氏度的转化_【Python】摄氏度与华氏度互相转化

热门文章

  1. 服务器虚拟机双活,VMware双活数据心解决方案详解.pptx
  2. 体系结构 记分牌实例
  3. Vue学习笔记04(关键字搜索)
  4. Python画玫瑰花,七夕礼物。
  5. 如何获取有价值的用户反馈?
  6. 狂神说的全部笔记_聪明人的方格笔记术
  7. Flutter 打包问题 Could not resolve io.flutter:arm64_v8a_release
  8. 幼麟・闪影・奎特尔~2019不太冷!
  9. JavaScript 案例综合提升
  10. 设置日语输入法遇到的各种问题