查看原文
其他

USDT 虚假转账安全⻛险分析 | 2345 新科技研究院区块链实验室

2345新科技研究院 慢雾科技 2019-09-10

本文由「慢雾区」知识星球成员 Warberg@2345 新科技研究院区块链实验室 原创


已授权「慢雾区」公众号发布


近⽇,2345 新科技研究院区块链实验室观测到⼀起疑似盗取交易所 USDT 代币的攻击⾏为,攻击者利⽤交易所对 USDT 交易转账的判断逻辑缺陷,恶意构造虚假转账盗取交易所代币,如下图:



背景知识


  1. USDT 是基于 Bitcoin 区块的 OMNI 协议[1]资产类型,利⽤ Bitcoin 的 OP_RETURN 承载相关交易数据;

  2. Bitcoin 本⾝并不会校验 OP_RETURN 数据的“合法性”,可以是任意数据;

  3. Bitcoin 交易当区块确认数达到 6 的时候,就会被 Bitcoin 节点承认;

  4. 那么问题来了,USDT 的交易在 OMNI 的节点上如何被确认?我们继续来看。


实验室的同事们扫描了 Bitcoin 区块中的 USDT 交易数据,找到了⼀笔⽆效的交易:


1b5c80f487d2bf8b69e1bbba2b1979aacb1aca7a094c00bcb9abd85f9af738ea(https://omniexplorer.info/search/1b5c80f487d2bf8b69e1bbba2b1979aacb1aca7a094c00bcb9abd85f9af738ea)


根据 omniexplorer ⽹站(https://omniexplorer.info/)提供的 api(https://api.omniexplorer.info/v1/transaction/tx/1b5c80f487d2bf8b69e1bbba2b1979aacb1aca7a094c00bcb9abd85f9af738ea),我们可以看到这笔交易的具体信息如下


  1. {

  2.    "amount": "28.59995822",

  3.    "block": 502358,

  4.    "blockhash": "0000000000000000005968fa48c49d7c4fb2363369d59db82897853fd937c71a",

  5.    "blocktime": 1514985094,

  6.    "confirmations": 27963,

  7.    "divisible": true,

  8.    "fee": "0.00200000",

  9.    "invalidreason": "Sender has insufficient balance",

  10.    "ismine": false,

  11.    "positioninblock": 301,

  12.    "propertyid": 31,

  13.    "propertyname": "TetherUS",

  14.    "referenceaddress": "1Po1oWkD2LmodfkBYiAktwh76vkF93LKnh",

  15.    "sendingaddress": "18DmsHjHU6YM2ckFzub4pBneD8QXCXRTLR",

  16.    "txid": "1b5c80f487d2bf8b69e1bbba2b1979aacb1aca7a094c00bcb9abd85f9af738ea",

  17.    "type": "Simple Send",

  18.    "type_int": 0,

  19.    "valid": false,//注意这

  20.    "version": 0

  21. }



https://github.com/OmniLayer/omnicore/blob/v0.3.0/src/omnicore/tx.cpp#L1012


上⾯ CMPTransaction::logicMath_SimpleSend 这个⽅法,会是 Simple Send 交易类型最终会调⽤的逻辑。


通过上⾯标注的来看,OMNI 内部有⾃⼰的⼀套基于地址的记账模型,通过地址可以获取地址的余额,它会把发送者当前的余额和发送的⾦额做⼀个对⽐,如果余额⼩于要发送的的⾦额,就会报余额不⾜,那么这笔交易就会因为余额不⾜⽽⽆效,就会给 valid 字段设置成 false

 

总结⼀下,如果⼀笔 USDT 的交易合法的,要⾄少满⾜以下 2 个条件:


  1. 要通过⽐特币的交易来构造,要符合⽐特币的余额验证(BTC)及交易规则验证

  2. 要通过 USDT ⾃⼰的余额(USDT)验证


另外,根据实验室其他同事的研究结果来看,被 USDT 冻结的地址发起的交易也会被标记为⽆效交易。


https://omniexplorer.info/address/3MbYQMMmSkC3AgWkj9FMo5LsPTW1zBTwXL



查看该冻结交易:https://omniexplorer.info/tx/203e932783961d986bccb29deed2b4084fa6fb9d1e3cda8c58c705f2a5fb4c68


攻击过程分析


综合钱包转账⾏为以及相关技术资料,推测攻击⾏为可能为:


  1. 向交易所钱包构造并发起⽆效(虚假)转账交易;

  2. 由于逻辑判断缺陷交易所将⽆效交易⼊账并计⼊到⽤户在交易所的资⾦账户;

  3. ⽤户发起提币;

  4. 交易所处理⽤户提币将币打到⽤户⾃⼰钱包地址;

  5. ⽤户⾃⼰充币环节 USDT 没有任何损失,提币环节交易所把⾃⼰真实的 USDT 币打给⽤户,造成交易所损失。


影响态势


实验室的同事们跟踪⼀例疑似恶意攻击者的钱包地址:16k5MgZHm2yxiKzrdeaY2vmn13xSSu5xg6


通过查询该钱包地址的交易记录发现该攻击者仍然在持续的构造虚假交易,推测该攻击者很有可能已经从某些交易所⾮法获利。


随着区块扫描的深⼊更多的疑似恶意钱包地址被发现。


防御建议


  1. 交易所⾃查 USDT 处理逻辑,⽴即安排功能下线修正并且排查历史 USDT 交易记录;

  2. 引⼊专业代码审计,提升代码的健壮性;

  3. 提升开发⼈员对于区块链技术的基本认知,避免错误的认知导致错误的结果;

  4. 提升交易所整体⻛险控制流程,对于疑似⻛险交易予以拦截。

 

进⼀步思考


数字币交易所如⾬后春笋,但是代码在上线前可能并没有做过专业审计,相关开发⼈员也没有经过专业培训。千⾥之堤毁于蚁⽳,⼀个⼩⼩的问题或者⼀时的疏忽⼤意可能造成巨⼤的损失,这个问题⾜以引以为戒。


引⽤链接:

1. https://github.com/OmniLayer/spec





    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存