主页 > imtoken下载钱包 > 空手套白狼? USDT虚假充值逻辑缺陷漏洞利用分析
空手套白狼? USDT虚假充值逻辑缺陷漏洞利用分析
前言
6月28日,慢雾科技发布USDT预警及漏洞分析,提醒各大交易所尽快暂停USDT充值功能,并自查代码是否存在该逻辑缺陷。 全文如下:
#防报##隐讯分析#交易所确认USDT充值交易成功时存在逻辑漏洞。 未在区块链上验证交易明细中valid字段的值是否真实,导致“虚假充值”,用户并未损失任何USDT,但USDT已成功充值至交易所,这些USDT可可以正常交易。
遗憾的是,笔者经过一番查找,发现网上很多资料都倾向于描述USDT的资金意义,而关于技术原理的文章却寥寥无几。 所以经过一番排查,笔者发现这个漏洞其实并不是USDT本身的问题,而是交易所方面的问题。 这个漏洞的成因可以说很简单,但是一旦被利用成功,后果就难以估计了。 在区块链开发中,各种低级错误usdt交易流程,如大写字母拼写错误导致的智能合约漏洞也数不胜数(如:),仅以此文为起点。 本文将回答以下问题:
什么是泰达币? USDT的转账是如何实现的? USDT转账/提现手续费支付给谁?
这个错误是怎么回事? 谁是受害者? 如何防守?
一、背景知识染币
在过去的一年里,ETH因为智能合约体系受到了广泛的关注。 您可以在5分钟内发行您的第一个代币,代币的发行和转让都依赖于智能合约。 ETH公链承载。 其实早在ETH诞生之前,大家都想在比特币主链上做点什么。 其中,提出了一个重要的概念:染色币。 具体来说,染色币是指在普通的比特币交易中附加一些信息,并借助比特币的底层基础设施进行记录。 但是,比特币官方开发团队(Core)对这种方法颇有争议,将用于存储信息的OP_RETURN字段突然从80字节减少到40字节()。
Omni Layer(以前称为 Mastercoin)
Omni Layer 也是一种染色货币。 其核心思想是将Omni协议层的数据以一定的方式写入比特币区块链。 目前,协议定义中有三种类型,A类、B类和C类。
1. A 类——这种方法利用了比特币中的每个地址本质上都是一个大小为 20 字节的二进制字符串这一事实。 将数据分成20个字节作为一组数据块,然后使用Base58编码作为目标地址发送。 当然,这些发送的 UTXO 将永远丢失。 同样使用这种技术的还有密码涂鸦。
2. B 类- 这种方法利用了比特币的多重签名,即多重签名特性。 发送一个 1 of n 的多重签名交易(即 n 个地址中的任何一个都可以通过签名来花费这个 UTXO)。 当前版本的 Omni Layer 协议最多支持 n = 3。
3. C类——该方法使用OP_RETURN操作码来存储数据。 目前基本上所有的Omni层交易都采用这种方式。 同样使用这项技术的还有 CoinSpark。
Omni Protocol允许用户发行属于自己的数字资产,其中资产编号31就是广泛使用的USDT。 日常生活中,用于发送USDT的交易类型为Simple Send。
以下是简单发送交易的定义。
Simple Send 是一种将 Omni Layer 中的特定数字资产从原始地址转移到目标地址的操作。 请注意,原始地址和目标地址均使用比特币地址。
可以看出,上述交易没有任何余额信息,也就是说,原地址的Omni Layer数字资产作为附加账本由Omni Core自身维护和验证。
Omni core的实现是遍历事务,自己维护一张理货图。 下图是Omni core正在逐一扫描建立账本。
以随机交易为例(b364bea8e4a9c9aeefda048df6f71dd62dc39d07a2286340e7c83c19b7ffd895):
输入(1) 0.00500000 BTC
1NJdUJGCJgZ4YEwthHD1skdHPsr5TxHbpq 0.00500000
源地址输出(3)0.00498879 BTC
地理编码失败 -(解码)0.00000000
1FoWyxwPXuj4C6abqwhjDWdz6D4PZgYRjA 0.00000546 传输目标
1NJdUJGCJgZ4YEwthHD1skdHPsr5TxHbpq 0.00498333 变化
它的 OP_RETURN 字段是 6f6d6e69000000000000001f0000001ac68eac4b
6f6d6e69 0000 0000 0000001f 0000001ac68eac4b
6f6d6e69 => 全向
0000 => 版本:0
0000 => 交易类型:简单发送 (0)
0000001f = 31 => 货币:USDT
0000001ac68eac4b = 115000388683 = 1150.00388683 => 转账金额
与 Omni 浏览器的内容一致。
Omni 浏览器中的 Raw Data 是 Omni Core 自身扫描比特币区块链并重构账本后输出的内容。 其中就有我们今天的主角有效。
2. 漏洞分析与实战
从背景知识我们可以看出,余额的验证其实是通过客户端进行的,但遗憾的是,与比特币不同的是,Omni Layer 没有 UTXO 机制,导致交易无效,可以广播。
正常的转账流程如下:
用户发起一笔 USDT 转账。
Omni Layer 的正常实现会在客户端生成交易。
客户端广播交易。
比特币区块链确认交易。
交易所确认交易数量足够。
进交流。
恶意攻击流程如下:
黑客发起恶意转账。
黑客重新编译客户端,绕过余额检查,或以其他方式生成恶意交易。
黑客广播恶意交易。
比特币区块链确认交易。
交易所确认交易数量充足,但未核实交易的合法性。
进交流。
黑客撤回资产。
以下情况会导致非法交易状态:
地址被冻结。
交易类型不允许。 (目前只有当 property = 0 时才会发生这种情况,即比特币)
交易金额超过限制,或小于零。
交易资产无效。
余额不足。
交易合法性的定义在omnicore/src/monicore/tx.cpp的CMPTransaction::logicMath_SimpleSend中。
让我们自己构建一个恶意交易。
为了方便起见,使用了 Electrum 轻节点钱包。 准备工具:
1. 余额较小的比特币钱包
2. Simple Send的原始tx
3. #TX
步:
首先使用 Electrum 发送交易,并写入一个随机的目标地址。
单击预览交易以复制未签名的原始交易。
打开工具 3
粘贴原始交易并复制 JSON 交易。
在out中添加以下字段
然后粘贴回 JSON,粘贴回原始交易,签署广播(工具 -> 加载交易 -> 从文本),就完成了。
USDT凭空产生。
当然usdt交易流程,交易之后会被判定为无效。
三、总结与反思
本文首先分析了USDT的基础架构,然后讨论了漏洞产生的原因,最后,本文重现了攻击场景。
其实造成这个逻辑漏洞的主要原因是交易所没有处理好。 面对这种与金钱有关的事情,小心点总是好的。
Tether 还在以太坊上发行了基于 ERC20 的 USDT。 不知道会不会出现类似的问题。