主页 > imtoken下载钱包 > 空手套白狼? USDT虚假充值逻辑缺陷漏​​洞利用分析

空手套白狼? USDT虚假充值逻辑缺陷漏​​洞利用分析

imtoken下载钱包 2023-10-05 05:13:18

前言

6月28日,慢雾科技发布USDT预警及漏洞分析,提醒各大交易所尽快暂停USDT充值功能,并自查代码是否存在该逻辑缺陷。 全文如下:

#防报##隐讯分析#交易所确认USDT充值交易成功时存在逻辑漏洞。 未在区块链上验证交易明细中valid字段的值是否真实,导致“虚假充值”,用户并未损失任何USDT,但USDT已成功充值至交易所,这些USDT可可以正常交易。

遗憾的是,笔者经过一番查找,发现网上很多资料都倾向于描述USDT的资金意义,而关于技术原理的文章却寥寥无几。 所以经过一番排查,笔者发现这个漏洞其实并不是USDT本身的问题,而是交易所方面的问题。 这个漏洞的成因可以说很简单,但是一旦被利用成功,后果就难以估计了。 在区块链开发中,各种低级错误usdt交易流程,如大写字母拼写错误导致的智能合约漏洞也数不胜数(如:),仅以此文为起点。 本文将回答以下问题:

什么是泰达币? USDT的转账是如何实现的? USDT转账/提现手续费支付给谁?

这个错误是怎么回事? 谁是受害者? 如何防守?

一、背景知识染币

在过去的一年里,ETH因为智能合约体系受到了广泛的关注。 您可以在5分钟内发行您的第一个代币,代币的发行和转让都依赖于智能合约。 ETH公链承载。 其实早在ETH诞生之前,大家都想在比特币主链上做点什么。 其中,提出了一个重要的概念:染色币。 具体来说,染色币是指在普通的比特币交易中附加一些信息,并借助比特币的底层基础设施进行记录。 但是,比特币官方开发团队(Core)对这种方法颇有争议,将用于存储信息的OP_RETURN字段突然从80字节减少到40字节()。

okex里usdt怎么转成usdt_交易猫交易流程截图_usdt交易流程

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。

以下是简单发送交易的定义。

usdt交易流程_交易猫交易流程截图_okex里usdt怎么转成usdt

Simple Send 是一种将 Omni Layer 中的特定数字资产从原始地址转移到目标地址的操作。 请注意,原始地址和目标地址均使用比特币地址。

可以看出,上述交易没有任何余额信息,也就是说,原地址的Omni Layer数字资产作为附加账本由Omni Core自身维护和验证。

Omni core的实现是遍历事务,自己维护一张理货图。 下图是Omni core正在逐一扫描建立账本。

usdt交易流程_交易猫交易流程截图_okex里usdt怎么转成usdt

以随机交易为例(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 浏览器的内容一致。

okex里usdt怎么转成usdt_交易猫交易流程截图_usdt交易流程

Omni 浏览器中的 Raw Data 是 Omni Core 自身扫描比特币区块链并重构账本后输出的内容。 其中就有我们今天的主角有效。

usdt交易流程_交易猫交易流程截图_okex里usdt怎么转成usdt

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 发送交易,并写入一个随机的目标地址。

单击预览交易以复制未签名的原始交易。

okex里usdt怎么转成usdt_交易猫交易流程截图_usdt交易流程

打开工具 3

粘贴原始交易并复制 JSON 交易。

在out中添加以下字段

okex里usdt怎么转成usdt_usdt交易流程_交易猫交易流程截图

然后粘贴回 JSON,粘贴回原始交易,签署广播(工具 -> 加载交易 -> 从文本),就完成了。

usdt交易流程_交易猫交易流程截图_okex里usdt怎么转成usdt

USDT凭空产生。

当然usdt交易流程,交易之后会被判定为无效。

usdt交易流程_okex里usdt怎么转成usdt_交易猫交易流程截图

三、总结与反思

本文首先分析了USDT的基础架构,然后讨论了漏洞产生的原因,最后,本文重现了攻击场景。

其实造成这个逻辑漏洞的主要原因是交易所没有处理好。 面对这种与金钱有关的事情,小心点总是好的。

Tether 还在以太坊上发行了基于 ERC20 的 USDT。 不知道会不会出现类似的问题。